helloCE源码如下:
在WINCE中,WIN32程序和其他WINDOWS程序一样,入口点为WinMain函数,在WinMain函数总,首先调用了InitApp,我们来看看它都做了什么
int InitApp (HINSTANCE hInstance) {
WNDCLASS wc;
// Register application main window class.
wc.style = 0; // Window style
wc.lpfnWndProc = MainWndProc; // Callback function
wc.cbClsExtra = 0; // Extra class data
wc.cbWndExtra = 0; // Extra window data
wc.hInstance = hInstance; // Owner handle
wc.hIcon = NULL, // Application icon
wc.hCursor = NULL; // Default cursor
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL; // Menu name
wc.lpszClassName = szAppName; // Window class name
if (RegisterClass (&wc) == 0) return 1;
return 0;
}
可以看到,InitApp的工作就是填充WNDCLASS结构体,并将其注册。在这里比较重要的就是lpfnWndProc这个字段,lpfnWndProc指向了MainWndProc这个回调函数(MainWndProc是用户自定义的函数,修改成其他名称也可以)。MainWndProc函数是整个WIN32程序的消息处理入口, MainWndProc函数内容如下:
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
INT i;
//
// Search message list to see if we need to handle this
// message. If in list, call procedure.
//
for (i = 0; i < dim(MainMessages); i++) {
if (wMsg == MainMessages[i].Code)
return (*MainMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
}
return DefWindowProc (hWnd, wMsg, wParam, lParam);
}
在MainWndProc中用了一个循环体来查询系统消息并返回对应消息的处理函数
在文件头有如下的定义:
const struct decodeUINT MainMessages[] = {
WM_CREATE, DoCreateMain,
WM_PAINT, DoPaintMain,
WM_HIBERNATE, DoHibernateMain,
WM_ACTIVATE, DoActivateMain,
WM_DESTROY, DoDestroyMain,
};
WM_CREATE:
WM_CREATE消息是发送到窗口的第一条消息,由WINDOWS处理CreateWindows函数时发送它,当WINDOWS接收到WM_CREATE消息就立即执行DoCreateMain函数,DoCreateMain函数中创建了一个用于该窗口的命令栏。
WM_PAINT:
WM_PAINT消息对应的函数DoPaintMain用于绘制窗口,在这里完成我们这个程序的核心功能——“Hello Windows CE!” :)
WM_HIBERNATE:
WM_HIBERNATE消息可是WINCE所独有的哦,它被发送到某个窗口使得对应窗口的内存使用量减到最小。由于我们这个程序很简单,没什么好破坏的,减少内存的使用的唯一方法也就只能破坏命令栏控件了,呵呵。
破坏方法:
if (GetActiveWindow () != hWnd)
CommandBar_Destroy (GetDlgItem (hWnd, IDC_CMDBAR));
WM_ACTIVATE:
WM_ACTIVATE消息的作用是指出窗口应该恢复任意WM_HIBERNATE消息释放的数据结构或者窗口控件。
WM_DESTROY:
WM_DESTROY消息是我们这个程序必须处理的最后一条消息,在DoDestroyMain函数中调用PostQuitMessage函数,PostQuitMessage函数在消息队列中加入一条WM_QUIT消息,系统接到WM_QUIT消息我们的程序就GAME OVER啦。
貌似InitInstance函数忘记说了,这个函数就是完成窗口的创建,没啥好说的,呵呵!
基本上,这段代码是每一个WIN32程序都有的,是WIN32程序的最小框架,再复杂的程序,也是通过这个框架扩充。感觉理解了WIN32的程序,再来用MFC,有些地方茅塞顿开,让我这个VC菜鸟也提升了一大截,嘿嘿~~