Win32 SDk(一) 创建一个标准窗口程序
一. 创建一个标准的窗口流程
- 设计一个窗口类,填写窗口类结构体WNDCLASSEXW
typedef struct tagWNDCLASSEXW {
UINT cbSize; //结构体大小
/* Win 3.x */
UINT style; //窗口样式
WNDPROC lpfnWndProc; //窗口过程函数地址,回调函数
int cbClsExtra; //类的附加值
int cbWndExtra; //窗口的附加值
HINSTANCE hInstance; //程序实例句柄
HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口鼠标
HBRUSH hbrBackground; //窗口背景色
LPCWSTR lpszMenuName; //窗口菜单
LPCWSTR lpszClassName; //窗口类名
/* Win 4.0 */
HICON hIconSm; //窗口小图标
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
实例:
//窗口类名
TCHAR cls_name[] = TEXT("MyWinClass");
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof(WNDCLASSEX);
wce.style = CS_HREDRAW | CS_VREDRAW;
wce.lpfnWndProc = WindowProc;
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hInstance = hInstance;
wce.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wce.hIconSm = wce.hIcon;
wce.hCursor = LoadCursor(NULL, IDC_ARROW);
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);/*::GetStockObject(BLACK_BRUSH)*/ /*黑色刷子*/
wce.lpszMenuName = NULL;
wce.lpszClassName = cls_name;
2.注册窗口类
if (FALSE == RegisterClassEx(&wce))
return -1;
3.创建窗口
HWND CreateWindowEx(
DWORD dwExStyle, //窗口的扩展风格
LPCTSTR lpClassName, //已经注册的窗口类名称
LPCTSTR lpWindowName, //窗口标题栏的名字
DWORD dwStyle, //窗口的基本风格
int x, //窗口左上角水平坐标位置
int y, //窗口左上角垂直坐标位置
int nWidth, //窗口的宽度
int nHeight, //窗口的高度
HWND hWndParent, //窗口的父窗口句柄
HMENU hMenu, //窗口菜单句柄
HINSTANCE hInstance, //应用程序实例句柄
LPVOID lpParam //窗口创建时附加参数
); //创建成功返回窗口句柄
其中:
dwExStyle:
指定窗口的扩展风格。该参数可以是下列值:
WS_EX_NODRAG:防止窗口被移动
WS_EX_ACCEPTFILES:指定以该风格创建的窗口接受一个拖拽文件。
WS_EX_APPWINDOW:当窗口可见时,将一个顶层窗口放置到任务条上。
WS_EX_CLIENTEDGE:指定窗口有一个带阴影的边界。
WS_EX_CONTEXTHELP:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到WM_HELP消息。子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。
WS_EX_CONTROLPARENT:允许用户使用Tab键在窗口的子窗口间搜索。
WS_EX_DLGMODALFRAME:创建一个带双边的窗口;该窗口可以在dwStyle中指定WS_CAPTION风格来创建一个标题栏。
WS_EX_LEFT:窗口具有左对齐属性,这是缺省设置的。
WS_EX_LEFTSCROLLBAR:如果外壳语言是如Hebrew,Arabic,或其他支持reading order alignment的语言,则标题条(如果存在)则在客户区的左部分。若是其他语言,在该风格被忽略并且不作为错误处理。
WS_EX_LTRREADING:窗口文本以LEFT到RIGHT(自左向右)属性的顺序显示。这是缺省设置的。
WS_EX_MDICHILD:创建一个MDI子窗口。
WS_EX_NOPATARENTNOTIFY:指明以这个风格创建的窗口在被创建和销毁时不向父窗口发送WM_PARENTNOTFY消息。
WS_EX_OVERLAPPEDWINDOW:WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的组合。
WS_EX_PALETTEWINDOW:WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST风格的组合WS_EX_RIGHT:窗口具有普通的右对齐属性,这依赖于窗口类。只有在外壳语言是如Hebrew,Arabic或其他支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志并且不作为错误处理。
WS_EX_RIGHTSCROLLBAR:垂直滚动条在窗口的右边界。这是缺省设置的。
WS_EX_RTLREADING:如果外壳语言是如Hebrew,Arabic,或其他支持读顺序对齐(reading order alignment)的语言,则窗口文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其他语言,在该风格被忽略并且不作为错误处理。
WS_EX_STATICEDGE:为不接受用户输入的项创建一个3一维边界风格
WS_EX_TOOLWINDOW:创建工具窗口,即窗口是一个游动的工具条。工具窗口的标题条比一般窗口的标题条短,并且窗口标题以小字体显示。工具窗口不在任务栏里显示,当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个系统菜单,它的图标也不会显示在标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。
WS_EX_TOPMOST:指明以该风格创建的窗口应放置在所有非最高层窗口的上面并且停留在其L,即使窗口未被激活。使用函数SetWindowPos来设置和移去这个风格。
WS_EX_TRANSPARENT:指定以这个风格创建的窗口在窗口下的同属窗口已重画时,该窗口才可以重画。由于其下的同属窗口已被重画,该窗口是透明的。
HWND hWnd = CreateWindowEx(
WS_EX_APPWINDOW,
cls_name,
TEXT("我的窗口"),
WS_OVERLAPPEDWINDOW,
200, 120, 600, 400,
NULL, NULL, hInstance,
NULL);
//回调函数要写上默认的处理DefWindowProc,不然创建失败
if (!hWnd)
return -1;
4. //显示,更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
5. //消息循环
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
6.在回调函数中处理各种消息
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE: //关闭窗口消息
DestroyWindow(hWnd);
break;
case WM_DESTROY: //销毁窗口消息
PostQuitMessage(0);
break;
default:
break;
}
//返回默认的消息处理函数,一定要有这句才能创建成功
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
下面是完整代码实例:
#include <windows.h> //回调函数声明 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//主函数WinMain() int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { //窗口类名 TCHAR cls_name[] = TEXT("MyWinClass"); WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(WNDCLASSEX); wce.style = CS_HREDRAW | CS_VREDRAW; wce.lpfnWndProc = WindowProc; wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hInstance = hInstance; wce.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wce.hIconSm = wce.hIcon; wce.hCursor = LoadCursor(NULL, IDC_ARROW); wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);/*::GetStockObject(BLACK_BRUSH)*/ /*黑色刷子*/ wce.lpszMenuName = NULL; wce.lpszClassName = cls_name; //注册窗口类 if (FALSE == RegisterClassEx(&wce)) return 1; //创建窗口 HWND hWnd = CreateWindowEx( WS_EX_APPWINDOW, //窗口扩展风格样式 cls_name, //窗口类名 TEXT("我的窗口"), //窗口标题 WS_OVERLAPPEDWINDOW, //窗口风格样式 200, 120, 600, 400, //窗口的x,y,宽度,高度 NULL, //父窗口句柄
NULL, //菜单句柄
hInstance, //程序实例句柄 NULL); //附加参数 //回调函数要写上默认的处理DefWindowProc,不然创建失败 if (!hWnd) return 1; //显示,更新窗口 ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: //关闭窗口消息 DestroyWindow(hWnd); break; case WM_DESTROY: //销毁窗口消息 PostQuitMessage(0); break; default: break; } //返回默认的消息处理函数,一定要写上这句才能创建成功 return DefWindowProc(hWnd, uMsg, wParam, lParam); }
编译运行如下图:


浙公网安备 33010602011771号