Windows程序开发基础
在Windows下的图形化应用程序的入口点是WinMain,WinMain的函数原型是
int __clrcall WinMain(
[in] HINSTANCE hInstance,
[in] HINSTANCE hPrevInstance,
[in] LPSTR lpCmdLine,
[in] int nShowCmd
);
第一个参数hInstance,当前运行的应用程序实例句柄。它是一个资源总管,资源都在这个句柄里面。
第二个参数hPrevInstance,应用程序的上一个应用程序实例句柄。此参数始终为空。如果需要检查另一个实例是否已经存在,可以使用CreateMutex函数。即使上一个实例已经存在,CreateMutex也会成功,但函数将返回ERROR_READY_EXISTS。这表明应用程序存在另一个实例,因为它首先创建了互斥锁。但是,恶意用户可以在您创建互斥锁之前创建互斥锁,并阻止您的应用程序启动。为了防止这种情况,创建一个随机命名的互斥锁并存储该名称,以便只有授权用户才能获取该名称
第三个参数loCmdLine,应用程序的命令行,不包括程序名。要获得整个命令行,推荐使用GetCommandLine这个函数。
第四个参数nShowCmd,控制窗口的显示方式。
返回值,如果函数成功,并在收到WM_QUIT消息时终止,它应该返回该消息的wParam参数中包含的退出值。如果函数在进入消息循环之前终止,它应该返回零。
各种概念
top-level window,主窗口,也就是任务栏图标对应的窗口。
owner window:父窗口,容器窗口
coordinate:坐标
client area:客户区
send与post都是传送,send意为马上执行(我要你干什么,你马上执行),而post不一定马上执行,告诉你了,可能稍微晚半拍
句柄,每一种句柄都是一种实际被隐藏具体内容的指针变量。
对话框
DialogBoxA函数功能:从对话框模板资源创建模态对话框。直到指定的回调函数通过调用EndDialog函数终止模式对话框,DialogBox才会返回。函数原型:
void DialogBoxA(
[in, optional] hInstance,
[in] lpTemplate,
[in, optional] hWndParent,
[in, optional] lpDialogFunc
);
第一个参数:包含对话框模板资源的模块所对应的模块句柄。如果这个参数为NULL,则模块为当前可执行程序
第二个参数:对话框模板,此参数是指向以null结尾的字符串的指针,该字符串指定对话框模板的名称,或者是指定对话框模板的资源标识符的整数值。由于之前的开发,都是传字符串指定,而如今对话框模板名称都是用ID这个整形值去标识,只用强制类型转换即可。如果参数指定资源标识符,则其高阶字必须为零,低阶字必须包含该标识符,你可以使用MAKEINTRESOURCE宏去得到这个值
第三个参数:对话框的父窗口句柄或容器窗口句柄
第四个参数:对话框的窗口处理过程。在这个窗口处理过程中,如果你自己处理好了这个消息,不需要系统再管了,你就return TRUE;返回FALSE代表缺省的处理由系统完成。
注:DialogBox宏使用CreateWindowEx函数创建对话框,DialogBox然后向对话框过程发送WM_INITDIALOG消息(如果模板指定DS_SETFONT或DS_SHELLFONT样式,则会多发送一个WM_SETFONT消息)。该函数显示对话框(无论模板是否指定WS_VISIBLE样式),禁用父窗口或容器窗口,并启动自己的消息循环来检索和分派对话框的消息。当对话框过程调用EndDialog函数时,DialogBox将销毁对话框,结束消息循环,启用父窗口或容器窗口(如果之前已启用),并返回对话框过程在调用EndDialog时指定的nResult参数。
GetDlgItemInt功能:将对话框中指定控件的文本转换为整数值。函数原型:
UINT GetDlgItemInt(
[in] HWND hDlg,
[in] int nIDDlgItem,
[out, optional] BOOL *lpTranslated,
[in] BOOL bSigned
);
第一个参数:包含你感兴趣(即你想获得该控件文本)的控件的对话框句柄
第二个参数:你感兴趣的控件的ID
第三个参数:转换结果。(TRUE表示转换成功,FALSE表示转换失败)如果此参数为NULL,则函数不返回有关成功或失败的信息。
第四个参数:指示函数是否应在文本开头检查减号,如果找到减号,则返回有符号整数值(TRUE指定应执行此操作,FALSE指定不应执行此操作)。
返回值:如果函数成功,lpTranslated指向的变量将设置为TRUE,返回值为控件文本的翻译值。如果函数失败,lpTranslated指向的变量将设置为FALSE,返回值为零。请注意,因为零是一个可能的转换值,所以返回值为零本身并不表示失败。如果lpTranslated为NULL,则函数不返回成功或失败的信息。请注意,如果bSigned参数为TRUE,并且文本开头有负号(–),则GetDlgItem会将文本转换为带符号的整数值。否则,该函数将创建一个无符号整数值。当bSigned参数为TRUE,要获得正确的值,请将返回值强制转换为int类型。
注意,GetDlgItem函数通过向控件发送WM_GETTEXT消息来返回指定控件的文本。该函数通过去除文本开头的任何额外空格,然后转换十进制数字来转换返回到的文本。函数到达文本末尾或遇到非数字字符时停止翻译。如果转换后的值大于INT_MAX(针对有符号的数字)或UINT_MAX(针对无符号的数字),则GetDlgItem函数返回零。
SetDlgItemInt功能,将传入的整数值转为字符串,然后将对话框中控件的文本设置成该字符串。函数原型:
BOOL SetDlgItemInt(
[in] HWND hDlg,
[in] int nIDDlgItem,
[in] UINT uValue,
[in] BOOL bSigned
);
第一个参数:包含控件的对话框的句柄。
第二个参数:待被修改的控件ID
第三个参数:你要写该控件的整数值
第四个参数:指示uValue参数是有符号的还是无符号的。如果此参数为TRUE,则uValue是有符号的。如果此参数为TRUE且uValue小于零,则在字符串中的第一个数字之前放置一个减号。如果此参数为FALSE,则uValue为无符号。
返回值:如果函数成功,则返回值为非零。如果函数失败,返回值为零。
注意:此函数是将WM_SETTEXT消息发送到指定控件来达到设置新文本的功能。
消息分类
WM_COMMAND:来自于菜单项,按钮控件(点击一个按钮或者菜单项,只是外观不一样,功能基本一致)或者一个快捷键
IDCANCEL是一个特殊的宏,当你按ESC,点击标题栏的系统关闭按钮,按Alt+F4都会响应这个宏
IDOK也是一个特殊的宏,当你的焦点在一个输入框中并在此时按下了回车,就会响应这个宏。ID为IDOK的按钮也叫做缺省按钮
WM_DESTROY消息,当窗口被销毁时发送,将窗口从屏幕上移除后,它会被发送到窗口过程函数。此消息首先发送到正在销毁的窗口,然后在发送到子窗口(如果有)。在消息处理过程中,可以假定所有子窗口仍然存在。
WM_CREATE:除了对话框不产生这个消息,其他窗口的产生这个消息,对话框产生的消息是WM_INITDIALOG,这类消息一般用于窗口创建时做一些准备操作
WM_CLOSE:系统关闭(默认的关闭,即你不加任何按钮,也有这个关闭),一般为按下Alt+F4或者点击标题栏的关闭按钮即可产生这个消息