学习Windows程序设计第一件要做的事情

Windows程序设计的概况
1.   为什么要学习Windows程序设计而不是一开始就学习MFC???
Windows程序设计是使用C语言和Windows的API函数来进行编程的,而MFC则是封装了WindowsAPI一些琐碎的细节,使用的是C++语言,是面向对象的;因为MFC并不是一个良好的对象模型,使用MFC会在很多方面出现点问题,如果对Windows程序不怎么了解,那么调试起来可能让人难以忍受,甚至很多时候不知道错在哪儿,无法调试!!!
2.   使用什么工具???
           当然是使用微软的VC++6.0了
   
3.Windows程序设计中一些经常出现的概念:
(1).句柄

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。


句柄地址(稳定)→记载着对象在内存中的地址────→对象在内存中的地址(不稳定)→实际对象


本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。


但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄是一个整数,用以标识Windows对象,句柄不是一个指针……

 

(2).微软的数据类型
Windows数据类型 本质类型 字节数 定义过程(来历) 含义
ATOM unsigned short 2 unsigned short→WORD→ATOM 在Atom表中,一键(16位整数)一值(一个String)为一个Atom。
BOOL int * int→BOOL 逻辑变量,布尔值 (取值为 TRUE 或 FALSE)
BOOLEAN unsigned char 1 unsigned char→BYTE→BOOLEAN 逻辑变量,布尔值 (取值为 TRUE 或 FALSE)
BYTE unsigned char 1 unsigned char→BYTE 字节型,8位。
CALLBACK __stdcall 调用 __stdcall→CALLBACK 回调函数的调用约定
CHAR char 1 char→CHAR 8位Windows字符(ANSI)
COLORREF unsigned long 4 unsigned long→DWORD→COLORREF 红,绿,蓝(RGB)值
CONST const 关键字 const→CONST 常量
CRITICAL_SECTION RTL_CRITICAL_SECTION结构体 ? RTL_CRITICAL_SECTION(结构)→CRITICAL_SECTION Critical-section对象
DWORD unsigned long 4 unsigned long→DWORD 32位无符号整数
DWORD_PTR unsigned long 4 unsigned long→ULONG_PTR→DWORD_PTR(另有其它路径) 略……(用处挺大,不过太长了)
DWORD32 unsigned int * unsigned int→DWORD32 32位无符号整数
DWORD64 unsigned __int64 8 unsigned __int64→DWORD64 64位无符号整数
FLOAT float 4 float→FLOAT 浮点数变量
HACCEL HACCEL__结构体指针   由DECLARE_HANDLE(name)宏定义的指向HACCEL__结构体的指针 快捷键列表的句柄
HANDLE void *(一个地址)   void *→HANDLE 对象的句柄
HBITMAP HBITMAP__结构体指针   由DECLARE_HANDLE(name)宏定义的指向HBITMAP__结构体的指针 位图的句柄
HBRUSH HBRUSH__结构体指针   由DECLARE_HANDLE(name)宏定义…… 画刷的句柄
HCONV HCONV__结构体指针   由DECLARE_HANDLE(name)宏定义…… 动态数据交换(DDE)会话的句柄
HCONVLIST HCONVLIST__结构体指针   由DECLARE_HANDLE(name)宏定义…… 动态数据交换(DDE)会话列表的句柄
HCURSOR HICON__结构体指针   HICON__ *→HICON→HCURSOR 光标的句柄
HDC HDC__结构体指针   由DECLARE_HANDLE(name)宏定义…… 设备上下文(DC)的句柄
HDDEDATA HDDEDATA__结构体指针   由DECLARE_HANDLE(name)宏定义…… 动态数据交换数据的句柄
HDESK HDESK__结构体指针   由DECLARE_HANDLE(name)宏定义…… 桌面(Desktop)的句柄
HDROP HDROP__结构体指针   由DECLARE_HANDLE(name)宏定义…… Handle to an internal drop structure.
HDWP void *(一个地址)   void *→HANDLE→HDWP Handle to a deferred window position structure.
HENHMETAFILE HENHMETAFILE__结构体指针   由DECLARE_HANDLE(name)宏定义…… 增强图元文件的句柄
HFILE int * int→HFILE 由OpenFile(而不是CreateFile)打开的文件的句柄.
HFONT HFONT__结构体指针   由DECLARE_HANDLE(name)宏定义…… 字体的句柄
HGDIOBJ void near *   void NEAR *→HGDIOBJ GDI对象的句柄
HGLOBAL void *(一个地址)   void *→HANDLE→HGLOBAL 全局内存块的句柄
HHOOK HHOOK__结构体指针   由DECLARE_HANDLE(name)宏定义…… 句子(hook)的句柄
HICON HICON__结构体指针   由DECLARE_HANDLE(name)宏定义…… 图标的句柄
HIMAGELIST _IMAGELIST结构体指针   _IMAGELIST *→HIMAGELIST 图片列表的句柄
HIMC HIMC__结构体指针   由DECLARE_HANDLE(name)宏定义…… 输入上下文的句柄
HINSTANCE HINSTANCE__结构体指针   由DECLARE_HANDLE(name)宏定义…… 实例的句柄
HKEY HKEY__结构体指针   由DECLARE_HANDLE(name)宏定义……(另有一条路径,一样) 注册表键的句柄
HKL HKL__结构体指针   由DECLARE_HANDLE(name)宏定义…… 输入点标识符
HLOCAL void *(一个地址)   void *→HANDLE→HLOCAL 本地内存块的句柄
HMENU HMENU__结构体指针   由DECLARE_HANDLE(name)宏定义…… 菜单的句柄
HMETAFILE HMETAFILE__结构体指针   由DECLARE_HANDLE(name)宏定义…… 图元文件的句柄
HMODULE HINSTANCE__结构体指针   HINSTANCE__*→HINSTANCE→HMODULE 模块的句柄。值由模块的位置来决定。
HMONITOR HMONITOR__结构体指针   由DECLARE_HANDLE(name)宏定义…… 显示器的句柄
HPALETTE HPALETTE__结构体指针   由DECLARE_HANDLE(name)宏定义…… 调色板的句柄
HPEN HPEN__结构体指针   由DECLARE_HANDLE(name)宏定义…… 画(线)笔的句柄
HRGN HRGN__结构体指针   由DECLARE_HANDLE(name)宏定义…… 区域的句柄
HRSRC HRSRC__结构体指针   由DECLARE_HANDLE(name)宏定义…… 资源的句柄
HSZ HSZ__结构体指针   由DECLARE_HANDLE(name)宏定义…… 动态数据交换(DDE)字符串的句柄
HWINSTA HWINSTA__结构体指针   由DECLARE_HANDLE(name)宏定义…… 窗口状态的句柄
HWND HWND__结构体指针   由DECLARE_HANDLE(name)宏定义…… 窗口的句柄
INT int * int→INT 32位有符号整数
INT_PTR int(_W64 int即__w64 int) * _W64 int→INT_PTR,_W64就是__w64,是为了解决32位与64位编译器的兼容性而设置的关键字 用于指针运算
INT32 signed int * signed int→INT32 32位有符号整数
INT64 signed __int64 8 signed __int64→INT64 64位有符号整数
LANGID unsigned short 2 unsigned short→WORD→LANGID 语言标识符
LCID unsigned long 4 unsigned long→DWORD→LCID Locale identifier.
LCTYPE unsigned long 4 unsigned long→DWORD→LCTYPE Locale information type. 
LONG long 4 long→LONG 32位有符号整数
LONG_PTR long 4 _W64 long→LONG_PTR 用于指针运算
LONG32 signed int * signed int→LONG32 32位有符号整数
LONG64 __int64 8 __int64→LONG64 64位有符号整数
LONGLONG __int64 8 __int64→LONGLONG 64位有符号整数
LPARAM long 4 _W64 long→LONG_PTR→LPARAM 消息的参数
LPBOOL int *   int→BOOL, BOOL far *→LPBOOL BOOL类型的指针
LPBYTE unsigned char *   unsigned char→BYTE,BYTE far *→LPBYTE BYTE类型的指针
LPCOLORREF unsigned long *   unsigned long→WORD,DWORD *→LPCOLORREF 颜色值的指针
LPCRITICAL_SECTION RTL_CRITICAL_SECTION结构体指针   RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION→,PRTL_CRITICAL_SECTION→LPCRITICAL_SECTION CRITICAL_SECTION的指针
LPCSTR 静态char *   char→CHAR,CONST CHAR *→LPCSTR 静态8位Windows字符(ANSI)无终结字符串指针
LPCTSTR 静态wchar_t *   wchar_t→WCHAR,CONST WCHAR *→LPCWSTR,LPCWSTR→LPCTSTR 如果UNICODE已定义则为LPCWSTR,否则为LPCTSTR
LPCVOID 静态void *   CONST void far *→LPCVOID 任何类型的静态指针
LPCWSTR 静态wchar_t *   wchar_t→WCHAR,CONST WCHAR *→LPCWSTR 静态16位Windows字符(Unicode)无终结字符串指针
LPDWORD unsigned long *   unsigned long→DWORD,DWORD far *→LPDWORD DWORD的指针
LPHANDLE 指向句柄的指针   void *→HANDLE,HANDLE FAR *→LPHANDLE HANDLE的指针
LPINT int *   int far *→LPINT INT的指针
LPLONG long *   long far *→LPLONG LONG的指针
LPSTR char *   char→CHAR,CHAR *→LPSTR 8位Windows字符(ANSI)无终结字符串指针
LPTSTR wchar_t *   wchar_t WCHAR,WCHAR *→LPWSTR,LPWSTR→LPTSTR An LPWSTR if UNICODE is defined, an LPSTR otherwise.
LPVOID void *   void far *→LPVOID 任何类型的指针
LPWORD unsigned short *   unsigned short→WORD,WORD far *→LPWORD WORD的指针
LPWSTR wchar_t *   wchar_t→WCHAR,WCHAR *→LPWSTR 16位Windows字符(ANSI)无终结字符串指针
LRESULT long 4 _W64 long→LONG_PTR→LRESULT 有符号的消息处理结果
LUID LUID结构     局部唯一标识符
PBOOL int *   int→BOOL,BOOL near *→PBOOL BOOL的指针
PBOOLEAN unsigned char *   unsigned char→BYTE→BOOLEAN,BOOLEAN *→PBOOLEAN BOOL的指针
PBYTE unsigned char *   unsigned char→BYTE,BYTE near *→PBYTE BYTE的指针
PCHAR char *   char→CHAR,CHAR *→PCHAR CHAR的指针
PCRITICAL_SECTION RTL_CRITICAL_SECTION结构体指针   RTL_CRITICAL_SECTION *→PRTL_CRITICAL_SECTION,PRTL_CRITICAL_SECTION→PCRITICAL_SECTION CRITICAL_SECTION的指针
PCSTR 静态char *   char→CHAR,CONST CHAR *→PCSTR 静态8位Windows字符(ANSI)无终结字符串指针
PCTSTR 静态wchar_t *   wchar_t→WCHAR,CONST WCHAR *→LPCWSTR,LPCWSTR→PCTSTR 如果UNICODE已定义则为PCWSTR,否则为PCSTR
PCWCH 静态wchar_t *   wchar_t→WCHAR,CONST WCHAR *→PCWCH WCHAR的静态指针
PCWSTR 静态wchar_t *   wchar_t→WCHAR,CONST WCHAR *→PCWSTR 静态16位Windows字符(Unicode)无终结字符串指针
PDWORD unsigned long *   unsigned long→DWORD,DWORD near *→PDWORD DWORD的指针
PFLOAT float *   float→FLOAT,FLOAT *→PFLOAT FLOAT的指针
PHANDLE 指向句柄的指针   void *→HANDLE,HANDLE *→PHANDLE HANDLE的指针
PHKEY 指向HKEY的指针   HKEY__ *→HKEY *→PHKEY HKEY的指针
PINT int *   int near *→PINT INT的指针
PLCID unsigned long *   unsigned long→DWORD,DWORD near *→PDWORD→PLCID LCID的指针
PLONG long *   long→LONG,LONG *→PLONG LONG的指针
PLUID LUID结构体指针   LUID *→PLUID
POINTER_32 void *   void *→POINTER_32 32位指针(详解略)
POINTER_64 void *   void *→POINTER_64 64位指针(详解略)
PSHORT short *   short→SHORT,SHORT *→PSHORT SHORT的指针
PSTR char *   char→CHAR,CHAR *→PSTR 8位Windows字符(ANSI)无终结字符串指针
PTBYTE wchar_t *   wchar_t→WCHAR,WCHAR *→PTBYTE TBYTE的指针
PTCHAR wchar_t *   wchar_t→WCHAR,WCHAR *→PTCHAR TCHAR的指针
PTSTR wchar_t *   wchar_t→WCHAR,WCHAR *→LPWSTR→PTSTR PWSTR if UNICODE is defined, a PSTR otherwise.
PTBYTE wchar_t *   wchar_t→WCHAR,WCHAR *→PTBYTE TBYTE的指针
PTCHAR wchar_t *   wchar_t→WCHAR,WCHAR *→PTCHAR TCHAR的指针
PTSTR wchar_t *   wchar_t→WCHAR,WCHAR *→LPWSTR→PTSTR A PWSTR if UNICODE is defined, a PSTR otherwise.
PUCHAR unsigned char *   unsigned char→UCHAR,UCHAR *→PUCHAR UCHAR的指针
PUINT unsigned int *   unsigned int *→PUINT(呵呵,为什么不用UINT*来定义呢?) UINT的指针
PULONG unsigned long *   unsigned long→ULONG,ULONG *→PULONG ULONG的指针
PUSHORT unsigned short *   unsigned short→USHORT,USHORT *→PUSHORT USHORT的指针
PVOID void *   void *→PVOID 任何类型的指针
PWCHAR wchar_t *   wchar_t→WCHAR,WCHAR *→PWCHAR WCHAR的指针
PWORD unsigned short *   unsigned short→WORD,WORD near *→PWORD WORD的指针
PWSTR wchar_t *   wchar_t→WCHAR,WCHAR *→PWSTR 16位Windows字符(Unicode)无终结字符串指针
REGSAM unsigned long   unsigned long→DWORD→ACCESS_MASK→REGSAM 注册表值的安全访问掩码
SC_HANDLE SC_HANDLE__结构体指针   由DECLARE_HANDLE(name)宏定义…… Handle to a service control manager database.
SC_LOCK void *   void far *→LPVOID→SC_LOCK Handle to a service control manager database lock. 
SERVICE_STATUS_HANDLE SERVICE_STATUS_HANDLE__结构体指针   由DECLARE_HANDLE(name)宏定义…… Handle to a service status value. 
SHORT short 2 short→SHORT 短整数类型(16位)
SIZE_T unsigned long 4 unsigned long→ULONG_PTR→SIZE_T 指针可指向的最大字节数
SSIZE_T long   _W64 long→LONG_PTR→SSIZE_T 有符号SIZE_T.
TBYTE wchar_t 2 wchar_t→WCHAR,WCHAR→TBYTE 如果UNICODE已定义则为WCHAR,否则为CHAR
TCHAR wchar_t 2 wchar_t→WCHAR,WCHAR→TCHAR 如果UNICODE已定义则为WCHAR,否则为CHAR
UCHAR unsigned char 1 unsigned char→UCHAR 无符号CHAR
UINT unsigned int * unsigned int→UINT 无符号INT
UINT_PTR unsigned int * unsigned int→UINT_PTR 无符号INT_PTR.
UINT32 unsigned int 2 unsigned int→UINT32 无符号INT32.
UINT64 unsigned __int64 4 unsigned __int64→UINT64 无符号INT64.
ULONG unsigned long 4 unsigned long→ULONG 无符号LONG.
ULONG_PTR unsigned long 4 unsigned long→ULONG_PTR 无符号LONG_PTR.
ULONG32 unsigned int 2 unsigned int→ULONG32 无符号LONG32
ULONG64 unsigned __int64 4 unsigned __int64→ULONG64 无符号LONG64
ULONGLONG unsigned __int64 4 unsigned __int64→ULONGLONG 64位无符号整数
UNSIGNED 没查到,大家帮忙吧     无符号属性
USHORT unsigned short   unsigned short→USHORT 无符号SHORT类型
VOID void   void→VOID 任何类型
WCHAR wchar_t 2 wchar_t→WCHAR 16位Unicode字符
WINAPI __stdcall 调用 __stdcall→WINAPI 系统函数(API函数)调用约定
WORD unsigned short 2 unsigned short→WORD 16位无符号整数
WPARAM unsigned int * unsigned int→UINT_PTR→WPARAM 消息的参数
int * signed,signed int 由操作系统决定,即与操作系统的"字长"有关
unsigned int * unsigned 由操作系统决定,即与操作系统的"字长"有关
__int8 1 char,signed char –128 到 127
__int16 2 short,short int,signed short int –32,768 到 32,767
__int32 4 signed,signed int –2,147,483,648 到 2,147,483,647
__int64 8 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
bool 1 false 或 true
char 1 signed char –128 到 127
unsigned char 1 0 到 255
short 2 short int,signed short int –32,768 到 32,767
unsigned short 2 unsigned short int 0 到 65,535
long 4 long int,signed long int –2,147,483,648 到 2,147,483,647
long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long 4 unsigned long int 0 到 4,294,967,295
enum * 由操作系统决定,即与操作系统的"字长"有关
float 4 3.4E +/- 38 (7 digits)
double 8 1.7E +/- 308 (15 digits)
long double 8 1.7E +/- 308 (15 digits)
wchar_t 2 __wchar_t 0 到 65,535
3.              编写第一个Windows程序                                                                     
/* HelloWorld.c */                                                                         
              1     #include <windows.h>
 
2     int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
            3        MessageBox (NULL, TEXT ("Hello, Windows!"), TEXT ("HelloMsg"), 0) ;
 
             4    return 0 ;
}
下面来解释一下上面的程序:
第一行包含头文件,WINDOWS.H是主要的含入文件,它包含了其它Windows表头文件,这些表头文件的某些也包含了其它表头文件。这些表头文件中最重要的和最基本的是:
  • WINDEF.H 基本型态定义。
     
  • WINNT.H 支持Unicode的型态定义。
     
  • WINBASE.H Kernel函数。
     
  • WINUSER.H 使用者接口函数。
     
  • WINGDI.H 图形设备接口函数。
     
这些表头文件定义了Windows的所有数据型态、函数呼叫、数据结构和常数标识符,它们是Windows文件中的一个重要部分
第二行:Windows程序的进入点是WinMain, 正如在C程序中的进入点是函数main一样
WinMain函数的介绍: WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。
在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。
WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中
第三行:MessageBox函数的使用:
MessageBox的第一个参数通常是窗口句柄。第二个参数是在消息框主体中显示的字符串,第三个参数是出现在消息框标题列上的字符串。在HELLMSG.C中,这些文字字符串的每一个都被封装在一个TEXT宏中。通常您不必将所有字符串都封装在TEXT宏中,但如果想将您的程序转换为Unicode字符集,这确是一个好主意
MessageBox返回数值1,但更严格地说它返回IDOK,IDOK在WINUSER.H中定义,等于1。根据在消息框中显示的其它按钮,MessageBox函数还可返回IDYES、IDNO、IDCANCEL、IDABORT、 IDRETRY或IDIGNORE。
 
 
 
 
 
                    
 
 
 
 
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页