第三章 窗口于消息
前面的例子都使用MessageBox来创建窗口 ,单他所创建的窗口灵活性有限。
3.1 窗口的创建
只要调用CreateWindow函数即可
3.1.1 系统结构概述
一个应用程序窗口可能包含,标题栏,菜单栏,工具栏,滚动条。另外还有一种类型的窗口是对话框,这种窗口可以不带标题栏
还可能包含,按钮,单选按钮,复选框,列表框,滚动条,文本框等。每一个这些对象都被称为 子窗口,或者 控件窗口
当用户改变窗口尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相关的信息,接着应用程序对自身内容进行调整以反映出窗口尺寸的变化。
“Windows向应用程序发送了一条消息”,windows调用了该程序内部的一个函数---这个函数是由你所写,而且是整个程序的核心。此函数的参数描述了由windows
所发送的由你的程序所接受的特定消息。这个函数被称为“窗口过程”。 windows会调用应用程序的这个函数,这种思路正式windows体系结构的基础。
应用程序所创建的每一个窗口都有一个与之对应的窗口过程。可以是应用程序中的某一个函数也可以是DLL库中的函数。窗口过程依据这些消息做相应的处理,然后将控制权返回给windows
更准确的说,窗口总是依赖窗口类来创建。窗口类标示了用于处理传递给窗口的消息的窗口过程。多个窗口可以共享一个窗口类,使用相同的窗口过程。
当windows程序创建以后,windows首先为该程序创建一个消息队列。该消息队列中存放着应用程序可能创建的所有窗口的消息。windows应用程序中通常都包含一小段消息循环的代码,该代码用于从消息队列中检索信息,并将其分发给窗口过程。
窗口, 窗口类,窗口过程,消息队列,消息循环以及窗口消息整合到实际应用中的一个例子
3.1.2
需要在工程中加载 Winmm.lib 使用PlaySound API函数, 在VS2015中禁用
#include <windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //window procedure.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;MSG msg;WNDCLASS wndClass; //The window ClasswndClass.style = CS_HREDRAW | CS_VREDRAW;wndClass.lpfnWndProc = WndProc;// assign the window procedure to windows class.wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hInstance = hInstance;wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);wndClass.lpszMenuName = NULL;wndClass.lpszClassName = szAppName;//Register the Window Class to the Windows System. if (!RegisterClass(&wndClass)) {MessageBox(NULL, TEXT("This program require Windows NT!"),szAppName, MB_ICONERROR);return 0;}//This function will generate an WM_CREATE message.hwnd = CreateWindow(szAppName, //Window class nameTEXT("The Hello Program"), //Window captionWS_OVERLAPPEDWINDOW, //Window StyleCW_USEDEFAULT, //initial x positionCW_USEDEFAULT, //initial y positionCW_USEDEFAULT, //initial x sizeCW_USEDEFAULT, //initial y sizeNULL, //parent window handleNULL, //window menu handlehInstance, //program instance