MFC第十八天 非模式对话框、对话框颜色管理、记事本项目(查找替换、文字和背景色、Goto(转到)功能的开发)

文章目录

  • 非模式对话框
    • 非模式对话框的特点
    • 非模式对话框与QQ聊天窗口开发
    • 非模态对话框(Modeless Dialog)和模态对话框(Modal Dialog)区别
  • 记事本开发
    • CFindReplaceDialog类的成员
    • 查找替换(算法分析)
    • 使用RichEdit控件 开发Goto(转到)功能
  • 对话框颜色管理
    • WM_CTLCOLOR控件
    • 记事本中文字颜色和背景颜色功能开发

非模式对话框

非模式对话框的特点

a)调用CDialog::Create函数实现,例如:QQ的聊天框,记事本的查找等。
b)非阻塞,对象的生命期必须足够,否则就析构时摧毁了。
c)可以采用堆空间申请多例模式,也可以用全局或者成员。
d)EndDialog只对模式对话框有效,对非模式对话框无效,如果要摧毁调用DestroyWindow
(只是隐藏了窗口,不会摧毁窗口,ShowWindow还可以再重新显示)
e)如果要让非模式对话框与主窗口形成兄弟关系,在任务栏中有图标,
就在pParent参数中代入GetDesktopWindow()

非模式对话框与QQ聊天窗口开发

在这里插入图片描述

CChatceDlg.cpp

void CChatceDlg::OnBnClickedCancel()
{DestroyWindow(); //真正的摧毁窗口
//	EndDialog(IDCANCEL); //只对模式对话框有效,对非模式对话框无效,只是隐藏窗口,不会摧毁窗口showWindows可以再次显示出来//CDialogEx::OnCancel();
}void CChatceDlg::PostNcDestroy()
{CDialogEx::PostNcDestroy();//用于堆空间 delet this; 
}

CMainDlg.h

#include "CChatceDlg.h"
class CMainDlg : public CDialogEx
{
// 构造CChatceDlg m_dlgChat;
}

CMainDlg.cpp
拖动客户区
在这里插入图片描述

//在窗口过程中处理鼠标在非客户区(非工作区)的点击事件。
//它用于确定鼠标点击的位置位于窗口的哪个区域,比如标题栏、边框、系统菜单等LRESULT CMainDlg::OnNcHitTest(CPoint point)  //拖动客户区 
{ScreenToClient(&point);if (point.y<30)return HTCAPTION; //表示鼠标点击在标题栏上,用于移动窗口return CDialogEx::OnNcHitTest(point);
}
OnNcHitTest()用于处理WM_NCHITTEST消息,该消息用于确定鼠标点击的位置。返回值可以是以下之一:
HTERROR:在窗口的错误区域
HTTRANSPARENT:在透明区域
HTNOWHERE:在窗口的非客户区
HTCLIENT:在窗口的客户区
HTCAPTION:在窗口的标题栏
HTSYSMENU:在窗口的系统菜单
HTMENU:在窗口的一般菜单
HTLEFT、HTTOP、HTRIGHT、HTBOTTOM:在窗口的边界区域
HTBOTTOMLEFT、HTTOPLEFT、HTBOTTOMRIGHT、HTTOPRIGHT:在窗口的角落区域
通过重写OnNcHitTest()函数,可以根据返回值来实现特定的行为,例如拖动窗口、更改窗口大小等。
#include "CAboutDlg.h"
void CMainDlg::OnBnClickedAbout()
{CAboutDlg dlg;dlg.DoModal();  //模式对话框
}
#include "CChatceDlg.h"
void CMainDlg::OnBnClickedChat()   //非模式对话框 多例模式
{//auto pDlg = new CChatceDlg;  //加强了生命周期//pDlg->Create(IDD_CHAT, this);//pDlg->ShowWindow(SW_SHOW);if(!m_dlgChat)m_dlgChat.Create(IDD_CHAT, GetDesktopWindow()); // GetDesktopWindow()使用这个函数使得其和主窗口是一个父亲m_dlgChat.ShowWindow(SW_SHOW);
}
//单例模式 对象只能有一个 可以用全局便利 成员变量里

非模态对话框(Modeless Dialog)和模态对话框(Modal Dialog)区别

  1. 控制权:模态对话框会阻塞用户与应用程序的其他部分进行交互,直到对话框关闭为止。而非模态对话框不会阻塞用户与应用程序的其他部分的交互,可以同时操作多个窗口或控件。

  2. 用户焦点:在模态对话框中,用户无法将焦点切换到其他应用程序的窗口或控件上,直到对话框关闭。而在非模态对话框中,用户可以在对话框和其他窗口或控件之间自由切换焦点。

  3. 程序控制:在模态对话框中,对话框被关闭后会返回到调用它的代码处,可以根据对话框的返回值或状态进行相应的处理。而在非模态对话框中,对话框关闭后不会立即返回到调用它的代码处,需要通过消息处理机制来处理对话框的事件和状态。

  4. 多任务处理:由于模态对话框阻塞了用户与应用程序的其他部分的交互,因此在处理耗时任务时可以使用模态对话框来防止用户对其他部分的操作。而非模态对话框通常用于需要同时操作多个窗口或控件的情况。

总的来说,模态对话框适合用于需要用户必须完成某个操作才能继续的情况,而非模态对话框适合用于需要用户可以同时进行其他操作的情况。选择使用哪种对话框类型要根据具体的应用场景和需求来决定。

记事本开发

CFindReplaceDialog类的成员

BOOL SearchDown() const;         // 向下打勾
BOOL FindNext() const;           // TRUE if command is find next
BOOL MatchCase() const;          //大小写匹配
BOOL MatchWholeWord() const;     // 全字匹配
BOOL ReplaceCurrent() const;     // TRUE if replacing current string
BOOL ReplaceAll() const;         // TRUE if replacing all occurrences
BOOL IsTerminating() const;      // TRUE if terminating dialog
CString GetReplaceString() const;// get replacement string
CString GetFindString() const;   // get find string

CFindReplaceDialog的按钮消息:
a)通过派生类截获消息,用Spy找到每个按钮ID
b)不通过派生类截获消息,用主窗口截获消息.
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, &CMainDlg::OnFindReplace)
在这里插入图片描述

查找替换(算法分析)

获取选中的文字

CString CMainDlg::GetSelText()
{CString str;m_edit.GetWindowText(str);int nStart, nEnd;m_edit.GetSel(nStart, nEnd);if(nEnd<=nStart)return CString();return str.Mid(nStart, nEnd - nStart);
}

创建CFindReplaceDialog

//虚函数基本都是重写 必须参数和基类一样 ,如果加了参数 不一致时它就不执行了 跟基类不同叫重定义 
void CMainDlg::OnEditFind()
{if (IsWindow(m_pFRDlg->GetSafeHwnd()))m_pFRDlg->DestroyWindow();m_pFRDlg = new CFindReplaceDialog;m_pFRDlg->Create(TRUE,GetSelText());
}
void CMainDlg::OnEditReplace()
{if (IsWindow(m_pFRDlg->GetSafeHwnd()))m_pFRDlg->DestroyWindow();m_pFRDlg = new CFindReplaceDialog;m_pFRDlg->Create(FALSE, GetSelText());
}

查找替换

LRESULT CMainDlg::OnFindReplace(WPARAM wParam, LPARAM lParam){if (m_pFRDlg->IsTerminating())return false;if (m_pFRDlg->ReplaceAll())ReplaceAll();if (m_pFRDlg->ReplaceCurrent())	{ReplaceCurrent();AfxMessageBox(_T("替换"));	}if (m_pFRDlg->FindNext())if (m_pFRDlg->SearchDown())SerachDown();elseSerachUp();return LRESULT();
}

向下查找算法

void CMainDlg::SerachDown(){if (!IsWindow(m_pFRDlg->GetSafeHwnd()))return;CString sText;m_edit.GetWindowText(sText);CString str = m_pFRDlg->GetFindString();int nStart, nEnd;m_edit.GetSel(nStart, nEnd);int n = sText.Find(str, nEnd);if (n<0){AfxMessageBox(_T("找不到 ") + str);		return;}m_edit.SetSel(n, n + str.GetLength());m_edit.GetFocus();
}

向上查找算法

void CMainDlg::SerachUp()
{if (!IsWindow(m_pFRDlg->GetSafeHwnd()))return;CString sText;m_edit.GetWindowText(sText);CString str = m_pFRDlg->GetFindString();if (!m_pFRDlg->MatchCase())  //区分大小写, 设置之后只能查找小写{str.MakeLower();sText.MakeLower();}int nStart, nEnd;m_edit.GetSel(nStart, nEnd)str.MakeReverse();sText.MakeReverse();int nLen = sText.GetLength();int n = sText.Find(str, nLen-nStart);if (n < 0){AfxMessageBox(_T("找不到 ") + str);return;}nEnd = nLen - n;nStart = nEnd - str.GetLength();m_edit.SetSel(nStart, nEnd);m_edit.GetFocus();
}

替换全部算法

void CMainDlg::ReplaceAll()
{CString sText, sOld, sNew;sOld = m_pFRDlg->GetFindString();sNew = m_pFRDlg->GetReplaceString();m_edit.GetWindowText(sText);BOOL bMathCase = m_pFRDlg->MatchCase();int nStart, nEnd;m_edit.GetSel(nStart, nEnd);if (bMathCase){sText.Replace(sOld, sNew);m_edit.SetWindowText(sText);m_edit.SetSel(nStart, nEnd);}
}

使用RichEdit控件 开发Goto(转到)功能

CGotoDlg
在这里插入图片描述

CGotoDlg.h

class CGotoDlg : public CDialogEx
{DECLARE_DYNAMIC(CGotoDlg)
public:CGotoDlg(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CGotoDlg();int m_nLine, m_nLines; //当前第几行,总共第几行
}

CGotoDlg.cpp
初始化对话框

BOOL CGotoDlg::OnInitDialog(){CDialogEx::OnInitDialog();SetDlgItemInt(IDC_LINE, m_nLine);CString str;str.Format(_T("行号(1-%d)(&L)"), m_nLines);SetDlgItemText(IDC_LINES, str);auto pEdit = (CRichEditCtrl*)GetDlgItem(IDC_LINE);pEdit->SetEventMask(pEdit->GetEventMask() | ENM_CHANGE); m_stop.SetParent(pEdit);CRect rect;pEdit->GetClientRect(rect);rect.left = rect.right - rect.Height();int nDiff = rect.Width() - 15;if (nDiff > 1){nDiff /= 2;rect.DeflateRect(nDiff, nDiff);}m_stop.MoveWindow(rect, FALSE);return TRUE;  // return TRUE unless you set the focus to a control
}

当改变行号时,显示或者隐藏m_stop图标(判断行号是否越界)

void CGotoDlg::OnChangeLine()
{int n = GetDlgItemInt(IDC_LINE);BOOL bEnable = (n > 0 && n <= m_nLines);m_stop.ShowWindow(bEnable ? SW_HIDE : SW_SHOW);GetDlgItem(IDOK)->EnableWindow(bEnable);
}

点击ok获取当前行号

void CGotoDlg::OnBnClickedOk()
{m_nLine = GetDlgItemInt(IDC_LINE);EndDialog(IDOK);
}

跳转行号导航

void CMainDlg::OnEditGoto(){CGotoDlg dlg;int nStart, nEnd;m_edit.GetSel(nStart, nEnd);dlg.m_nLines = m_edit.GetLineCount();dlg.m_nLine = m_edit.LineFromChar(nEnd)+1; //lineIndex  LineFromChar获得选中的字符数进行转换if (dlg.DoModal() == IDCANCEL)return;int nChar = m_edit.LineIndex(dlg.m_nLine)-1;  //用于获取指定行的起始字符的索引。行号是从1开始的,而字符索引是从0开始的。因此,在使用返回的索引进行操作时,可能需要将其减去1以适应零基索引。m_edit.SetSel(nChar, nChar);//设置编辑控件中的选定内容,两个参数分别是起始和结束位置的字符索引
}
/*要清除编辑控件中的选定内容,可以将起始位置和结束位置都设置为相同的值
m_edit.SetSel(-1, 0);
上述代码将选定内容的起始位置设置为-1,结束位置设置为0,这将导致编辑控件中的选定内容被清除。*/

对话框颜色管理

WM_CTLCOLOR控件

1、颜色管理:
a)COLORREF类型是4个字节,其中从低到高的3字节代表:Red Green Blub
b)把分量合成COLORREF类型:COLORREF col = RGB(88,99,222);
#define RGB(r,g,b) ((COLORREF)(((BYTE)®|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
c)把COLORREF拆分成3个分量数值:
#define GetRValue(rgb) (LOBYTE(rgb))
#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) (LOBYTE((rgb)>>16))

2、通用控件颜色管理:WM_CTLCOLOR消息
a)此消息并非完全通用,只适合于附录1中的控件类型。
(按钮,编辑框,静态文字,列表框ListBox)
b)很多复杂的控件包括树形控件,ListCtrl不支持。
就如同CDateTimeCtrl调用SetWindowText不好使。

附录1:
WM_CTLCOLOR支持的种类(UINT nCtlColor )
Contains one of the following values, specifying the type of control:
CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static control

在这里插入图片描述

static CBrush brButton(0xff00);
static CBrush brEdit1(RGB(255,255,0));
static CBrush brEdit2(RGB(0,255,255));
static CBrush brDlg(RGB(255,122,123));
HBRUSH CSetColrDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);switch (nCtlColor){case CTLCOLOR_BTN:pDC->SetTextColor(255);return brButton;case CTLCOLOR_DLG:pDC->SetBkColor(RGB(255,0,255));return brDlg;case CTLCOLOR_EDIT:if (pWnd->GetDlgCtrlID() ==IDC_EDIT1){pDC->SetTextColor(0xff00);pDC->SetBkColor(0xff0000);return brEdit1;}if (pWnd->GetDlgCtrlID() == IDC_EDIT2){pDC->SetTextColor(255); //文字背景颜色和文字前景色pDC->SetBkColor(0x00ffff);return brEdit2;}}return hbr;
}

记事本中文字颜色和背景颜色功能开发

定义相应变量
在这里插入图片描述
加载注册表信息

void CMainDlg::LoadSetting()
{m_clback = theApp.GetProfileInt(_T("SETTINGS"), _T("BACK_COLOR"), 0xffffff);m_clText = theApp.GetProfileInt(_T("SETTINGS"), _T("TEXT_COLOR"), 0);m_brBack.DeleteObject();m_brBack.CreateSolidBrush(m_clback);
}

对文字进行设置颜色

void CMainDlg::OnFormatText()
{CColorDialog dlg(m_clText, CC_FULLOPEN);if (dlg.DoModal() == IDCANCEL)return;m_clText = dlg.GetColor();theApp.WriteProfileInt(_T("SETTINGS"), _T("TEXT_COLOR"), m_clText);
}

设置背景色


void CMainDlg::OnFormatBack()
{CColorDialog dlg(m_clback, CC_FULLOPEN);if (dlg.DoModal() == IDCANCEL)return;COLORREF color = dlg.GetColor();if (color!=m_clback){m_clback = color;m_brBack.DeleteObject();m_brBack.CreateSolidBrush(m_clback);theApp.WriteProfileInt(_T("SETTINGS"), _T("BACK_COLOR"),m_clback);}
}

对IDC_TEXT设置背景色与文字颜色

HBRUSH CMainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd->GetDlgCtrlID() ==IDC_TEXT){pDC->SetTextColor(m_clText);pDC->SetBkColor(m_clback);return m_brBack;}return hbr;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LINUX]之字符串去掉前后空格

去掉字符串前后空格通过使用awk $1$1命令实现 echo " test " | awk $1$1

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

目录 模块选择 编程环境 MLX90614基本原理 通信协议&#xff08;SMBus通信&#xff0c;类IIC通信&#xff09; 代码实现 STM32与模块之间接线表 1.标准库实现温度采集 2.HAL库实现温度采集 模块选择 STM32F103C8T6 MLX90614 非接触式红外测温传感器 编程环境 KEIL5&…

图数据库:neo4j学习笔记

参考资料&#xff1a;neo4j 教程_w3cschool Springboot集成Neo4j_喝醉的咕咕鸟的博客-CSDN博客 SpringBoot 整合 Neo4j_springboot neo4j_$懒小猿$的博客-CSDN博客 图数据库Neo4j实战&#xff08;全网最详细教程&#xff09;_neo4j使用教程_星川皆无恙的博客-CSDN博客 代码片段…

04 QT坐标系

在QT中默认左上角为原点&#xff0c;即&#xff08;0,0&#xff09;点。x轴右侧为正方向&#xff0c;y轴以下侧为正方向

nosql作业

nosql作业 文章目录 作业一&#xff1a;string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令1、 string类型数据的命令操作&#xff1a;2、 list类型数据的命令操作&#xff1a;3、 ha…

.NET网络编程——TCP通信

一、网络编程的基本概念 : 1. 网络 就是将不同区域的电脑连接到一起&#xff0c;组成局域网、城域网或广域网。把分部在不同地理区域的计算机于专门的外部设备用通信线路 互联成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息&#xff0c…

坐标系变换的坑

坐标系变换的坑 坐标系变换本来是很简单的事情&#xff0c;公式也很简单。但是卡了我很多天&#xff0c;原因是&#xff1a;两个坐标系的位姿&#xff0c;虽然都是右手系&#xff0c;但我的在顺时针旋转是yaw角是递增的&#xff0c;同事发给我的却是逆时针递减的。 理论上很简…

Jenkins+Robot 接口自动化测试

目录 前言&#xff1a; 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言&#xff1a; JenkinsRobot是一种常见的接口自动化测试方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;而Robot Framew…

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容&#xff0c;或者根据…

聊聊ChatGPT是如何组织对话的

为什么要组织对话&#xff1f; 总所周知&#xff0c;ChatGPT的训练大致可分为下图中展示的几个阶段&#xff0c;其中&#xff0c;在Pretraining阶段&#xff0c;模型的训练数据是纯文本&#xff0c;目标是根据上文预测下一个token&#xff0c;而在后面的几个阶段中&#xff0c…

网络安全能力成熟度模型介绍

一、概述 经过多年网络安全工作&#xff0c;一直缺乏网络安全的整体视角&#xff0c;网络安全的全貌到底是什么&#xff0c;一直挺迷惑的。目前网络安全的分类和厂家非常多&#xff0c;而且每年还会冒出来不少新的产品。但这些产品感觉还是像盲人摸象&#xff0c;只看到网络安…

回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积…

数据采集专家----4通道AD采集子卡推荐

FMC136是一款4通道250MHz采样率16位AD采集FMC子卡&#xff0c;符合VITA57规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;4通道AD通过高带宽的FMC连接器&#xff08;HPC&#xff09;连接至FPGA从而大大降低了系统信号延迟。 该板卡支持板上可编程采样时钟…

Linux进程

Linux进程 对于进程的理解&#xff0c;我们要从计算机的重要的冯诺依曼体系结构讲起&#xff0c;只有知道我们的程序/文件是如何在计算机中被操作运行并输出到显示器中&#xff0c;通过对于操作系统的理解&#xff0c;才能对于进程进行一定的理解。 文章目录 Linux进程冯诺依…

c#示例-json序列化和json树

序列化 由于指针和引用类型的存在&#xff0c;在运行中的程序中&#xff0c;数据不一定是整块的。 可能东一块西一块散落在内存的各个地方。 序列&#xff0c;是指连续且有序的一个整体。序列化就是把数据变为连续有序整体的过程。 经过这样处理后的数据就可以方便的进行传输…

数据结构--时间复杂度与空间复杂度

数据结构–时间复杂度与空间复杂度 文章目录 数据结构--时间复杂度与空间复杂度时间复杂度一、什么是时间复杂度二、具体实例1.大O的渐进表示法2.二分查找的时间复杂度 空间复杂度一、什么是空间复杂度二、具体实例总结 时间复杂度 一、什么是时间复杂度 在计算机科学中&…

云原生微服务应用的平台工程实践

作者&#xff1a;纳海 01 微服务应用云原生化 微服务是一个广泛使用的应用架构&#xff0c;而如何使得微服务应用云原生化却是近些年一直在演进的课题。国内外云厂商对云原生概念的诠释大同小异&#xff0c;基本都会遵循 CNCF 基金会的定义&#xff1a; 云原生技术有利于各组…

【后端面经-Java】JVM垃圾回收机制

【后端面经-Java】JVM垃圾回收机制 1. Where&#xff1a;回收哪里的东西&#xff1f;——JVM内存分配2. Which&#xff1a;内存对象中谁会被回收&#xff1f;——GC分代思想2.1 年轻代/老年代/永久代2.2 内存细分 3. When&#xff1a;什么时候回收垃圾&#xff1f;——GC触发条…

【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

目录 一、数据库并发的三种场景 二、读写场景的MVCC 1、3个&#xff08;4个&#xff09;记录隐藏列字段 2、undo log&#xff08;撤销日志&#xff09; 3、模拟MVCC场景 3.1update场景 3.2delete场景 3.3insert 3.4select场景 4、Read View 5、RR和RC的区别 5.1当…

Windows安装激活注意事项

选择语言、版本&#xff08;Windows 10指的是专业版本&#xff09;和体系结构&#xff08;32位/64位&#xff09;&#xff0c;这里自行根据情况选择&#xff08;如果机器预装的是Windows 10家庭中文版则选择家庭中文版&#xff0c;如果预装的是专业版则选择Windows 10。这样原先…