大致流程:
1. 写WinMain函数,即入口函数。 2. 创建一个窗口类,创建窗口,设置刷新等等。 3. 进行消息循环。 4. 编写窗口过程函数。先看看WinMain函数:
int WINAPI WinMain( HINSTANCE hInstance, // 当前实例句柄 HINSTANCE hPrevInstance, // 前一个实例句柄 LPSTR lpCmdLine, // 命令行参数 int nCmdShow // 如何显示 )
再看看怎么创建窗口:
说在前面:关于样式之类的请查看MSDN或者百度。 1. 设计窗口类:typedef struct _WNDCLASS { UINT style;// 窗口样式 WNDPROC lpfnWndProc;//函数指针,指向窗口处理函数 int cbClsExtra;//附加内存,一般为0 int cbWndExtra;//窗口附加内存,一般也为0 HINSTANCE hInstance;//实例句柄 HICON hIcon;//窗口的图标句柄 HCURSOR hCursor;//窗口鼠标光标 HBRUSH hbrBackground;//窗口背景色 LPCTSTR lpszMenuName;//窗口菜单名 LPCTSTR lpszClassName;// 窗口类名} WNDCLASS, *LPWNDCLASS;
2.注册窗口类
RegisterClass(&窗口类);//注册窗口类
3.创建窗口
HWND CreateWindow( LPCTSTR lpClassName,//类名 LPCTSTR lpWindowName,//窗口名 DWORD dwStyle,//样式 int x,//初始x坐标 int y,//初始y坐标 int nWidth,//窗口宽度 int nHeight,//窗口高度 HWND hWndParent,//父窗口句柄 HMENU hMenu,//菜单句柄 HANDLE hlnstance,//实例句柄 LPVOID lpParam//数据指针,指向CLIENTCREATESTRUCT结构体,一般指向NULL );
4.显示和刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);//激活并显示UpdateWindow(hwnd);
MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
也就是第一章说的那个卖冰淇淋的,不断接受消息,查看对应事件,并处理,处理的过程在窗口过程函数。
编写窗口处理函数:
其实就是个回调函数,当消息进来的时候,判断属于哪个消息,然后进行对应操作。LRESULT CALLBACK WinSunProc( HWND hwnd, //句柄 UINT uMsg, //消息 WPARAM wParam, //附加参数1 LPARAM lParam //附加参数2 ){ switch(uMsg) { case WM_CHAR: char szChar[200]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"HappyTeemo",0); break; case XXX: ........ } return 0;}
下面是整体代码:所有是HappyTeemo的都是可以自由修改的
#include#include //声明窗口过程函数LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );//主函数int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ){ const char* ClassName = "HappyTeemo"; //设计窗口类 WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor = LoadCursor(NULL,IDC_CROSS); wndcls.hIcon = LoadIcon(NULL,IDI_ERROR); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WinSunProc; wndcls.lpszClassName = ClassName; wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls);//注册窗口类 //创建窗口 HWND hwnd; hwnd = CreateWindow(ClassName,"HappyTeemoFirstWindow",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); } return msg.wParam;}//窗口过程函数LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){ switch(uMsg) { case WM_CHAR: //按下字符键 char szChar[200]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"HappyTeemo",0); break; case WM_LBUTTONDOWN://鼠标左键 MessageBox(hwnd,"mouse clicked","HappyTeemo",0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,"HappyTeemo",strlen("HappyTeemo")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: //重绘 HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"HappyTeemo",strlen("HappyTeemo")); EndPaint(hwnd,&ps); break; case WM_CLOSE://关闭 if(IDYES==MessageBox(hwnd,"Close?","HappyTeemo",MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY://销毁 PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0;}