/************************************************************************/
/* file : CMainWnd.h
* author : Huagang Li
* date : 2014-8-30 15:29:42
* blogs : http://www.cnblogs.com/lhglihuagang/
* tips : 主窗口实现类, 实现窗口的过程函数,消息响应函数等
*/
/************************************************************************/
#ifndef _MAIN_WND_H
#define _MAIN_WND_H
#include <Windows.h>
//////////////////////////////////////////////////////////////////////////
// CMainWnd 主窗口类,提供
class CMainWnd
{
public:
static BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static BOOL Main_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam);
static void Main_OnCommand(HWND hWnd, int id, HWND hWndCtl, LPARAM lParam);
static void Main_OnClose(HWND hWnd);
private:
static HWND hMainWnd; // 主窗口句柄
};
#endif
#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);
}
::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所示: [img]http://files.jb51.net/file_images/article/201408/2014083110085112.jpg[/img] 图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的操作如下:
::LoadLibrary(T("riched20.dll"));
void CMainWnd::Main_OnSize( HWND hWnd, UINT state, int cx, int cy )
{
RECT stRect;
::GetClientRect(hWnd, &stRect); // 获取窗口客户区大小
</span><span style="color: #008000">//</span><span style="color: #008000"> 将RichEdit大小调整为客户区大小</span>
::MoveWindow(::GetDlgItem(hWnd, IDC_RICHEDIT), stRect.left, stRect.top,
stRect.right-stRect.left, stRect.bottom-stRect.top, TRUE);
}
HANDLE_MSG(hWnd, WM_SIZE, Main_OnSize);这样,RichEdit也就可以跟着主窗口大小自由伸缩了。上述过程处理函数中,主要调用了三个基本的API接口。 1. GetClientRect,这个API用于获取客户区大小,RichEdit伸缩的大小就是这个大小值 2. GetDlgItem 获取窗口下某一个控件的句柄,例如GetDlgItem(hWnd, IDC_RICHEDIT),就可以获得主窗口下RichEdit控件对应的句柄。 3. MoveWindow。它的第一个参数就是需要进行位置大小变化的窗口句柄。我们这里将2中的RichEdit句柄传入,后面的参数分别是矩形区域的left点,top点,width值以及height值。最后一个参数用来表示大小改变后要不要重绘窗口。注意,这里选择了TRUE。如果选择FALSE,会出现以下这种情况:当将窗口变小后,在进行变大操作,RichEdit并没有立即适应变大后的区域,还是保留在原来变小的区域。效果如图5所示: [img]http://files.jb51.net/file_images/article/201408/2014083110085115.jpg[/img] 图5 MoveWindows中参数repaint设置为FALSE后潜在问题 基于此,我们在用MoveWindow改变窗口大小时,最好使得repaint为TRUE,保证实时改变。 2.3 主程序ICON设计 在上述截图中可以看出,主界面的左上角ICON一直是windows自带的ICON。为了与windows自带记事本做到类似,直接到网上找了一个类似的JPG图标转为ICO,然后设置了程序的ICON。具体的图标设置方法请参考http://www.cnblogs.com/lhglihuagang/p/3927283.html 在图标设置后,可以运行程序查看下最新的效果,如图6所示 [img]http://files.jb51.net/file_images/article/201408/2014083110085116.jpg[/img] 图6 设置程序图标后的结果 最后,对话框窗口的标题Dialog实在显得有些另类,这里根据windows自带记事本的标题“无标题 - 记事本”,将这个值进行了相应的修改,具体为IDD_MAIN-> properties -> Caption –> 无标题 - 记事本最后,对话框. [b]3. 运行结果[/b] 在添加了CMainWnd以及RichEdit后,整个程序的运行后效果如下图7所示: [img]http://files.jb51.net/file_images/article/201408/2014083110085117.jpg[/img] 图7 本节程序改动后的效果 [b]4. 结论[/b] 1. 使用RichEdit控件时,需要手动加载riched20.dll,否则程序运行后没有任何界面效果 2. RichEdit换行、滚动条、边框都可以通过properties中相应字段进行设置 3. 需要在CMainWnd中添加WM_SIZE消息响应函数,保证RichEdit自由伸缩。 [b]5. 参考链接[/b] [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/ms633534(VS.85).aspx [b]6. 说明[/b] 这将是一个系列博文,后面会继续补充逻辑功能的开发的步骤。希望能与更多博友交流。 如果你觉得这篇文章还可以,请点赞,哈哈~~ 声明:未作说明,则本文为年糕原创。 注意:转载须保留全文,如需修改请 联系作者。
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有