关于NotePad一些功能的实现方法
NotePad功能:
1.向上查找,大小写,全字匹配,利用CFindDlg的基类的成员函数实现;
switch case
PreTranslateMessage()函数
http://blog.sina.com.cn/s/blog_9cd8465f01010cwe.html
http://blog.csdn.net/liuzhuomju/article/details/7380539
2.查找对话框只允许出现一次,但是是非模式对话框,为什么?因为1.不阻塞;2....
利用“if ...else...在主对话框Create CFindReplaceDialog之前判断”实现;
3.实现保存关闭时对话框的位置/大小和字体的信息,再次打开时加载上次信息
使用CWinAPP中的Profile相关函数实现退出时记录窗口位置和字体的功能,再次启动时位置和字体加载退出时的状态
3.1 需要用到CWinApp下的成员函数和成员变量:
m_pszProfileName 配置文件名(可以保存在注册表中也可以保存在ini配置文件中)
m_pszRegistryKey 注册表键值
GetProfileInt()
WriteProfileInt()
GetProfileString()
WriteProfileString()
SetRegistryKey()
3.2 保存到配置文件INI中,.ini文件默认保存在C:\Windows\下
void CTXTDlg::InitRect()
{
int nLeft = AfxGetApp()->GetProfileInt("SETTING","left",-);
if(nLeft<)
return;
int nRight = AfxGetApp()->GetProfileInt("SETTING","right",-);
if(nRight<)
return;
int nTop = AfxGetApp()->GetProfileInt("SETTING","top",-);
if(nTop<)
return; int nBottom = AfxGetApp()->GetProfileInt("SETTING","bottom",-);
if(nBottom<)
return;
MoveWindow(nLeft,nTop,nRight-nLeft,nBottom-nTop); } void CTXTDlg::OnDestroy()
{
CDialog::OnDestroy();
CRect rect;
GetWindowRect(rect);
theApp.WriteProfileInt("SETTING","left",rect.left);
theApp.WriteProfileInt("SETTING","right",rect.right);
theApp.WriteProfileInt("SETTING","top",rect.top);
theApp.WriteProfileInt("SETTING","bottom",rect.bottom); }
3.3 可以利用注册表信息来实现
a)注册表在cmd-regedit打开
b)在CWinAPP派生类中初始化时 SetRegistryKey()
在CTXTApp::InitInstance()中SetRegistryKey("TXT");这样WriteProfileInt()和GetProfileInt()是就都在注册表里面进行读写
3.4 同理字体也可是设置到注册表里面
void CTXTDlg::SaveFont()
{
CFont *pFont = GetDlgItem(IDC_TEXT)->GetFont();
LOGFONT lf;
pFont->GetLogFont(&lf);
theApp.WriteProfileString("FONT","NAME",lf.lfFaceName);
theApp.WriteProfileInt("FONT","Height",lf.lfHeight);
theApp.WriteProfileInt("FONT","CharSet",lf.lfCharSet);
theApp.WriteProfileInt("FONT","Weight",lf.lfWeight);
theApp.WriteProfileInt("FONT","Italic",lf.lfItalic);
theApp.WriteProfileInt("FONT","Underlne",lf.lfUnderline);
theApp.WriteProfileInt("FONT","StrikeOut",lf.lfStrikeOut); } void CTXTDlg::LoadFont()
{
LOGFONT lf = {};
CString str = theApp.GetProfileString("FONT","NAME",NULL);
if(str.GetLength())
{
strcpy(lf.lfFaceName,str);
lf.lfHeight = theApp.GetProfileInt("FONT","Height",);
lf.lfCharSet = theApp.GetProfileInt("FONT","CharSet",);
lf.lfWeight = theApp.GetProfileInt("FONT","Weight",);
lf.lfItalic = theApp.GetProfileInt("FONT","Italic",);
lf.lfUnderline = theApp.GetProfileInt("FONT","Underline",);
lf.lfStrikeOut = theApp.GetProfileInt("FONT","StrikeOut",);
m_font.CreateFontIndirect(&lf);
GetDlgItem(IDC_TEXT)->SetFont(&m_font);
}
}
在OnInitDialog里面加载,注意!在OnFormatFont里面保存。
4.PreTranslateMessage函数的使用(在class wizard中建立映射)可以实现快捷键设置的功能
关于PreTranslateMessage
MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。
顾名思义,PreTranslateMessage就是消息发送给窗口之前,提前拦截消息,然后对消息进行处理(即,改变了MFC的消息控制流程)
要注意一下两点:
1)是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
2)传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。
5.OnInitDialog在class wizard中添加如果找不到可以到最后一页的过滤器(Message filter)中设置为Dialog
6.实现快捷键的功能
定义快捷键的就是自定义加速键
1)首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称然后再设置你的快捷键
2)在.h文件中加入一个HACCEL hAccel;
3)变量然后在OnInitDialog或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN为加速键的资源文件名
4)最后在PreTranslateMessage(MSG* pMsg) 中加入:
if (m_hAccel)
{
if (::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
return TRUE;
}
这样 以后只要在Accelerator资源文件中添加快捷键就可以了
7.CFindReplaceDialog()这种非模式对话框建立“替代”和“替代全部”的映射方法:
方法一:
1.使用PreTranslateMessage()在消息传递之前拦截消息,提前处理
2.使用ON_BN_CLICKED(0X400,OnReplace)建立函数和控件的联系
方法二:
消息注册,消息映射,对话框创建(还不会用,有点复杂)
http://blog.sina.com.cn/s/blog_9cd8465f01010cwe.html
关于NotePad一些功能的实现方法的更多相关文章
- 在Excel中使用频率最高的函数的功能和使用方法
在Excel中使用频率最高的函数的功能和使用方法,按字母排序: 1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝 ...
- primace 5.0软件的Debug ware 功能的使用方法简介
用primace 软件已经一年多了,一直不知道Debug ware 软件怎么使用,上周终于逮住FAE请教了下这个功能的使用方法.发现这个功能和signalTap ii 原理不一样,这个是非时事的波形, ...
- duilib中控件拖拽功能的实现方法(附源码)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际 ...
- Format类及其子类功能和使用方法具体解释
Format类及其子类功能和使用方法具体解释 1. Format类结构: · java.lang.Object · java.text.Format · ...
- CPU-Z五大主要功能及使用方法初步了解
CPU-Z这款软件除了具有查看CPU温度这个功能之外,还有很多其他的功能.今天就和小编一起去看看CPU-Z的5大功能以及他们的使用方法吧! CPU信息标签页 CPU-Z介绍: CPU-Z是一款著名的免 ...
- ThinkPHP登录功能的实现方法
登陆功能是PHP程序设计中常见的功能.本文ThinkPHP实例主要完成注册成功后进入首页,并告诉你是登录用户的功能.具体实现步骤如下: 第一步:在config.php文件中加上: 完整实现代码如下: ...
- 关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法
关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法 1. 找到以下路径 ...\Kingdee\K3ERP\KDHR\SITEFILE\WEBUI\ 找到“Login.aspx” ...
- CDLinux 自动休眠功能的关闭方法
CDLinux 自动休眠功能的关闭方法: 控制台下使用xset命令来完成. xset q 可以查看当前屏幕保护和电源管理的状态信息 具体设置时,常用的有以下参数: xset s //这个参数设置屏 ...
- 织梦dedecms页面中增加二维码功能的实现方法
本文介绍了在dedecms中增加二维码功能的实现方法,有时需要在dedecms页面增加二维码,方便手机用户访问,有需要的朋友参考下. 本节内容: dedecms中增加二维码功能 1.打开/incl ...
随机推荐
- 原创jquery插件treeTable(转)
由于工作需要,要直观的看到某个业务是由那些子业务引起的异常,所以我需要用树表的方式来展现各个层次的数据. 需求: 1.数据层次分明: 2.数据读取慢.需要动态加载孩子节点: 3.支持默认展开多少层. ...
- C#基础系列——多线程的常见用法详解
前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从 ...
- centos
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linu ...
- 第二次团队作业——预则立&&他山之石
Deadline: 2016.10.16 22:00pm 一.确立团队选题,建立和初步熟悉团队git的协作方式.项目后续的代码.文档都要通过github增量式管理.实现文档的版本化和增量式管理. 二. ...
- canvas链式弹性运动
上一课我学习了相对于鼠标为目标点的弹性运动,这次就学习了如何以上一个球为目标点的弹性运动,这次的函数比较复杂,首先分成了如下几个函数,首先定义了一个球的model,之后添加了4个球,在加载中调用了动画 ...
- 彻底理解js中this的指向,不必硬背。
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- 关于svg格式图片颜色更改
利用 style="fill:#8a8acb" 放在path标签下面. 技巧:比如一个svg是一个圆圈内包含一个问号,问号内填充白色,圆圈内,问号外,填充其他颜色,如蓝色.可 设置 ...
- CSS-border属性制作小三角
1--三角向上下左上.右上.右下.左下这四个方向突出的样式 向左上角突出: border-color: transparent transparent transparent #FFCC00; bor ...
- 三列等高 css实现
实现这个三列等高 布局需要最外层的一个div wrap容器 里面有三个div容器 这个最外层div 需要移除隐藏 overflow:hidden; 关键点就是三列div 同时margin-botto ...
- junit学习笔记
junit编程规范 测试方法上必须使用@Test进行修饰 测试方法必须使用public void 进行修饰,不能带任何的参数 新建一个源代码目录 测试类的包应该和被测试类保持一致 测试单元中的每个方法 ...