windows编程-窗口 (2)

/* 在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断地从消息队列中取出消息, 并进行响应。要从消息队列中取出消息,我们需要调用GetMessage()函数,

该函数的原型声明如下:

BOOL GetMessage(

LPMSG lpMsg, // address of structure with message

HWND hWnd, // handle of window

UINT wMsgFilterMin, // first message

UINT wMsgFilterMax // last message);

参数 lpMsg 指向一个消息(MSG)结构体,GetMessage 从线程的消息队列中取出的消息信息将保存在该结构体对象中。 参数 hWnd 指定接收属于哪一个窗口的消息。通常我们将其设置为NULL,用于接收属于调用线程的所有窗口的窗口消息。 参数 wMsgFilterMin 指定要获取的消息的最小值,通常设置为0。 参数 wMsgFilterMax 指定要获取的消息的最大值。如果wMsgFilterMin 和wMsgFilterMax 都设置为0,则接收所有消息。 */

return msg.wParam;

//PostQuitMessage函数的参数值(见代码,通常是0)将作为WM_QUIT 消息的wParam 参数(见注释⑦),

//此时参数wParam为0。收到WM_QUIT 消息消息循环自然终止,然后程序执行下面的语句:

//return msg.wParam; 即返回0值正常退出WinMain并终止程序。

}

LRESULT CALLBACK WndProc  

(HWND hwnd, //窗口句柄  UINT

message, //消息代码  

WPARAM wParam, //消息代码的两个附加参数

LPARAM lParam){

HDC hdc;  

PAINTSTRUCT ps;

RECT rect;

switch (message){   

case WM_CREATE://创建过程   

PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);    

return 0;  

case WM_PAINT:  

hdc = BeginPaint(hwnd, &ps);   

GetClientRect(hwnd, &rect);  

DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);   

EndPaint(hwnd, &ps);    

return 0;   

case WM_CLOSE://关闭状态   

if (IDYES == MessageBox(hwnd, TEXT("是否真的结束?"), TEXT("message"), MB_YESNO))

{     DestroyWindow(hwnd);    }   

/*1.int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT UType);     hwnd表示拥有的窗口,第二个为显示消息内容,第三个为对话框标题,第四个位按钮类型     IDABORT:Abort 按钮被选中。IDCANCEL:Cancel按钮被选中。IDIGNORE:Ignore按钮被选中。     IDNO:NO按钮被选中。IDOK:OK按钮被选中。IDRETRY:RETRY按钮被选中。 IDYES:YES按钮被选中。    */   

return 0;   

case WM_DESTROY://销毁  

PostQuitMessage(0);   

return 0;  }  

return DefWindowProc(hwnd, message, wParam, lParam);

}

/*进队消息与不进队消息(了解): 进队消息和不进队消息 其实在Windows中消息能够被分为“进队的”和“不进队的”。进队的的消息是由Windows放入程序消息队列中的 在程序的消息循环中,重新返回并分配给窗口过程。不进队的的消息在Windows调用窗口时直接送给窗口过程。 也就是说,进队的消息被“发送”给消息队列,而不进队的的消息则直接“发送”给窗口过程。任何情况下, 窗口过程都将获得窗口所有的消息--包括进队的和不进队的。窗口过程是窗口的“消息中心”。 进队消息基本上是用户输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、 鼠标移动(WM_MOUSEMOVE)和鼠标键(WM_LBUTTONDOWN)的形式给出。进队消息还包含时钟消息(WM_TIMER)、 刷新消息(WM_PAINT)和退出消息(WM_QUIT)。不进队消息则是其它消息。在许多情况下,不进队消息来自 调用特定的Windows函数。例如,当WinMain调用CreateWindow时,Windows将创建窗口并在处理中给窗口过程 发送一个WM_CREATE消息。当WinMain调用ShowWindow时,Windows将给窗口过程发送WM_SIZE和WM_SHOWWINDOW消息。 当WinMain调用UpdateWindow时,Windows将给窗口过程发送WM_PAINT消息。键盘或鼠标输入时发出的进队消息信号 ,也能在不进队消息中出现。例如,用键盘或鼠标选择了一个菜单项时,键盘或鼠标消息就是进队的,而说明菜单 项已选中的WM_COMMAND消息则可能就是不进队的 */

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwxxx.html