win的用法win10 deskscapet的用法

介绍TextToSpeech在Android中的用法
TextToSpeech简称&TTS,是Android&1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中,增强用户体验。
在讲解TTS API和将这项功能应用到你的实际项目中的方法之前,先对这套TTS引擎有个初步的了解。
对TTS资源的大体了解:
TTS engine依托于当前AndroidPlatform所支持的几种主要的语言:English、French、German、Italian和Spanish五大语言(暂时没有我们伟大的中文,至少Google的科学家们还没有把中文玩到炉火纯青的地步,先易后难也是理所当然。)TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在TTS中可以分别输出美式和英式两种不同的版本(由此看出Google的做事风格真够细致,而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了)。
能支持如此庞大的数据量,TTS 引擎对于资源的优化采取预加载的方法。根据一系列的参数信息(参数的用法将在后边有详细的介绍)从库中提取相应的资源,并加载到当前系统中。
尽管当前大部分加载有Android操作系统的设备都通过这套引擎来提供TTS功能,但由于一些设备的存储空间非常有限而影响到TTS无法最大限度的发挥功能,算是当前的一个瓶颈。为此,开发小组引入了检测模块,让利用这项技术的应用程序或者游戏针对于不同的设备可以有相应的优化调整,从而避免由于此项功能的限制,影响到整个应用程序的使用。比较稳妥的做法是让用户自行选择是否有足够的空间或者需求来加载此项资源,下边给出一个标准的检测方法:
1.Intent checkIntent = new Intent();
2.checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
3.startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
如果当前系统允许创建一个 “android.speech.tts.TextToSpeech” 的Object, 说明已经提供TTS功能的支持,将检测返回结果中给出“CHECK_VOICE_DATA_PASS&” 的标记。如果系统不支持这项功能,那么用户可以选择是否加载这项功能,从而让设备支持输出多国语言的语音功能“Multi-lingual
Talking”。“ACTION_INSTALL_TTS_DATA” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装,下边是实现这一过程的完整代码
01.private TextToSpeech mT
02.protected void onActivityResult(
03.& && &&&int requestCode, int resultCode, Intent data) {
04.& & if (requestCode == MY_DATA_CHECK_CODE) {
05.& && &&&if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
06.& && && && &// success, create the TTS instance
07.& && && && &mTts = new TextToSpeech(this, this);
08.& && &&&} else {
09.& && && && &// missing data, install it
10.& && && && &Intent installIntent = new Intent();
11.& && && && &installIntent.setAction(
12.& && && && && & TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
13.& && && && &startActivity(installIntent);
14.& && &&&}
TextToSpeech实体和OnInitListener都需要引用当前Activity的Context作为构造参数。OnInitListener()的用处是通知系统当前TTS Engine已经加载完成,并处于可用状态。
根据需求设置语言参数:
早在Google I/O大会上,官方给出了一段关于应用这项功能的鲜活体验,将翻译结果直接通过五种不同国家语言的语音输出。加载语言的方法非常简单:
1.mTts.setLanguage(Locale.US);
上边代码表示当前TTS实体加载美式英语。其参数并没有指示某种语言的名称,而是利用国家代码来表示,这样做的好处是不但可以确定语言的选择,而且可以根据地区的不同而有所区别。例如:英语作为最广泛被应用的语种,在多个不同的地区都有一定的差别。判断当前系统是否支持某个地区的语言资源,可以通过调用isLanguageAvailable()方法的返回值,根据返回值的描述来选择正确的处理方式。让应用某些绚丽功能的应用程序更加健壮,这个是贯穿整个开发过程都要考虑的技术环节。下边是一些应用实例
1.mTts.isLanguageAvailable(Locale.UK))
2.mTts.isLanguageAvailable(Locale.FRANCE))
3.mTts.isLanguageAvailable(new Locale(&spa&, &ESP&)))
如果返回值是 “&TextToSpeech.LANG_COUNTRY_AVAILABLE&” 说明所选择的地区被包含在当前TTS系统中。如果系统中已经创建了TTS实体,那么可以利用isLanguageAvailable()方法来替代 Start “ACTION_CHECK_TTS_DATA&”
intent 检测。当无法找到任何可用资源匹配所指定的参数时,将会返回 “TextToSpeech.LANG_MISSING_DATA&”的结果。下边给出另外两个返回其它不同状态信息的例子:
1.mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
2.mTts.isLanguageAvailable(new Locale(&spa&))
两个语句的返回值均为 “&TextToSpeech.LANG_AVAILABLE&” 。第一个是检测当前系统是否支持加拿大法语,由于系统在资源库中无法找到这个地区的法语分支,其含义是仅支持这项语言(法语),而不支持当前地区的语言分支。
另外,相比于上面强制用户应用预定的语音设置,更加提倡利用Locale.getDefault()方法根据用户默认的地区设置来选择合适的语言库。
执行Speak的具体方法:
根据上边的介绍,基本实现了TextToSpeech的初始化和参数配置。下面是一个有关闹钟的应用实例,利用Speak()方法可以直接在应用程序中发挥强大的语音功能。没错,用起来就是这么简单:
1.String myText1 = &This Translation is &;
2.String myText2 = &I hope so, because it's time to wake up.&;
3.mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
4.mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
TTS Engine的工作原理:
每个独立的应用程序都可以单独创建一个TTS实体,而他们需要执行的语音消息列队(Queue)都统一由TTS Engine管理和语音合成。
名词解释:
synthesize&['s?nθ?sa?z] DJ ['s?nθ?'sa?z] KK:to produce sounds, music or speech using electronic equipment (音响)合成
utterances&['?t?r?ns] DJ ['?t?r?ns] KK&:说话方式,语音/语调。
每个独立的TTS实例管理语音消息列队请求的优先级和顺序等。当引用 “TextToSpeech.QUEUE_FLUSH” 调用Speak()方法时,会中断当前实例正在运行的任务(也可以理解为清除当前语音任务,转而执行新的列队任务)。引用 “TextToSpeech.QUEUE_ADD”标签的发音任务将被添加到当前任务列队之后。
为语音任务关联Stream Type:
在Android操作系统中所有的Audio Stream任务都是通过AudioManager类来实现,而它会针对不同的Stream Type来改变语音的播放模式。StreamType可以理解为语音的播放属性,这个属性是用户根据自己的需要在系统中配置的应用方案。如果将语音任务都清楚的分门别类,可以方便的统一管理相同类别任务的属性。基于上一个Alarm
Clock例子的基础上,将Speak()方法的最后一个Null参数替换成具有实际含义的数值。这个参数的类型是HashMap,如果希望将当前的Stream Type设置为系统中Alarm类型,对上一个例子稍作改动:
1.HashMap myHashAlarm = new HashMap();
2.myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
3.& && &&&String.valueOf(AudioManager.STREAM_ALARM));
4.mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
5.mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);
应用语音功能的Completion Callback:
TTS中的Speak()的是异步调用,无论应用QUEUE_FLUSH&或者QUEUE_ADD作为参数都可以通过定义Listener监听当前任务的完成状态。可以利用这个方法追加Speak()执行之后的一些额外操作。下接下来的例子中,当完成第二次Speak()方法调用之后,利用OnUtteranceCompletedListener接口来调用其它方法:
1.mTts.setOnUtteranceCompletedListener(this);
2.myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
3.& && &&&String.valueOf(AudioManager.STREAM_ALARM));
4.mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
5.myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
6.& && &&&&end of wakeup message ID&);
7.// myHashAlarm now contains two optional parameters
8.mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);
下边是定义Listener的代码,类似与监听按钮或者其它View Events的方法。在这里将会把Speak()中HashMap参数传进Listener中,作为条件的判断依据:
1.public void onUtteranceCompleted(String uttId) {
2.& & if (uttId == &end of wakeup message ID&) {
3.& && &&&playAnnoyingMusic();
“烘焙”当前实时的语音数据:
看到烘焙两个字,就会让人联想到香喷喷的面包。软件开发要关注于是否可以最大限度的实现资源的复用,特别是针对资源有限的手机应用平台。那么对于TTS这么奢侈的应用如何才能更高效的使用资源呢?这次一起来体验比烘焙面包更加让人激动的功能,将TTS
Engine输出的Audio Stream作为永久的音频文件保存在当前的存储空间中(SDCard)。这样可以对需要重复播放的某些语音内容实现快速的回放功能,从而实现国际倡导的“减排”目的,能省就省吧!在下边的例子用通过TTS的synthesizeToFile方法,将合成的语音Stream保存在参数所指定的地址中。
1.HashMap myHashRender = new HashMap();
2.String wakeUpText = &Are you up yet?&;
3.String destFileName = &/sdcard/myAppCache/wakeUp.wav&;
4.myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
5.mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);
当完成以上操作之后会收到系统的完成通知,同时可以像其它音频资源一样,通过android.media.MediaPlayer方法来播放。但这有悖于TextToSpeech的应用流程,可以将刚刚输出的语音资源通过addSpeech()的方法将其语音和文字描述一同存储于TTS库中。
1.mTts.addSpeech(wakeUpText, destFileName);
在当前的TTS Instance中,任何利用Speak()方法执行相同内容的调用都将复用刚刚所生成的音频文件。如果资源丢失或者SDCard等存储设备移除,那么系统将再次通过TTS Engine合成所指定的语音内容。
1.mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);
当确定应用程序不再需要TTS的相关功能后,可以在Activity的OnDestroy()方法中调用shutDown()释放当前TTS实体所占用的资源。
想必在你的脑袋中已经冒出好多可以很好利用这个功能的Idea!那么现在就停止想象,开始付诸于行动吧!无论是给手机用户带来方便,或是提升游戏体验等。Let’s move!
查看原文:Android官方Blog
更多相关文章
Android中SQLite用法 1.SQLite简介 SQLite一个非常流行的轻量级的嵌入式关系型数据库,它在2000年由D. Richard Hipp 发布,它支持SQL语言,并且只用很少的内存就有很好的性能,它可以减少应用程序管理数据的开销,SQLite可移植性好.很容易使用.很小.高效而且 ...
在android应用开发中,作为配置环境的preferences,用到的地方颇多,下面我带大家来详细讲解下android中SharedPreferences的用法.先上图看下配置画面的效果吧. 上图是preferences页面的效果图. 点击设置IP地址后跳出设置对话框: android 为了方便管 ...
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(ListView,GridView)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Ad ...
一.Handler的定义:
Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中来接收.处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,And ...
1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences 保存数据,其背后是用xml文件存放数据,文件存放在/data/ ...
Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle),最后通过引擎(Context的Activity)来启动.
1.显示网页: Uri ...
在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. Timer是一个普通的类,其中有几个重要的方法:而TimerTask则是一个抽象类,其中有一个抽象方法run() ...
转自:http://blog.csdn.net/zuolongsnail/article/details/8168689
在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和Time ...
1, it will print out exception, but still can convert the audio 2, it works in windows not linux, need use t ...
异地部署(地理分布式) 完成了上述架构建设之后,我们的系统是否就已经足够强大了呢?答案当然 ...
有几本关于这方面的书,下载了看看,会对计算机系统有个更好的理解.
Intel Architecture Software Developer Manual
Basic Architecture I ...
/* BFS 遍历所有状态,当寻找到要转到的状态,输出BFS的层数,即答案,否则输出 -1: 注意: 剪枝: 当BFS到某一种状态时,若此状态已在前面所寻找的状态中出现过,则不用再继续从此状态BFS了,因为此状态所能 ...
time:3 0 以下是对计算机技术的一点新的小心得: 计算机听人话,是因为有算法约束,让一切紧然有序.同样,人没工作,就会无序,社会便混乱,如同程序空指针异常,系统就会有BUG.而NAT10N ...
Right-BICEP Right 首先,我们需要知道什么是正确的.这是最基本的. Boundary边界 是否所有的边界条件都正确? Correct Conformance一致性 结果值是否和期望值一致. Order ...
/* 说明: 1.本次游戏实例是&cocos2d-x游戏开发之旅&上的最后一个 ...
从jq api手册摘过来的内容,index这个方法在写 tab silder 之类的组件还是比较有用的说. js没有传统的函数重载的概念,但是根据传入参数的不同,js的函数可以完成不同的功能,也可说是重载的思想吧 如 ...
Integrating D3 with Angular can be very simple. In this lesson, you will learn basic integration as well as
上周时候,因为一时手贱,生产上的数据被我给delete掉了. 用的是delete语句,然后很迅速的还给commit了. 于是---&杯具了. ---------------------------------- ...先来讲讲wc.cbWndExtra这个成员,这个成员指定了系统为每个窗口分配多少字节的额外空间。创建窗口后,如果想要使用这段额外空间,可以使用以下六个函数之一:
GetWindowWord(hWnd, n)& // 从第n个字节开始,读取两个字节
GetWindowLong(hWnd, n)& // 从第n个字节开始,读取四个字节
GetWindowLongPtr(hWnd, n) // 从第n个字节开始读取。如果系统是32位,则读取4个字节;如果系统是64位,则读取8个字节。(这个一般用来读取指针变量)
SetWindowWord(hWnd, n, value)
SetWindowLong(hWnd, n, value)
SetWindowLongPtr(hWnd, n, value)
还有另外6个类似的函数,是以GetClass或SetClass开头的,那些函数是用来操作wc.cbClsExtra为窗口类分配的空间的,但是传入的参数仍然是hWnd,而非窗口类的名称或指针,也就是根据hWnd来确定是哪一个窗口类。
例如,让wc.cbWndExtra=3,也就是为每个窗口分配3个字节的额外空间。注册窗口类后创建窗口,然后执行:
char str[100];
SetWindowWord(hWnd, 0, 2016); // 语句1
a = GetWindowWord(hWnd, 0); // 语句2
b = GetWindowWord(hWnd, 1); // 语句3
sprintf_s(str, &a=%d, b=%d&, a,b);
MessageBoxA(hWnd, str, &额外空间&,MB_ICONINFORMATION);
运行程序,可以看到a的值为2016,b的值为7。
创建窗口时分配的3个字节,初始值都是0:
语句1把第0个字节和第1个字节分别设为了2016的低八位和高八位,因为2016对应的二进制数是[100000],所以这3个字节变成了:
语句2的作用是从第0个字节开始,读取两个字节,也就是读取第0和第1个字节,然后赋给变量a,刚好就是2016。
语句3是从第1个字节开始读两个字节赋给b,所以就把第1个字节赋给b的低位,第2个字节赋给b的高位。
b = [000111] = 7
如果执行GetWindowWord(hWnd, 2)会怎么样呢?这条语句的作用是同时读取第2个字节和第3个字节,但是因为根本就没有第3个字节,所以这个函数会执行失败,返回0。也就是说,只要读取时有一个字节不存在,那么整个函数就会读取失败。
因此,cbClsExtra和cbWndExtra都只能设置为0或者大于等于2的数,如果设置为1,那么即便是分配了空间也无法使用。
根据这一点,我们就可以编写在额外空间中读写数据块的函数,然后把字符串或者一个结构体变量放入这段额外空间中。
下面的示例程序将一个struct student结构体写入了这段额外空间中。为了确保函数读取最后一个字节时不会出错,设置空间分配大小时使用了EXTRA_BYTES宏将奇数化为偶数。
#include &stdio.h&
#include &tchar.h&
#include &Windows.h&
struct student
&& &char id[13];
&& &char name[10];
char *hex = &ABCDEF&;
// 奇数化为偶数
#define EXTRA_BYTES(n) (((n + 1) && 1) && 1)
// 写入字符串。end为BOOL类型,表示是否写入字符串最后的'\0'
#define extra_puts(hWnd, dest, str, end) extra_write(hWnd, dest, str, strlen(str) + end)
// 获取分配的额外空间大小
#define extra_size(hWnd) GetClassLong(hWnd, GCL_CBWNDEXTRA)
// 读取字符,src为额外空间的第几字节
char extra_getc(HWND hWnd, int src)
&& &if (src % 2 == 0)
&& &&& &word = GetWindowWord(hWnd, src);
&& &&& &return word & 0
&& &&& &word = GetWindowWord(hWnd, src - 1);
&& &&& &return word && 8;
// 读取\0结束的字符串
void extra_gets(HWND hWnd, int src, void *buffer)
&& &for (i = -(src % 2); ; i += 2)
&& &&& &value = GetWindowWord(hWnd, src + i);
&& &&& &if (i != -1)
&& &&& &&& &ch = *(((BYTE *)buffer) + i) = value & 0
&& &&& &&& &if (ch == '\0')
&& &&& &&& &&& &
&& &&& &ch = *(((BYTE *)buffer) + i + 1) = value && 8;
&& &&& &if (ch == '\0')
&& &&& &&& &
// 写入一个字符
void extra_putc(HWND hWnd, int src, char ch)
&& &if (src % 2 == 0)
&& &&& &word = GetWindowWord(hWnd, src);
&& &&& &SetWindowWord(hWnd, src, (word & 0xff00) + ch);
&& &&& &word = GetWindowWord(hWnd, src - 1);
&& &&& &SetWindowWord(hWnd, src - 1, (word & 0x00ff) + (ch && 8));
// 读取数据块(例如结构体)
void extra_read(HWND hWnd, int src, void *buffer, int n)
&& &for (i = -(src % 2); i & i += 2)
&& &&& &// dest+i始终为偶数
&& &&& &value = GetWindowWord(hWnd, src + i);
&& &&& &if (i != -1)
&& &&& &&& &*(((BYTE *)buffer) + i) = value & 0
&& &&& &if (i + 1 != n)
&& &&& &&& &*(((BYTE *)buffer) + i + 1) = value && 8;
// 写入数据块
void extra_write(HWND hWnd, int dest, void *data, int n)
&& &for (i = -(dest % 2); i & i += 2)
&& &&& &// dest+i始终为偶数
&& &&& &if (i == -1)
&& &&& &&& &value = GetWindowWord(hWnd, dest - 1) & 0 // 读取前一个字节
&& &&& &else
&& &&& &&& &value = *(((BYTE *)data) + i);
&& &&& &if (i + 1 == n)
&& &&& &&& &value += GetWindowWord(hWnd, dest + i) & 0xff00; // 读取后一个字节
&& &&& &else
&& &&& &&& &value += *(((BYTE *)data) + i + 1) && 8;
&& &&& &SetWindowWord(hWnd, dest + i, value);
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
&& &// 这里的hWnd的值和主函数里的hWnd是完全相同的
&& &char *str, *pS
&& &char str2[100];
&& &int size, i,
&& &PAINTSTRUCT
&& &switch (uMsg)
&& &case WM_DESTROY:
&& &&& &PostQuitMessage(0);
&& &case WM_PAINT:
&& &&& &hdc = BeginPaint(hWnd, &ps);
&& &&& &// 输出全部额外空间的内存情况
&& &&& &size = extra_size(hWnd);
&& &&& &pStr = str = new char[size * 4];
&& &&& &for (i = 0; i & i += 2)
&& &&& &&& &value = GetWindowWord(hWnd, i);
&& &&& &&& &*pStr++ = hex[(value && 4) & 0x0f];
&& &&& &&& &*pStr++ = hex[value & 0x0f];
&& &&& &&& &*pStr++ = ' ';
&& &&& &&& &*pStr++ = hex[(value && 12) & 0x0f];
&& &&& &&& &*pStr++ = hex[(value && 8) & 0x0f];
&& &&& &&& &*pStr++ = ' ';
&& &&& &*pStr = '\0';
&& &&& &GetClientRect(hWnd, &rect);
&& &&& &DrawTextA(hdc, str, strlen(str), &rect, DT_WORDBREAK);
&& &&& &delete[]
&& &&& &// 输出结构体的内容
&& &&& &extra_read(hWnd, 0, &stu, sizeof(struct student));
&& &&& &sprintf_s(str2, sizeof(str2), &学号: %s&&& 姓名:%s&&& 年龄:%d&, stu.id, stu.name, stu.age);
&& &&& &TextOutA(hdc, 0, 100, str2, strlen(str2));
&& &&& &EndPaint(hWnd, &ps);
&& &default:
&& &&& &return DefWindowProc(hWnd, uMsg, wParam, lParam);
&& &return FALSE;
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
&& &WNDCLASS
&& &wc.cbClsExtra = 0;
&& &wc.cbWndExtra = EXTRA_BYTES(sizeof(struct student)); // 确保分配的空间为偶数
&& &wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
&& &wc.hCursor = LoadCursor(NULL, IDC_ARROW);
&& &wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
&& &wc.hInstance = hI
&& &wc.lpfnWndProc = WndP
&& &wc.lpszClassName = TEXT(&Example Window&);
&& &wc.lpszMenuName = NULL;
&& &wc.style = CS_HREDRAW | CS_VREDRAW;
&& &RegisterClass(&wc);
&& &SetRect(&rect, 0, 0, 640, 480);
&& &AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
&& &HWND hWnd = CreateWindow(wc.lpszClassName, TEXT(&Example&), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, hInstance, NULL);
&& &if (!hWnd)
&& &&& &return 1;
&& &ShowWindow(hWnd, nCmdShow);
&& &strcpy_s(stu.id, &&);
&& &strcpy_s(stu.name, &张三&);
&& &stu.age = 15;
&& &extra_write(hWnd, 0, &stu, sizeof(struct student));
&& &// 一定要在额外空间写入数据后再刷新窗口,不然窗口显示时只能看到一串0
&& &// UpdateWindow立即执行WM_PAINT,执行完了函数才返回
&& &UpdateWindow(hWnd);
&& &while (GetMessage(&msg, NULL, 0, 0))
&& &&& &TranslateMessage(&msg);
&& &&& &DispatchMessage(&msg);
&& &return msg.wP
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46次
排名:千里之外& 记住密码
由于 windest 的隐私设置,你不能访问当前内容下次自動登錄
現在的位置:
& 綜合 & 正文
StretchBlt函數用法。
StretchBlt
  函數功能:函數從源矩形中複製一個點陣圖到目標矩形,必要時按目前目標設備設置的模式進行圖像的拉伸或壓縮。  函數原型:BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);  參數:  hdcDest:指向目標設備環境的句柄。  nXOriginDest:指定目標矩形左上角的X軸坐標,按邏輯單位表示坐標。  nYOriginDest:指定目標矩形左上角的Y軸坐標,按邏輯單位表示坐標。  nWidthDest:指定目標矩形的寬度,按邏輯單位表示寬度。  nHeightDest:指定目標矩形的高度,按邏輯單位表示高茺。  hdcSrc:指向源設備環境的句柄。  nXOriginSrc:指向源矩形區域左上角的X軸坐標,按邏輯單位表示坐標。  nYOriginSrc:指向源矩形區域左上角的Y軸坐標,按邏輯單位表示坐標。  nWidthSrc:指定源矩形的寬度,按邏輯單位表示寬度。  nHeightSrc:指定源矩形的高度,按邏輯單位表示高度。  dwRop:指定要進行的光柵操作。光柵操作碼定義了系統如何在輸出操作中組合顏色,這些操作包括刷子、源點陣圖和目標點陣圖等對象。參考BitBlt可了解常用的光柵操作碼列表。  返回值:如果函數執行成功,那麼返回值為非零,如果函數執行失敗,那麼返回值為零。Windows NT:若想獲得更多的錯誤信息,請調用GetLastError函數。
&&&&推薦文章:
【上篇】【下篇】}

我要回帖

更多关于 win10 deskscape 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信