今天终于开始学习MFC了。第一天主要是先认识一下win32的这个小框架 //可见使用回调函数的编程模式,可以根据不同的需求传递不同的回调函数地址,或者定义各种回调函数的原形(同时也需要改变使用回调函数的参数和返回值约定),实现多种回调事件处理,可以使程序的控制灵活多变,也是一种高效率的,清晰的程序模块之间的耦合方式。在一些异步或复杂的程序系统里尤其有用 -- 你可以在一个模块(如DLL)里专心实现模块核心的业务流程和技术功能,外围的扩展的功能只给出一个回调函数的接口,通过调用其他模块传递过来的回调函数地址的方式,将后续处理无缝地交给另一个模块,随它按自定义的方式处理。 #include <windows.h> #include <stdio.h> LRESULT CALLBACK WinSunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { WNDCLASS wndcls; wndcls.cbClsExtra = 0; // 通常为0 wndcls.cbWndExtra = 0; // 通常为0 wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 黑色,注意强转 wndcls.hCursor = LoadCursor(NULL, IDC_CROSS); // 当前所以为NULL,十字光标 wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); // 使用Microsoft标准图标,使用 NULL wndcls.hInstance = hInstance; // 当前实例 wndcls.lpfnWndProc = WinSunProc; // 回调函数 wndcls.lpszClassName = "Beijing"; // 类名,指定窗口的类名 wndcls.lpszMenuName = NULL; // 无菜单 wndcls.style = CS_HREDRAW | CS_VREDRAW; // 水平重画,垂直重画 RegisterClass(&wndcls); HWND hwnd; hwnd = CreateWindow("Beijing", // 名字必须与设计出的窗口类类名相同,要使用给予已经注册过类名创建 "2008", WS_OVERLAPPEDWINDOW, 100,100, // x, y坐标 600, 400, // 宽度、高度 NULL, // 父窗口 NULL, // 菜单 hInstance, // 当前实例句柄 NULL); // 参数,一般为NULL ShowWindow(hwnd, SW_SHOWNORMAL); // 显示窗口 UpdateWindow(hwnd); // 消息循环 MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) // NULL:获取属于调用线程的任何窗口消息 { TranslateMessage(&msg); // 转换消息 DispatchMessage(&msg); // 将消息传给回调函数 } return 0; } 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_CHAR: { char szChar[20] = ""; sprintf(szChar, "The char is %d", wParam); MessageBox(hwnd, szChar, "CHAR", 0); } break; case WM_LBUTTONDOWN: MessageBox(hwnd, "The mouse clicked .", "MOUSE", 0); HDC hdc; hdc = GetDC(hwnd); TextOut(hdc, 100, 100, "Beijing2008", strlen("Beijing2008")); ReleaseDC(hwnd, hdc); break; case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 0, 0, "窗口开始...", strlen("窗口开始...")); EndPaint(hwnd, &ps); } break; case WM_CLOSE: if( IDYES == MessageBox(hwnd, "是否真的要退出?", "Quit", MB_YESNO) ) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } 实现点击鼠标左键不断的变换窗口标题,在message处理里面添加如下代码 case WM_LBUTTONDOWN: { static WORD n=0; if(n=~n) SetWindowText(hWnd, "1"); else SetWindowText(hWnd, "2"); }