学习日记……
2009年2月24日
如果不会SDK编程,MFC实在是像水中月,能看到却掌握不了……
Win32编程的开始就是了结Windows编程的概念。在Windows下,基本所有程序的功能都是通过直接或间接调用Windows API函数来完成的。
使用VC6编程,选择Win32 Application,建立空工程并添加一个cpp文件
Windows程序总是从WinMain()开始运行,如从前的控制台程序总是从main()开始运行。操作系统(实际上是程序的起始代码)将调用WinMain开始运行程序。
作为完全手动编写的第一个程序:
#include<windows.h> LRESULT CALLBACK WindowProc( 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, // command line int nCmdShow // show state ) //hPrevInstance已经不再使用 { //新建一个窗口类 WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)CreateSolidBrush(/*100<<16 | 100<<8 | 100)*/RGB(100,100,100)); // wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); wndcls.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WindowProc; wndcls.lpszClassName="Imoagn"; wndcls.lpszMenuName=NULL; wndcls.style=0; RegisterClass(&wndcls); HWND hwnd=CreateWindow("Imoagn","Imoagn", WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); break; } return 0; }
WinMain可以从MSDN复制下声明来,其中的最常用的参数是hInstance,代表此程序的句柄(不知道同线程、进程对应关系如何呢……待解决)
最简单的Windows窗口应用程序的框架是:
两个函数:WinMain函数、WindowProc函数(此函数名自定,参数声明是固定的,从MFC中查找声明)
其中WinMain函数的内容:
实践总结:
欠缺:对CS、WS等开头的窗口样式十分陌生,有待熟悉。