手机版

windows开发记事本程序纪实(二)逻辑第一章

时间:2021-09-10 来源:互联网 编辑:宝哥软件园 浏览:

1.主要内容

从这一部分开始,介绍了windows开发的记事本程序的逻辑实现。本节主要内容如下:

1.主窗口定义——主要介绍记事本主界面窗口对应的窗口类及其实现方案

2.RichEdit控件的选择和初始化——记事本程序中编辑控件的选择和使用

3.选择整个程序的图标。——程序图标设置

2.实际发展

2.1主窗口实现

在上一篇文章介绍的接口实现中,只给出了运行接口的效果,但当时接口程序无法响应任何windows消息,因为窗口创建时对应的过程处理程序被设置为NULL。现在,我们需要添加相应的过程处理程序,以便这个记事本应用程序能够响应我们发出的一系列类操作指令。因此,在本文的开发中,单独设计了一个保存主界面窗口的类CMainWnd。这个类定义了整个窗口的过程处理函数Main_Porc。在Main_Proc中,可以处理任何传入的消息(包括初始化窗口的消息、窗口中其他控件的消息、关闭窗口的消息等)。).以windows记事本为例,如图1所示

图1窗口主窗口的消息效果区

如上图所示,在windows记事本的主界面中,需要响应红色矩形区域的菜单控件的各种消息,黄色矩形区域的与系统按钮相关的消息,以及对应的Edit控件中的消息。Windows将在主窗口中以WM_COMMAND消息的形式传输各种控件的消息,这也是整个程序的核心处理区域。系统按钮关闭的信息是WM_CLOSE。窗口初始化消息WM_INITDIALOG是在建立对话框窗口之前发送的初始化消息。为了响应上面提到的各种消息,需要在CMainWnd中为这些类型的消息添加响应函数,所以整个CMainWnd的基本实现形式如下:

头文件声明:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *文件: CMainWnd.h *作者:李*日期: 2014年8月30日15:29336042 * Blogs : * TIPS :主窗口实现类,实现窗口的进程功能。消息响应功能等。*/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.//////////////////////////////////////////////.静态BOOL Main_OnInitDialog(HWND hWnd,HWND hWndFocus,LPARAM LPARAM);静态void Main_OnCommand(HWND hWnd,int id,HWND hWndCtl,LPARAM LPARAM);静态void Main _ OnClose(HWND HWND);private:静态HWND hMainWnd//主窗口句柄};#endifCMainWnd特定定义:

# include ' mainwnd . h ' include windowsx . h//////////////////////////////////////////////////////////////////静态数据membersHWND cmainwnd 3360: hmainwnd=NULL;//////////////////////////////////////////////.根据消息类型,处理各种消息boolwinapi cmainwnd :3360 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 : # 0000 ff ' return/span span style=' color : # 00000 ' FALSE;} BOOL cmainwnd : main _ OnInitDialog(HWND HWND,HWND hWndFocus,LPARAM LPARAM){ return TRUE;}//ID是特定空间的ID号,可以在资源中定义有意义的控件ID。例如,“打开文件”可以设置为id _ file _ openvoid cmainwnd 33603360 main _ on command(HWND,int id,hwndhwndctl,LPARAM LPARAM){ switch(id){//} } void cmainwnd 3360: main _ OnClose(HWND HWND){ : enddialog(HWND,NULL);}定义CMainWnd后,在主函数的DialogBox处添加主窗口的过程处理函数

: dialogbox(hininstance,makeinsource(IDD _ MAIN),NULL,cmainwnd 3360: MAIN _ Proc);以上步骤完成后,可以看到启动后的主界面可以响应窗口上的系统按钮“Close”,但是对于菜单控制的消息,由于消息响应仍然是函数的中间数,所以什么都不做,不会做任何处理。

2.2 richedit控件的选择

对于记事本程序来说,主界面上的核心区域仍然是编辑区域。但是,在当前记事本程序中没有选择任何编辑控件。通过观察现有的窗口控件列表,我们可以看到编辑控件和富编辑2.0控件都适合编辑控件。对于这两种编辑控件,编辑控件更简单,但响应功能更少。Rich Edit2.0控件实现起来比较复杂,但也有很多对应的功能(比如可以改变字体颜色和大小等)。).本文希望实现一个功能强大的记事本,所以选择了Rich Edit2.0 Control进行后续开发。插入富编辑2.0控件后,主界面窗口对应的资源视图如图2所示:

图2在IDD _ main中插入富编辑2.0控件

以上步骤运行后,我以为可以看到带有编辑界面的记事本程序,但实际上程序运行后没有任何效果,甚至主界面都无法正常启动。百度后来发现richedit启动失败的方法都是针对MFC程序的,需要增加初始化功能AfxInitRichEdit2。但是现在用windows API开发,没有AfxInitRichEdit2功能,只能另辟蹊径。最后,http://blog.csdn.net/dijkstar/article/details/7953816在一篇博文中提到,上面原来的初始化函数主要是加载RichEdit所依赖的dll,所以整个问题一下子就变得清晰了,我们只需要在主窗口启动之前手动加载这个dll。因此,在主函数的DialogBox前面,添加了如下根据加载dll的操作:

: loadlibrary(T(' riched 20 . dll '));在MAIN的属性中:

此时再次运行程序时,可以正常启动记事本,在richedit中进行编辑。效果如图3所示:

图3手动加载Riched20.dll后,出现主界面窗口

启动主界面后,可以正常编辑。这个控件似乎可以正常工作。但是,在实际测试中,发现了以下问题:

1.界面运行后,RichEdit边框的棱角过于尖锐

处理方法:Richedit控件的属性-边框-边框

2.输入回车时不能换行(手动输入时始终在同一行编辑)

处理方法:属性-多行Richedit控件的True

Richedit控件的属性-want return-true

3.没有滚动条(水平和垂直)

这是在主界面属性IDD上

处理方法:IDD _ main-properties-水平滚动条true

属性-垂直滚动条-真

4.无法根据窗口大小进行缩放

当窗口扩展和收缩时,RichEdit控件的大小保持不变,如图4所示:

图4当主界面大小改变时,RichEdit控件大小不变

其实这个问题很容易理解,因为当主界面窗口展开收缩时,windows会发送WM_SIZE消息通知窗口。这个过程类似于窗口对主界面窗口说“嗨,你的尺寸变了,你可以根据改变的尺寸来改变它”。目前我们的主窗口过程处理功能中,RichEdit并没有专门针对WM_SIZE消息进行处理,所以在上述情况发生之前,主界面下的RichEdit一直保持原来的大小。然后,具体的解决方案是在InitDialog中添加RichEdit大小自适应函数,并为WM_SIZE消息添加Main_OnSize函数来处理这个独立的控件。具体的代码实现如下:

void cmainwnd :3360 main _ OnSize(HWND HWND,UINT state,int cx,int cy){ RECT stRect;GetClientRect(hWnd,stRect);//获取窗口客户端区域大小/span span style=' color : # 008000 '///span span style=' color 3360 # 008000 '将RichEdit大小调整为客户端区域大小/span :移动窗口(:3360 getdlgitem(hWnd,IDC_RICHEDIT),stRect.left,stRect.top,stRect.right-stRect.left,stRect.bottom-stRect.top,TRUE);}这里,CMainWnd中只增加了WM_SIZE的消息响应函数。为了让RichEdit响应这个消息,需要在Main_Proc中添加相应的过程

HANDLE_MSG(hWnd,WM_SIZE,Main _ OnSize);这样,RichEdit可以随着主窗口的大小自由缩放。在上述流程处理函数中,主要调用了三个基本的API接口。

1.GetClientRect,这个API用来获取客户端区域的大小,RichEdit扩展的大小就是这个大小值

2.GetDlgItem获取窗口下某个控件的句柄,例如GetDlgItem(hWnd,IDC_RICHEDIT),可以在主窗口下获取RICHEDIT控件对应的句柄。

3.移动窗口.它的第一个参数是需要改变位置和大小的窗口句柄。这里我们传入2中的RichEdit句柄,下面的参数是矩形区域的左点、上点、宽度值和高度值。最后一个参数用于指示在大小改变后是否重新绘制窗口。请注意,此处选择了“真”。如果选择FALSE,会出现以下情况:当窗口变小时,RichEdit不会立即适应放大的区域,或者保持在原来的较小区域。效果如图5所示:

图5移动窗口中参数重绘设置为假后的潜在问题

基于此,当我们使用MoveWindow改变窗口大小时,最好将repaint设置为TRUE,以确保实时改变。

2.3主程序的ICON设计

从上面的截图可以看出,主界面左上角的ICON一直是windows自带的ICON。为了和windows自带的记事本类似,我在网上找了一个类似JPG的ICON,把它变成ICO,然后设置程序的图标。具体图标设置方法请参考http://www.cnblogs.com/lhglihuagang/p/3927283.html

设置好图标后,可以运行程序检查最新效果,如图6所示

图6设置程序图标后的结果

最后,对话框窗口的标题对话框有些不同。根据windows记事本的标题“无标题-记事本”,该值已相应修改,具体为IDD_MAIN-属性-标题-无标题-记事本最后,对话框。

3.操作结果

添加CMainWnd和RichEdit后,整个程序的运行效果如下图7所示:

图7本部分程序变更的影响

4.结论

1.使用RichEdit控件时,需要手动加载riched20.dll,否则程序运行后不会有界面效果。

2.RichEdit换行符、滚动条和边框可以通过属性中的相应字段进行设置

3.需要在CMainWnd中加入WM_SIZE消息响应功能,确保RichEdit可以自由伸缩。

5.参考链接

[1]http://blog.csdn.net/dijkstar/article/details/7953816

[2]http://www.cnblogs.com/lhglihuagang/p/3927283.html

[3]http://msdn . Microsoft.com/en-us/library/ms 633534(vs . 85)。aspx

6.描述

这将是一系列的博文,将继续补充逻辑功能的开发步骤。希望与更多博主交流。如果觉得这篇文章还行,请点赞,哈哈~ ~声明:如果没有说明,那么这篇文章就是原来的年糕。注:转载时必须保留全文。如有必要,请联系作者。

版权声明:windows开发记事本程序纪实(二)逻辑第一章是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。