首页 > 其他分享 >自实现模态对话框-DoModal函数

自实现模态对话框-DoModal函数

时间:2023-11-21 17:46:11浏览次数:25  
标签:模态 ModalBase 对话框 int void DoModal NULL ID hParent

参考CDialog::DoModal函数的实现方式,自己实现了模态框相关功能。

ModalBase.h头文件

 1 #include <afxwin.h>
 2 
 3 #define ID_NULL                    0
 4 #define ID_OK                    1
 5 #define ID_CANCEL                2
 6 #define ID_ABORT                3
 7 #define ID_RETRY                4
 8 #define ID_IGNORE                5
 9 #define ID_YES                    6
10 #define ID_NO                    7
11 #define ID_CLOSE                8
12 
13 
14 //模态窗基类
15 class ModalBase : public CWnd
16 {
17 public:
18     ModalBase();
19     ~ModalBase();
20 
21     virtual int                        DoModal(HWND hParent = NULL);
22 
23     void                            SetWindowSize(int nWidth, int nHeight);
24 
25 protected:
26     virtual void                    EndDialog(int nExitCode);
27 
28     virtual void                    UpdateLayout();
29 
30     virtual    CRect                    GetTitleRect();            //获取标题栏矩形
31 
32     virtual CRect                    GetWndRect();            //获取整个窗口的矩形【忽略了边框】
33 
34     BOOL                            Create(CWnd* pParent);
35 
36 //消息循环
37 protected:
38     DECLARE_MESSAGE_MAP()
39     afx_msg void                    onm ouseMove(UINT nFlags, CPoint point);
40     afx_msg void                    OnLButtonDown(UINT nFlags, CPoint point);
41     afx_msg void                    OnLButtonUp(UINT nFlags, CPoint point);
42     
43 private:
44     bool                    m_bMouseMove = false;
45     CPoint                    m_ptOrigin;
46     int                        m_nRetCode = ID_NULL;            //模态窗退出码
47     int                        m_nWidth = 0;                    //窗口的宽度
48     int                        m_nHeight = 0;                    //窗口的高度
49 };

ModalBase.cpp源文件

  1 #include "stdafx.h"
  2 #include <afxpriv.h>
  3 #include "ModalBase.h"
  4 
  5 BEGIN_MESSAGE_MAP(ModalBase, CWnd)
  6     ON_WM_SIZE()
  7     ON_WM_PAINT()
  8     ON_WM_LBUTTONDOWN()
  9     ON_WM_MOUSEMOVE()
 10     ON_WM_LBUTTONUP()
 11 END_MESSAGE_MAP()
 12 
 13 ModalBase::ModalBase(){ }
 14 
 15 
 16 ModalBase::~ModalBase(){ }
 17 
 18 int ModalBase::DoModal(HWND hParent /*= NULL*/)
 19 {
 20     CWinApp* pApp = AfxGetApp();
 21     if (pApp) pApp->EnableModeless(FALSE);            //禁用所有非模态窗
 22     
 23     if (!hParent)
 24         hParent = ::GetActiveWindow();            //获取当前焦点窗口
 25 
 26     BOOL bEnableParent = FALSE;
 27     BOOL bEnableMainWnd = FALSE;
 28     CWnd* pMainWnd = NULL;
 29     if (hParent && hParent != ::GetDesktopWindow() && ::IsWindowEnabled(hParent))        //判断窗口是否禁用
 30     {
 31         ::EnableWindow(hParent, FALSE);            //禁用父窗口
 32         bEnableParent = TRUE;
 33 
 34         pMainWnd = AfxGetMainWnd();
 35         if (pMainWnd && pMainWnd->IsFrameWnd() && pMainWnd->IsWindowEnabled())            //禁用框架窗口
 36         {
 37             pMainWnd->EnableWindow(FALSE);
 38             bEnableMainWnd = TRUE;
 39         }
 40     }
 41 
 42     BOOL bRet = Create(CWnd::FromHandle(hParent));                //创建窗口
 43     if (!bRet)
 44     {
 45         if (bEnableParent) ::EnableWindow(hParent, TRUE);
 46 
 47         if (bEnableMainWnd) pMainWnd->EnableWindow(TRUE);
 48 
 49         return 0;
 50     }
 51 
 52     HWND hWndLastActive = ::SetActiveWindow(m_hWnd);            //激活当前窗口
 53 
 54     //显示当前窗口
 55     SetWindowPos(CWnd::FromHandle(HWND_TOPMOST), 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
 56     CenterWindow(CWnd::FromHandle(hParent));
 57 
 58     DWORD dwFlags = MLF_SHOWONIDLE;
 59     if (GetStyle() & DS_NOIDLEMSG) dwFlags |= MLF_NOIDLEMSG;
 60         
 61     int nResult = RunModalLoop(dwFlags);        //进入消息循环
 62 
 63     ASSERT(m_nRetCode != ID_NULL);                //从消息循环退出,应该已经设置了其他值
 64 
 65     if (IsWindow(m_hWnd))
 66         SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
 67 
 68     if (bEnableMainWnd) pMainWnd->EnableWindow(TRUE);            //激活框架窗口
 69     if (bEnableParent) ::EnableWindow(hParent, TRUE);            //激活父窗口
 70         
 71     ::SetActiveWindow(hWndLastActive);            //还原
 72     ::DestroyWindow(m_hWnd);                    //销毁当前窗口
 73 
 74     if (pApp) pApp->EnableModeless(TRUE);            //启用所有非模态窗
 75 }
 76 
 77 void ModalBase::SetWindowSize(int nWidth, int nHeight)
 78 {
 79     m_nWidth = nWidth;
 80     m_nHeight = nHeight;
 81 }
 82 
 83 BOOL ModalBase::Create(CWnd* pParent)
 84 {
 85     CString strWndClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), NULL, NULL);
 86     BOOL bResult = CreateEx(NULL, strWndClass, _T(""), WS_POPUP, CRect(0, 0, m_nWidth, m_nHeight), pParent, NULL);
 87     return bResult;
 88 }
 89 
 90 void ModalBase::OnMouseMove(UINT nFlags, CPoint point)
 91 {
 92     if (m_bMouseMove)
 93     {
 94         CRect rcWindow;
 95         GetWindowRect(rcWindow);
 96         CPoint pt = point - m_ptOrigin + rcWindow.TopLeft();
 97         SetWindowPos(NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW);
 98     }
 99     __super::OnMouseMove(nFlags, point);
100 }
101 
102 void ModalBase::OnLButtonDown(UINT nFlags, CPoint point)
103 {
104     SetFocus();
105     if (nFlags == MK_LBUTTON && GetTitleRect().PtInRect(point))
106     {
107         SetCapture();
108         m_bMouseMove = true;
109         m_ptOrigin = point;
110     }
111     __super::OnLButtonDown(nFlags, point);
112 }
113 
114 void ModalBase::OnLButtonUp(UINT nFlags, CPoint point)
115 {
116     if (m_bMouseMove)
117     {
118         ReleaseCapture();
119         m_bMouseMove = false;
120     }
121 }
122 
123 void ModalBase::EndDialog(int nExitCode)
124 {
125     ASSERT(nExitCode != ID_NULL);
126     if (m_nRetCode == ID_NULL)
127     {
128         m_nRetCode = nExitCode;
129         if (m_nFlags & (WF_MODALLOOP | WF_CONTINUEMODAL))
130             EndModalLoop(m_nRetCode);
131 
132         ::EndDialog(m_hWnd, m_nRetCode);
133     }
134 }
135 
136 void ModalBase::UpdateLayout()
137 {
138 
139 }
140 
141 CRect ModalBase::GetTitleRect()
142 {
143     CRect rcTitle = GetWndRect();
144     rcTitle.bottom = rcTitle.top + 28;
145     return rcTitle;
146 }
147 
148 CRect ModalBase::GetWndRect()
149 {
150     CRect rcClient;
151     GetClientRect(rcClient);
152     rcClient.DeflateRect(2, 2, 2, 2);
153     return rcClient;
154 }

上面只提供了基类代码,有需要的,可以自己派生相关的类。

标签:模态,ModalBase,对话框,int,void,DoModal,NULL,ID,hParent
From: https://www.cnblogs.com/BroccoliFighter/p/17847157.html

相关文章

  • 修改窗口标题,弹出对话框 (6.0)
    本文学习于B站,记录,借鉴;视频链接:修改窗口标题、弹出对话框_哔哩哔哩_bilibili HWND很明显内部定义的一种数据类型;声明变量名后,获取窗口句柄,虽然我也不清除窗口句柄什么意思,应该是窗口标题开始的位置; 在调用SetWindowText(窗口句柄,字符串);进行修改;未修改前: 修改后: ...........
  • 滚动对话框内容,已打开的下拉框超出对话框范围显示
    问题场景点击对话框内的下拉框,显示下拉列表,纵向滚动对话框内容,已经打开的下拉列表,超出对话框范围仍然显示。分析下拉框列表消失的条件是下拉框失焦。因此,有三种解决方案:给对话框设置样式:下拉框超出对话框范围就隐藏;给对话框内的下拉框设置:若滚动对话框,则让下拉框失焦,即关......
  • 多模态大模型CogVLM:智谱AI的新篇章
    CogVLM,这是一种新的视觉语言基础模型,由智谱AI和清华KEG联合开发。CogVLM在不牺牲任何NLP任务性能的情况下,实现了视觉语言特征的深度融合。CogVLM-17B模型在多模态权威学术榜单上取得了综合成绩第一的成绩,在14个数据集上取得了state-of-the-art或者第二名的成绩。模型架构CogVLM的核......
  • 第10章 Qt 对话框--实现浏览器和用户的交流
    Qt对话框--实现浏览器和用户的交流用户登录窗口--升级为模态对话框这里不是转到槽而是点击信号槽方法,转到槽是自己编写代码反应的逻辑浏览器用户登录窗口与主窗口切换导入对应的指针按照需求绑定退出的信号,为上传功能添加标准对话框本章小结......
  • 网银转账虚拟生成器在线制作,工商农业邮政建设招商,标签+对话框+画板+快照实现
    标签+对话框+画板+快照实现就实现了一个虚拟截图生成器,当然我加了水印了,这个图片你根本盗用不了,图片模版的话网上真的太多了,我这个也是网上找的,自己百度图库搜一下,然后标签记得一定用黑月的透明标签,如果不透明的话颜色看起来会有失真的感觉,图片有点灰白,而易语言默认标签是纯白的,直......
  • 开源多模态模型—MiniGPT-5,多模态生成的突破
    在人工智能领域,多模态生成已成为科技巨头争相突破的前沿。而MiniGPT-5模型,由加州大学圣克鲁斯分校研发,提出了全新的“GenerativeVokens”概念,创新性地构建了文本与图像特征空间的桥梁,推动了普通训练数据的有效对齐,同时生成高质量的文本和图像。MiniGPT-5的核心技术:GenerativeVoke......
  • 11月10日模态框和透明
    目录模态框什么是z-index属性?z-index属性透明效果模态框设置对象的层叠顺序需要用到z-index属性,什么是z-index属性?这里提供一个代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.a{......
  • 多模态模型框架
    多模态模型框架如果有一个序列一共有四步操作,每一步操作都可以作为一条训练数据。训练数据如下图:Model选型文字和图像编码器分别为CN-clip的Vit-B/16和bertgithub地址:https://github.com/OFA-Sys/Chinese-CLIP操作编码器为:一个线性层升维到512维度工程实现:数据方面:前......
  • 冰橙Ai- ChatGPT开放接口最新版4.0 1106接口 gpt-4-1106-preview gpt-3.5-turbo-1106
    冰橙Ai-ChatGPT开放接口最新版4.01106接口gpt-4-1106-previewgpt-3.5-turbo-1106 图像生成DALL·E3多模态接口冰橙GPTchatGPT开放接口使用说明 【接入了腾讯云内容安全检测】冰橙GPT稳定提供API接口服务定时有人进行问题排查处理1小时内问题响应接入了腾讯云的内......
  • JAVA SWT的MessageBox对话框
    Referencedjar:org.eclipse.swt.win32.win32.x86_64_3.113.0.v20191204-0601.jar importorg.eclipse.swt.widgets.MessageBox; SWT有不同类型的对话框。有些对话框具有特殊的属性。MessageBoxmessageBox=newMessageBox(shell,SWT.OK|SWT.CANCEL);if(messageBox.open(......