主要是给前面的内容做一个拓展,这个算是Win32的基础的东西了。
这里似乎并没有什么难点 – 以下代码是可以直接运行的…
我的环境是VS2013,没问题。
可能代码长度很长,我也不喜欢设置自动换行,所以教大家怎么展开这个代码:
大家可以在代码标题栏或者说工具栏里看到这个东西,它就是展开用的。
其实我建议把代码拷贝下来到VS里面,自己写一遍。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
#include <windows.h> #include <stdio.h> ////消息窗口 解析: ////int MessageBox( //// HWND hWnd , ////标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口。 //// LPCTSTR lpText , ////消息窗口显示的消息 //// LPCTSTR lpCaption , ////消息窗口的标题 //// UINT UType ////决定对话框的内容和行为的位标志集。 //// ); ////定义消息处理函数,当窗口处理消息事件时,系统调用该函数 LRESULT CALLBACK WinSunProc( HWND hwnd, ////窗口的句柄 UINT uMsg, ////消息的ID号 WPARAM wParam, ////消息所对应的参数 LPARAM lParam ////消息所对应的参数 ); ////主程序Main函数 int WINAPI WinMain( HINSTANCE hInstance, ////应用程序的句柄实例 HINSTANCE hPrevInstacne, ////该应用程序的前一个句柄实例 LPSTR lpCmdLine, ////命令行参数 int nCmdShow ////窗口的显示方式 ) { ////设计窗口类 ////窗口类源码: ////typedef struct tagWNDCLASSA { //// UINT style; //窗口类的风格 //// WNDPROC lpfnWndProc; //窗口处理函数 //// int cbClsExtra; //窗口类附加数据大小 //// int cbWndExtra; //窗口附加数据大小 //// HINSTANCE hInstance; //当前应用程序的实例句柄 //// HICON hIcon; //窗口图标 //// HCURSOR hCursor; //窗口的鼠标 //// HBRUSH hbrBackground; //窗口的背景画刷 //// LPCSTR lpszMenuName; //菜单 //// LPCSTR lpszClassName; //类型名称 ////} WNDCLASSA , *PWNDCLASSA , NEAR *NPWNDCLASSA , FAR *LPWNDCLASSA; ////typedef WNDCLASSA WNDCLASS; WNDCLASS wndcls;////定义一个窗口类 wndcls.cbClsExtra = 0; ////窗口类附加数据大小 wndcls.cbWndExtra = 0; ////窗口附加数据大小 wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); ////窗口的背景画刷 wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); ////窗口的鼠标 wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION); ////窗口的图标 wndcls.hInstance = hInstance; ////当前应用程序实例句柄 wndcls.lpfnWndProc = WinSunProc; ////窗口处理函数 wndcls.lpszClassName = TEXT("WinMain"); ////窗口类型名称 wndcls.lpszMenuName = NULL; ////菜单 wndcls.style = CS_HREDRAW | CS_VREDRAW; ////窗口类的风格 ////注册窗口类 ATOM nAtom = 0; nAtom = RegisterClass(&wndcls); if(nAtom == 0) { MessageBox(NULL, TEXT("Register Failed"), TEXT("Error"), MB_OK | MB_ICONERROR); return FALSE; } else { //MessageBox(NULL, TEXT("Register Successed"), TEXT("Successed"), MB_OK); } ////创建窗口 ////HWND CreateWindow( //// LPCTSTR lpClassName , //窗口类型名称 //// LPCTSTR lpWindowName , //窗口名称 //// DWORD dwStyle , //窗口类型 //// int x , //窗口的左上角X坐边 //// int y , //窗口的左上角X坐边 //// int nWidth , //窗口的宽度 //// int nHeight , //窗口的高度 //// HWND hWndParent , //父窗口句柄 //// HMENU hMenu , //窗口菜单句柄 //// HANDLE hInstance , //应用程序的实例句柄 //// LPVOID lpParam //创建的参数,一般为NULL ////); HWND hwnd; ////定义一个用来保存成功创建窗口后返回的句柄 hwnd = CreateWindow(TEXT("WinMain"), TEXT("TK-Xiong WinMain"), WS_OVERLAPPEDWINDOW, 300, 300, 600, 400, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, TEXT("Create Window Failed"), TEXT("Error"), MB_OK | MB_ICONERROR); PostQuitMessage(0);////创建窗口失败,发送一个退出消息 } else { //MessageBox(NULL, TEXT("Create Window Successed"), TEXT("Sucessed"), MB_OK); } ////显示窗口 //// BOOL ShowWindow( //// HWND hWnd , //显示的窗口句柄 //// int nCmdShow //显示的方式 //// ); ShowWindow(hwnd, SW_SHOWNORMAL); ////刷新窗口 UpdateWindow(hwnd); ////定义消息结构体,开始消息循环 //// GetMessage( //// LPMSG lpMsg , //指向MSG结构的指针,该结构从线程的消息队列里接收消息信息 //// HWND hWnd , //取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。 //// UINT wMsgFilterMin , //指定被检索的最小消息值的整数。 //// UINT wMsgFilterMax //指定被检索的最大消息值的整数。 //// ); ////如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。 ////如果出现了错误,返回值是-1。 BOOL bRet; MSG msg; while(bRet = GetMessage(&msg, hwnd, 0, 0)) { if(bRet == -1) { // handle the error and possibly exit return -1; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } ////编写窗口过程函数 LRESULT CALLBACK WinSunProc( HWND hwnd, ////窗口实例句柄 UINT uMsg, ////对应消息ID号 WPARAM wParam, ////消息的一个参数 LPARAM lParam ////消息的一个参数 ) { switch(uMsg) ////判断消息种类 { case WM_CHAR: ////按下键盘上的字母数字等等按键 wchar_t szChar[20]; wsprintf(szChar, TEXT("char code is %d"), wParam); MessageBox(hwnd, szChar, TEXT("char"), 0); break; case WM_LBUTTONDOWN: ////鼠标左键点击 MessageBox(hwnd, TEXT("Left Mouse Click"), TEXT("Message"), 0); HDC hdc; hdc = GetDC(hwnd); TextOut(hdc, 0, 50, TEXT("程序员之家"), lstrlen(TEXT("程序员之家"))); ReleaseDC(hwnd,hdc); break; case WM_PAINT: ////绘制消息 HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd, &ps); TextOut(hDC, 0, 0, TEXT("PAINT"), lstrlen(TEXT("PAINT"))); EndPaint(hwnd, &ps); break; case WM_CLOSE: ////关闭按钮消息 if(IDYES == MessageBox(hwnd, TEXT("是否真的结束?"), TEXT("Message"), MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY:////当窗口销毁时,会调用WinSunProc PostQuitMessage(0);////发送一个退出消息 break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } |
嗯,这个我觉得还是比较简单的,注释也很清楚,没有什么需要讲解的地方。
Win32标准窗口程序讲解