WIndows动态窗口创建
窗口创建流程
注册窗口类并创建窗口本身
->设置窗口过程函数
->设置窗口大小风格以及菜单栏
->创建窗口并获得其句柄
->显示窗口
创建窗口详解
窗口使用主函数说明
**int WINAPI wWinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPWSTR cmdLine,int nShow) **
//应用程序当前实例的句柄
//应用程序的前一个实例的句柄(将一直是NULL)如果想确定该应用程序是否已经有实例在运行,文档推荐使用CreateMutex函数来创建唯一名字的mutex(互斥体),当已经有实例运行时,再次创建mutex,CreateMutex函数将返回ERROR_ALREADY_EXISTS.
//使用Unicode编码的LPWSTR,应用程序的命令函有程序外部输入,如cmd命令终端,快捷方式提供的命令参数
//窗口被显示为那个模式的ID号(例如最小化,正常,最大化等)
创建窗口本身并注册窗口类
WNDCLASSEX wndClass = {0};
wndClass.cbSize=sizeof(WNDCLASSEX); //该结构所占字节数
wndClass.style = CS_HREDRAW|CS_VREDRAW; //用于定义窗口的外观
wndClass.lpfnWndProc = WndProc; //窗口回调函数,来自操作系统的事件都通知调用此函数
(该语句设置窗口过程函数)
wndClass.hInstance = hinstance; //该窗口类包含窗口过程的程序实例句柄
wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); //鼠标形状的资源ID号
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //用于绘制窗口背景的背景画刷句柄
wndClass.lpszMenuName = NULL; //菜单,以null结束的字符串的资源名字
wndClass.lpszClassName = "DX11BookWindowClass"; //以null结束的创建的窗口类名(256字符以下
//cbClsExtra:分配给该窗口结构额外的字节数
//cbWndExtra:分配给改窗口实例额外的字节数
//hlcon:程序显示的图标的资源ID号,NULL为默认图标
//hlconSm:窗口小图标句柄
if(!RegisterClassEx(&wndClass)) //注册窗口类 Ex为新版注册窗口函数
return -1;
ClassStyle
名称 | define |
---|---|
CS_VREDRAW | 0x0001 |
CS_HREDRAW | 0x0002 |
CS_DBLCLKS | 0x0008 |
CS_OWNDC | 0x0020 |
CS_CLASSDC | 0x0040 |
CS_PARENTDC | 0x0080 |
CS_NOCLOSE | 0x0200 |
CS_SAVEBITS | 0x0800 |
CS_BYTEALIGNCLIENT | 0x1000 |
CS_BYTEALIGNWINDOW | 0x2000 |
CS_GLOBALCLASS | 0x4000 |
CS_IME | 0x00010000 |
#if(_WIN32_WINNT >= 0x0501)
#define CS_DROPSHADOW 0x00020000
#endif /* _WIN32_WINNT >= 0x0501 */
创建窗口风格及菜单
RECT rc = {0,0,640,480};
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,false); //窗口大小,窗口风格,菜单
窗口风格
窗口风格 | |
---|---|
WS_OVERLAPPEDWINDOW | WS_OVERLAPPED |
WS_CAPTION | WS_SYSMENU |
WS_THICKFRAME | WS_MINIMIZEBOX |
WS_MAXIMIZEBOX | WS_POPUPWINDOW |
WS_POPUP | WS_BORDER |
WS_CHILDWINDOW | WS_CHILD |
创建窗口偶并获得其句柄
HWND hwnd = CreateWindow(
“Dx11BookWindowClass”,
“Blank Win32 Window”,
WS_OVERLAPPEDWINDOW,0,0,
rc.right-rc.left,rc.bottom-rc.top,
NULL,NULL,hinstance,NULL
);
函数原型
#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
显示窗口
ShowWindow(hwnd,nShow);
窗口过程函数
//Blank 窗体Demo的窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hDC;
switch(message)
{
case WM_PAINT: //响应绘制消息
hDC = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY: //退出消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam); //缺省处理
}
return 0;
}