打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Windows程序设计零碎整理【1】-- 字符处理与消息机制
1.
要定义包含一个宽字符的变量,可使用下面的语句:

wchar_t c = 'A' ;
       
变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在内存中。如果检查Unicode文字的计算机储存应注意这一点。

您还可定义指向宽字符串的指针:

wchar_t * p = L"Hello!" ;
       
注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字符串按宽字符保存-即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字符串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。


2.
通用类型TCHAR 、 PTCHAR
_T("...") TEXT("....")通用字符类型 (根据UNICODE宏是否定义代表不同) L"..."表示宽字符串


3.
typedef CHAR * PCHAR, * PSTR ;
PCHAR指向字符的指针,PSTR 指向字符串的指针,本质上是指向第一个字符的指针,所以二者本质上一样。主要是要理解后面这个,以及这种连续定义的方式。

4.
MessageBox也是个通用的函数,会根据UNICODE宏是否定义分别代表MessageBoxW及MessageBoxA

5.
Windows对C语言的标准输入和标准输出没有概念。但可以使用sprintf及sprintf系列中的其它函数来显示文字。这些函数除了将内容格式化输出到函数第一个参数所提供的字符串缓冲区以外,其功能与printfI相同。然后便可对该字符串进行操作(例如将其传给MessageBox)。

vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用于执行有多个参数的自订函数,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符缓冲区和一个格式字符串。第三个参数是指向格式化参数数组的指针。实际上,该指针指向在堆栈中供函数呼叫的变量。va_list、va_start和va_end宏(在STDARG.H中定义)帮助我们处理堆栈指针。
int sprintf (char * szBuffer, const char * szFormat, ...)
       
{
       
    int     iReturn ;
       
    va_list pArgs ;
       
    va_start (pArgs, szFormat) ;
       
    iReturn = vsprintf (szBuffer, szFormat, pArgs) ;
       
    va_end (pArgs) ;
       
    return iReturn ;
       
}


通用的wsprintf(最前面的w似乎代表的是Windows,不是wide) wsprintfA(ASCII) wsprintfW(宽字符)


6.
在Win32 API中,长指标和短指标(或者近程指标)没有区别。这只是16位Windows的遗物。
在Win32中near和long指标没有区别。


7.
更确切地说,窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。例如,所有Windows程序中的所有按钮均依据同一个窗口类别。这个窗口类别与一个处理所有按钮消息的窗口消息处理程序(位于Windows的动态链接库中)联结。


8.
Windows程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

TranslateMessage 转译某些键盘消息。
DispatchMessage 将消息发送给窗口消息处理程序。
PostQuitMessage 在消息队列中插入一个「退出程序」消息。

只要从消息队列中取出消息的message字段不为WM_QUIT(其值为0x0012),GetMessage就传回一个非零值。WM_QUIT消息将导致GetMessage传回0。

9.
在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。

10.
程序通常不直接呼叫窗口消息处理程序,窗口消息处理程序通常由Windows本身呼叫。通过呼叫SendMessage函数,程序能够直接呼叫它自己的窗口消息处理程序。

Windows程序所作的一切,都是响应发送给窗口消息处理程序的消息。这是概念上的主要难点之一,在开始写作Windows程序之前,必须先搞清楚。程序的所有实际动作均在窗口消息处理程序中发生。


11.
换句话说,消息循环和窗口消息处理程序不是并发执行的。当一个消息循环从其消息队列中接收一个消息,然后呼叫DispatchMessage将消息发送给窗口消息处理程序时,直到窗口消息处理程序将控制传回给Windows,DispatchMessage才能结束执行。

消息处理程序必须是可重入。在大多数情况下,这不会带来问题,但是程序写作者应该意识到这一点。例如,假设您在窗口消息处理程序中处理一个消息时设置了一个静态变量,然后呼叫了一个Windows函数。在这个函数传回时,您还能保证那个变数的值还是原来那个吗?难说--很可能您呼叫的Windows函数产生了另外一个消息,并且窗口消息处理程序在处理这个消息时改变了该变量的值。这也是在编译Windows程序时,有些编译最佳化选项必须关闭的原因之一。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
windows窗口的创建
windows消息机制
MFC消息映射机制详解
PostMessage(异步)和SendMessage(同步)的区别
字符串处理函数LEFT,从左侧开始去n个字符并返回
关于MFC框架程序中CWinApp::OnIdle
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服