windows开发记事本程序纪实(二)逻辑篇1(2)
CMainWnd具体定义:
#include "MainWnd.h" include <WindowsX.h> ////////////////////////////////////////////////////////////////////////// // static data members HWND CMainWnd::hMainWnd = NULL; ////////////////////////////////////////////////////////////////////////// // static function members // 主窗口的过程函数,根据消息类型处理各类消息 BOOL WINAPI CMainWnd::Main_Proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd, WM_CLOSE, Main_OnClose); } </span><span style="color: #0000ff">return</span><span style="color: #000000"> FALSE; } BOOL CMainWnd::Main_OnInitDialog( HWND hWnd, HWND hWndFocus, LPARAM lParam ) { return TRUE; } // id为具体空间的ID号,可以在resource中定义有意义的控件ID,如“打开文件”可以设置 // 为ID_FILE_OPEN void CMainWnd::Main_OnCommand( HWND hWnd, int id, HWND hWndCtl, LPARAM lParam ) { switch (id) { // } } void CMainWnd::Main_OnClose( HWND hWnd ) { ::EndDialog(hWnd, NULL); }
在定义了CMainWnd后,在main函数处的DialogBox处添加主窗口的过程处理函数
::DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, CMainWnd::Main_Proc);
完成上述步骤运行后,就可以看到启动后的主界面可以响应窗口上系统按钮“关闭”,但是对于菜单控件的消息,因为消息响应此还是函数中数什么都没有做,因此还是不会进行任何处理。
2.2 RichEdit控件的选用
对于一个记事本程序来说,主界面上核心区域还是编辑区域。但是当前记事本程序中还没有选择任何编辑控件。通过观察现有windows控件列表可以看出,适合编辑控件的有Edit Control以及Rich Edit2.0 Control。对于这两种编辑控件,Edit Control较为简单,但是响应的功能也较少。Rich Edit2.0 Control实现起来较为复杂,但是对应的功能也多了不少(例如可以改变字体颜色,字号等等)。本文希望能够实现一个功能较强的记事本,因此选择了Rich Edit2.0 Control进行后续开发。插入了Rich Edit2.0 Control后,主界面窗口对应的资源视图如图2所示:
图2 IDD_MAIN中插入Rich Edit2.0 Control
上述步骤运行后,本以为可以看到带有编辑界面的记事本程序,可是实际上程序运行后没有任何效果,甚至主界面都不能正常启动了。百度后发现,对于richedit启动失败的方法都是针对MFC程序来说的,需要添加初始化函数AfxInitRichEdit2。但是现在使用windows API 开发,并没有AfxInitRichEdit2这个函数,只能另寻他路了。终于在一篇博文中http://blog.csdn.net/dijkstar/article/details/7953816提到,原来上面那个初始化函数中主要是加载RichEdit依赖的dll,那么整个问题就豁然开朗了,我们只需要在主窗口启动前手动的载入这个dll就可以了。因此在主函数的DialogBox前添加了依据载入dll的操作如下: