📄 chap2_3.htm
字号:
</tr> <tr> <td WIDTH="16%"><span style="font-size: 9pt">WCHAR</span></td> <td WIDTH="84%"><span style="font-size: 9pt">说明一个16位的UNICODE字符,用来表示世界上所有已知的书写语言的符号</span></td> </tr> </table> <p> </p> <p> </p> <p><span style="font-size: 9pt">这里需要解释一下的是句柄。句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷、电话线路等。在Win32里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个4字节长的数据。无论它的本质是什么,句柄并不是一个真正意义上的指针。从构造上看,句柄是一个指针,尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进行的引用的位置。句柄的声明是这样的:</span></p> <p><span style="font-size: 9pt">typedef void *HANDLE</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,Windows引入了实例句柄。Windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。</span></p> <p><span style="font-size: 9pt">Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件、图标等系统资源。</span><b></p> <p><span style="font-size: 9pt">标识符命名</span></b></p> <p><span style="font-size: 9pt">在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。Microsoft采用匈牙利命名法来命名Windows API函数和变量。匈牙利命名法是由Microsoft的著名开发人员、Excel的主要设计者查尔斯·西蒙尼在他的博士论文中提出来的,由于西蒙尼的国籍是匈牙利,所以这种命名法叫匈牙利命名法。</span></p> <p><span style="font-size: 9pt">匈牙利命名法为C标识符的命名定义了一种非常标准化的方式,这种命名方式是以两条规则为基础的:</span></p> <p><span style="font-size: 9pt">1.标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。下表列出了常用的数据类型的标准前缀:</span></p> <p ALIGN="CENTER"><span style="font-size: 9pt">在Windows里定义数据类型的一些标准前缀</span></p> <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="557"> <tr> <td WIDTH="30%"><p ALIGN="CENTER"><span style="font-size: 9pt">前缀</span></td> <td WIDTH="70%"><p ALIGN="CENTER"><span style="font-size: 9pt">数据类型</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">c</span></td> <td WIDTH="70%"><span style="font-size: 9pt">字符(char)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">s</span></td> <td WIDTH="70%"><span style="font-size: 9pt">短整数(short)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">cb</span></td> <td WIDTH="70%"><span style="font-size: 9pt">用于定义对象(一般为一个结构)尺寸的整数</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">n</span></td> <td WIDTH="70%"><span style="font-size: 9pt">整数(integer)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">sz</span></td> <td WIDTH="70%"><span style="font-size: 9pt">以’\0’结尾的字符串</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">b</span></td> <td WIDTH="70%"><span style="font-size: 9pt">字节</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">i</span></td> <td WIDTH="70%"><span style="font-size: 9pt">int(整数)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">x</span></td> <td WIDTH="70%"><span style="font-size: 9pt">短整数(坐标x)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">y</span></td> <td WIDTH="70%"><span style="font-size: 9pt">短整数(坐标y)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">f</span></td> <td WIDTH="70%"><span style="font-size: 9pt">BOOL</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">w</span></td> <td WIDTH="70%"><span style="font-size: 9pt">字(WORD,无符号短整数)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">l</span></td> <td WIDTH="70%"><span style="font-size: 9pt">长整数(long)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">h</span></td> <td WIDTH="70%"><span style="font-size: 9pt">HANDLE(无符号int)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">m_</span></td> <td WIDTH="70%"><span style="font-size: 9pt">类成员变量</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">fn</span></td> <td WIDTH="70%"><span style="font-size: 9pt">函数(function)</span></td> </tr> <tr> <td WIDTH="30%"><span style="font-size: 9pt">dw</span></td> <td WIDTH="70%"><span style="font-size: 9pt">双字(DWORD,无符号长整数)</span></td> </tr> </table> <p> </p> <p><span style="font-size: 9pt">2.在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了源代码内那个对象的用途。比如,m_szStudentName表示一个学生名字的类成员变量,数据类型是字符串型。</span><b></p> <p><span style="font-size: 9pt">从16位的Win16 API迁移到Win32 API注意点</span></b></p> <p> </p> <p><span style="font-size: 9pt">1.数据类型字长的变化:</span></p> <p><span style="font-size: 9pt">我们编写一个小程序来说明Win32下的常见数据类型的字长:</span></p> <p><span style="font-size: 9pt">#include<windows.h></span></p> <p><span style="font-size: 9pt">#include<stdio.h></span></p> <p><span style="font-size: 9pt">void main(void)</span></p> <p><span style="font-size: 9pt">{</span></p> <p><span style="font-size: 9pt">printf("sizeof(int) is %d\n",sizeof(int));</span></p> <p><span style="font-size: 9pt">printf("sizeof(BYTE) is %d\n",sizeof(BYTE));</span></p> <p><span style="font-size: 9pt">printf("sizeof(WORD) is %d\n",sizeof(WORD));</span></p> <p><span style="font-size: 9pt">printf("sizeof(DWORD) is %d\n",sizeof(DWORD));</span></p> <p><span style="font-size: 9pt">printf("sizeof(LONG) is %d\n",sizeof(LONG));</span></p> <p><span style="font-size: 9pt">printf("sizeof(PVOID) is %d\n",sizeof(PVOID));</span></p> <p><span style="font-size: 9pt">printf("sizeof(LPVOID) is %d\n",sizeof(LPVOID));</span></p> <p><span style="font-size: 9pt">}</span></p> <p><span style="font-size: 9pt">使用Visual C++编译运行该程序,输出结果如下:</span></p> <p><span style="font-size: 9pt">sizeof(int) is 4</span></p> <p><span style="font-size: 9pt">sizeof(BYTE) is 1</span></p> <p><span style="font-size: 9pt">sizeof(WORD) is 2</span></p> <p><span style="font-size: 9pt">sizeof(DWORD) is 4</span></p> <p><span style="font-size: 9pt">sizeof(LONG) is 4</span></p> <p><span style="font-size: 9pt">sizeof(PVOID) is 4</span></p> <p><span style="font-size: 9pt">sizeof(LPVOID) is 4</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">从上面的输出结果我们看到:整数类型字长已经同长整数相同,PVOID近指针和LPVOID远指针长度也相同。在编程过程中,我们要注意这些变化,凡是设计字长的问题最好还是采用可以移植的sizeof操作符来做。</span></p> <p><span style="font-size: 9pt">2.内存模式变化:</span></p> <p><span style="font-size: 9pt">在Win32平台下,不再有微模式、紧凑模式、中模式、大模式、巨模式、自定义内存模式之分,也不再有64KB代码段和数据段的限制。只有一种内存模式,Win32下的地址和代码均在线性寻址的2GB的32位内存空间中。当然,编程时还是要考虑到实际内存限制的。</span></p> <p><span style="font-size: 9pt">3.类型修饰符:</span></p> <p><span style="font-size: 9pt">在Win32下,不再有远指针、近指针、巨型指针之分,三种指针类型完全相同。32位的编译器会忽略所有的_near、_far、_huge关键字并一视同仁来处理。在Win32中,象LPSTR和PSTR这种类型是等价的。</span></p> <p><span style="font-size: 9pt">4.函数的变化:</span></p> <p><span style="font-size: 9pt">Win32API设计时尽可能保证与Win16API兼容,但是仍然对一些函数作了修改。比如在Win16下的MoveTo在Win32下为MoveToEx。如果在编译程序时某个API函数没找到,试着在这个函数名后面加上Ex,Ex表示它是Win16的扩展。 </span><font FACE="Times New Roman" SIZE="3"></p> </font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615"> <tr> <td><a href="chap2_2.htm">上一页</a></td> <td><p align="right"><a href="chap2_4.htm">下一页</a></td> </tr> </table> </center></div><font size="5"><hr noshade color="#3973DE" size="1"></td> <b> </tr></table></center></div></b></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -