一步步用SDK构建记事本程序(二)

来源:互联网 发布:淘客助手插件 mac 编辑:程序博客网 时间:2024/06/10 23:03

 上一篇文章仅仅写了个框架未实现什么功能。

下面来添加功能。

 

对了,这里不要疏忽一个问题。不要急于编码,呵呵,我刚才有点急于编码了:)

编码之前要保持设计清晰,否则可能到开发后期,功能逻辑复杂是的我们迷惑于其中了。

 

整理一个记事本大体结构:

 

接下来,考虑下界面是什么样子:

例如Windows的记事本程序:

这里不需要MDI(多文档视图),为了偷懒好听点说是简单起见 我将Edit子视图(其实在这里就是个子窗口)

直接在第一篇写的框架所生成的主窗口MainWindow里创建。

 

这里需要在主窗口创建的东西有:菜单栏,如果需要还可以加如工具栏;Edit窗口;状态栏。

创建这些控件(Static,Edit,RichEdit,Button...)都使用CreateWindow加具体控件类名来生成的,只要记住控件也是窗口就好了,拿Edit控件来说,在MFC里面表现为

class CEdit : public CWnd
 
下面创建Edit窗口,我这里用的是RichEdit.
关键代码
hwndRichEdit = CreateWindow(TEXT("RichEdit"),TEXT(""),WS_CHILD | WS_VISIBLE,
   0,0,800,600,
   hWnd,NULL,GetModuleHandle(NULL),NULL);
在这里顺便把主菜单也实现了
操作如下:
1.VS2008主菜单“项目”->添加新项
 
添加一个资源文件resource.rc(文件名自定)
 
右键菜单点击“添加资源”
 
新建一个Menu
 
将菜单ID命名为IDR_MENU_MAIN
修改程序,我之前在程序框架里有关主菜单引用的地方都被赋值为NULL了:)
在窗口类注册的地方和创建主窗口的地方均有对菜单ID的引用
我们来改
在注册窗口类前
wcex.lpszMenuName = NULL; -> wcex.lpszMenuName = IDR_MENU_MAIN;
别忘了在程序代码开始的地方添加对资源引用的头文件resource.h
编译一下吧:)
这里还要说的一点 对于RichEdit控件创建后无法直接显示 必须调用InitCommonCtrls()这个函数和装载对应的控件库(.dll)
【以上文章和以下代码如果那里不妥,或有好的建议请留言指出,谢谢。正好学习交流下:)】
完善后的代码:
  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include "resource.h"
  4. #pragma comment(lib,"comctl32")
  5. LRESULT CALLBACK WndProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam);
  6. int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
  7. {   
  8.     WNDCLASSEX  wcex = {0};
  9.     TCHAR       szAppName[] = TEXT("SigmaTera Notepad");
  10.     MSG         msg = {0};
  11.     HWND        hWnd = NULL;
  12.     //填充窗口类结构
  13.     wcex.cbClsExtra = 0;
  14.     wcex.cbSize = sizeof (WNDCLASSEX);
  15.     wcex.cbWndExtra = 0;
  16.     wcex.hbrBackground = (HBRUSH)COLOR_WINDOW;
  17.     wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
  18.     wcex.hIcon = LoadIcon(hInstance,IDI_APPLICATION);
  19.     wcex.hIconSm = wcex.hIcon;
  20.     wcex.hInstance = hInstance;
  21.     wcex.lpfnWndProc = WndProc;
  22.     wcex.lpszClassName = szAppName;
  23.     wcex.lpszMenuName = (LPCTSTR)IDR_MENU_MAIN;
  24.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  25.     InitCommonControls();
  26.     HMODULE hRichEditLib = LoadLibrary(TEXT("RICHED32.DLL"));
  27.     //注册窗口类
  28.     if (RegisterClassEx(&wcex) == NULL)
  29.     {
  30.         return -1;
  31.     }
  32.     //创建窗口
  33.     hWnd = CreateWindow(szAppName,TEXT("Notepad"),WS_OVERLAPPEDWINDOW,
  34.                         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  35.                         NULL,NULL,hInstance,NULL);
  36.     
  37.     if (NULL == hWnd)
  38.     {
  39.         return -1;
  40.     }
  41.     //显示并更新窗口
  42.     ShowWindow(hWnd,SW_SHOW);
  43.     UpdateWindow(hWnd);
  44.     //消息循环
  45.     while (GetMessage(&msg,NULL,0,0))
  46.     {
  47.         TranslateMessage(&msg);
  48.         DispatchMessage(&msg);
  49.     }
  50.     FreeLibrary(hRichEditLib);
  51.     return 0;
  52. }
  53. LRESULT CALLBACK WndProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam)
  54. {
  55.     static HWND hwndRichEdit = NULL;
  56.     
  57.     switch (uMessage)
  58.     {
  59.     case WM_CREATE:
  60.         hwndRichEdit = CreateWindow(TEXT("RichEdit"),TEXT(""),WS_CHILD | WS_VISIBLE,
  61.             0,0,800,600,
  62.             hWnd,NULL,GetModuleHandle(NULL),NULL);
  63.         break;
  64.     case WM_CLOSE:
  65.         DestroyWindow(hWnd);
  66.         break;
  67.     case WM_DESTROY:
  68.         PostQuitMessage(0);
  69.         break;
  70.     }
  71.     /*else if (uMessage == WM_CLOSE)
  72.     {
  73.         
  74.     }
  75.     else if (uMessage == WM_DESTROY)
  76.     {
  77.         
  78.     }*/
  79.     return DefWindowProc(hWnd,uMessage,wParam,lParam);
  80. }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不知道自己想要做什么工作怎么办 三星note4微信出现闪退怎么办 魅蓝note6手机自动闪退怎么办 苹果6s系统内存占用量过大怎么办 想在一年通过会计初级和中级怎么办 特殊岗位退休档察写的力工怎么办 面试时期望工资说低了。怎么办 面试时期望薪资写低了怎么办 高考后比一模差了80分怎么办 戒了烟我不习惯没有你我怎么办 没有你我不习惯没有你我怎么办 做什么都没兴趣嫌麻烦怎么办 快递还在路上就确认收货了怎么办 微信显示时间与手机不符怎么办 微信提示银行卡预留手机不符怎么办 得了湿疹后吃了海鲜严重了怎么办 看到小区街道乱扔的垃圾你会怎么办 去韩国干服务员不会讲韩语怎么办 华为手机键盘变英文字母大了怎么办 淘宝申请售后卖家余额不足怎么办 发票名称少写了一个字怎么办 微博数量与实际数量不一致怎么办 在淘宝中要买的商品卖完了怎么办 病因写错了保险不报销怎么办? 上学期间保险名字写错了怎么办 塑料盆上的商标纸撕了胶怎么办 川航买机票名字错了两个字怎么办 买机票护照号码填错了怎么办 换旅行证给孩子改名字怎么办 浦发信用卡卡片名字印错了怎么办 公主工作很辛苦坚持不下去怎么办 在表格里怎么办名字转换成拼音 激素脸有黑头毛孔大该怎么办 兢兢业业上班但不招领导喜欢怎么办 身体长的还算苗条但就屁股大怎么办 我想学英语从基础开始要怎么办 政府单位领导给我调岗我该怎么办 领导在单位想捞钱我该怎么办 单位领导是宵小之人我该怎么办 一件事想不明白非得想明白怎么办 在四楼上课时发生地震该怎么办