首页 > 代码库 > win32窗口程序的过程
win32窗口程序的过程
复习一下win32窗口程序
设计一个窗口类;
注册窗口类;
创建窗口;
显示及更新窗口。
消息循环,去获取消息;
窗口过程函数的消息响应。
设计窗口类:
typedef struct _WNDCLASS {UINT style; //窗口类的类型WNDPROC lpfnWndProc; //窗口过程函数(回调函数) int cbClsExtra; //为该类设定额外内存空间 int cbWndExtra; //为该窗口设定额外内存空间 HANDLE hInstance; //当前应用程序的实例号 ICON hIcon; //图标,一般用LoadICON函数赋值 HCURSOR hCursor; //光标,一般用LoadCursor函数赋值 HBRUSH hbrBackground; //窗口背景GetStockObject() LPCTSTR lpszMenuName; //设置菜单名(常量字符串) LPCTSTR lpszClassName; // 设计一个窗口类的名字} WNDCLASS;
窗口类的类型:
在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。我们使用goto definition就能发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE实现。
窗口过程函数:
第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。
注册窗口类:
RegisterClass(&wndclass);
创建窗口:
HWND CreateWindow( LPCTSTR lpClassName, // pointer to registered class name LPCTSTR lpWindowName, // pointer to window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // handle to menu or child-window identifier HANDLE hInstance, // handle to application instance LPVOID lpParam // pointer to window-creation data );
显示及更新窗口:
The ShowWindow function sets the specified window‘s show state. BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); BOOL UpdateWindow( HWND hWnd // handle of window );
消息循环(获取消息):
BOOL GetMessage( LPMSG lpMsg, // address of structure with message HWND hWnd, // handle of window UINT wMsgFilterMin, // first message UINT wMsgFilterMax // last message );
MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
窗口过程函数(回调函数):
LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter){ switch(uMsg) { case WM_LBUTTONDOWN: break; case WM_CLOSE: break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;}
//孙鑫视频案例代码参考//运行环境Visual C++ :新建 Win32 Application(注意类型) 工程 ,再新建WinMain.cpp C++源文件)//win32窗口程序#include <windows.h>#include <stdio.h>//窗口过程函数声明LRESULT CALLBACK WinKevinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ //设计一个窗口类 WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wndcls.hIcon = LoadIcon (NULL,IDI_ERROR); wndcls.hCursor = LoadCursor (NULL,IDC_CROSS); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WinKevinProc; //回调函数 wndcls.lpszClassName = "zcx"; wndcls.style = CS_HREDRAW | CS_VREDRAW; wndcls.lpszMenuName = NULL; //注册窗口类 RegisterClass(&wndcls); //创建窗口,保存窗口句柄 HWND hwnd; hwnd = CreateWindow ("zcx","**大学", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL ); //显示和刷新窗口 ShowWindow (hwnd, SW_SHOWNORMAL); UpdateWindow (hwnd); //定义消息结构体,开始消息循环 MSG msg; while (GetMessage (&msg, NULL, 0, 0 )) { TranslateMessage (&msg); DispatchMessage (&msg); }//endof while return 0;} //endof winMain()//编写窗口过程函数LRESULT CALLBACK WinKevinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf (szChar , "char is %d",wParam); MessageBox(hwnd,szChar,"zcx",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","zcx",0); HDC hdc; hdc = GetDC(hwnd); //不能在响应WM_PAINT消息时调用 TextOut (hdc,0,50,"**大学",strlen("**大学")); ReleaseDC (hwnd,hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd,&ps); //只能在响应WM_PAINT消息时调用 TextOut(hDC,0, 0, "zcx",strlen("zcx")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES == MessageBox(hwnd,"是否真的退出程序?","弹窗提示",MB_YESNO)) { DestroyWindow(hwnd); }//ENDOF IF break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg, wParam, lParam); }//endof swith() return 0;}//end of WinSunProc()