对话框1

简介:   对话框的种类 有两种类型的对话框:模态对话框和非模态对话框. 模态对话框时指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中的其他任务。 非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。

2010年11月16日 - Fly - 从C开始

 

对话框的种类

有两种类型的对话框:模态对话框非模态对话框.

模态对话框时指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中的其他任务。

非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。

 

创建模态对话框

1.在资源编辑器里面新建一个对话框资源,ID采用默认值为:IDD_DIALOG1

2.双击该对话框,为该对话框添加一个关联的类,命名为CtestDlg

3.创建一个菜单项

4.为该菜单项添加COMMAND命令消息响应函数,让视类来捕获它

5.在实现函数中调用Cdialog类的成员函数:DoModal,添加如下两行代码:

CTestDlg dlg;

dlg.DoModal();

6.在视类中添加CtestDlg 类的头文件

 

创建非模态对话框

1.在资源编辑器里面新建一个对话框资源,ID采用默认值为:IDD_DIALOG1

2.双击该对话框,为该对话框添加一个关联的类,命名为CtestDlg

3.创建一个菜单项

4.为该菜单项添加COMMAND命令消息响应函数,让视类来捕获它

5. .在实现函数中添加如下两行代码:

         CTestDlg *dlg = new CTestDlg;

         dlg->Create(IDD_DIALOG1,this);

         dlg->ShowWindow(SW_SHOW);

6.在工程视类的析构函数中调用delete函数:

         delete this;

7.在视类中添加CtestDlg 类的头文件

动态创建按钮

1.       为对话框资源新建一个按钮,Caption属性设为Add

2.       CTestDlg类中添加一个CButton类的成员变量m_btn;

3.       CTestDlg类中响应这个按钮单击的消息,在函数体中写入如下代码:

void CTestDlg::OnBnClickedButton1()

{

     static BOOL b = FALSE;

     if (FALSE == b)

     {

m_btn.Create(TEXT("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILDCRect(0,0,100,100), this, 123);

         b = TRUE;

     }

     else

     {

         m_btn.DestroyWindow();

         bFALSE;

     }   

 

4.       以上我们是创建了一个变量来判断是否已经创建了一个按钮窗口并与按钮对象相关联,下面介绍一种更直接的方法来实现判断。我们知道,CWnd对象都有一个成员变量m_hWnd,用来保存于窗口对象相关联的窗口句柄。如果窗口对象没有与任何一个窗口相关联,这个句柄就为NULL

void CTestDlg::OnBnClickedButton1()

{

     if (!m_btn.m_hWnd)

     {

m_btn.Create(TEXT("New"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILDCRect(0,0,100,100), this, 123);

     }

     else

               m_btn.DestroyWindow();

}

 

静态文本控件响应鼠标单击事件

静态文本框的主要作用是起提示作用,默认情况下不能响应鼠标消息。

我们可以通过下面两步就可以实现响应

1.改变它的默认ID;

2.在它的属性对话框中选择Notify选项。

 

文本框控件与成员变量相关联

1.创建一个对话框,并在对话框上放一个文本框

2.右键文本框添加添加变量,类别为Value,变量类型int,变量名m_edit

3.再添加2个编辑框控件,并与成员变量关联,方法同上

4.在按钮的方法中写下如下代码:

void CTestDlg::OnBnClickedButton1()

{

          UpdateData(TRUE);  //开始获取对话框中的数据

          m_edit3 = m_edit1 + m_edit2;

          UpdateData(FALSE); //用变量的值来初始化对话框控件

}

 

对话框伸缩功能

1.       用图像控件在对话框的底部画出一条分割线。

2.       改变图像控件的IDstytle属性设为向下凹陷。

3.       代码如下:

CString str;

if (GetDlgItemText(IDC_BUTTON1, str), str == TEXT("收缩<<"))

{

           SetDlgItemText(IDC_BUTTON1, TEXT("展开>>"));

}

else

{

           SetDlgItemText(IDC_BUTTON1, TEXT("收缩<<"));

}

 

static CRect rectBig;

static CRect rectSmall;

 

if (rectBig.IsRectNull())

{

           CRect rectTemp;

           GetWindowRect(rectBig);

           GetDlgItem(IDC_SEPERATOR)->GetWindowRect(rectTemp);

           rectSmall.left = rectBig.left;

           rectSmall.top = rectBig.top;

           rectSmall.right = rectBig.right;

           rectSmall.bottom = rectTemp.bottom;

}

 

if (str == TEXT("收缩<<"))

{

SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(),

 SWP_NOMOVE | SWP_NOZORDER);

}

else

{

           SetWindowPos(NULL, 0, 0, rectBig.Width(), rectBig.Height(),

SWP_NOMOVE | SWP_NOZORDER);

}

 

修改控件的窗口过程

要改变窗口的属性,我们可以调用如下函数:

 

LONG SetWindowLong(

  HWND hWnd,       // 指定想要改变属性的窗口的句柄

  int nIndex,      // 指定要设置的属性值的偏移地址

  LONG dwNewLong   // 新的窗口过程函数地址

);

 

hWnd参数指定的是一个对话框,那么nIndex参数就可以可以取值为DWL_DLGRROC,利用这个参数,我们就可以设置新的对话框过程。

 

例如:

首先在cpp文件的开头

WNDPROC prevProc;

LRESULT CALLBACK EditNewProc(

                                                                 HWND hwnd,      // handle to window

                                                                 UINT uMsg,      // message identifier

                                                                 WPARAM wParam,  // first message parameter

                                                                 LPARAM lParam   // second message parameter

                                                                 )

{

         if (uMsg == WM_CHAR && wParam == 0x0d)

         {

                   ::SetFocus(GetNextWindow(hwnd, GW_HWNDNEXT));

                   return 1;

         }

         else

         {

                   return prevProc(hwnd, uMsg, wParam, lParam);

         }

}

 

在程序运行时,当对话框及其上子控件创建完成,将要显示之前会发送一个消息:WM_INITDIALOG。因此,我们可以再此消息的响应函数中修改控件的窗口过程。

例如:

BOOL CTestDlg::OnInitDialog()

{

         CDialog::OnInitDialog();

        

         // TODO: Add extra initialization here

            prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (LONG)EditNewProc);

 

         return TRUE;

}

 

输入焦点的传递

MFC中,默认情况下,当在对话框窗口中按下回车键时,会调用对话框的默认按钮的响应函数。我们可以利用这个特性,使焦点依次向下传递。

void CTestDlg::OnOK()

{

         // TODO: Add extra validation here

         GetNextDlgTabItem(GetFocus())->SetFocus();

//      CDialog::OnOK();    //把这句注释起来,否者会调用基类的OnOk函数。

}

 

编辑TAB顺序:

1.       在资源编辑器中选中要排序的对话框

2.       在菜单中选择布局

3.       TAB顺序

目录
相关文章
|
SQL 数据可视化 网络协议
阿里云数据分析最佳实践:二维数据可视化 + 设备数据下发
物联网数据分析,又称Link Analytics,是阿里云为物联网开发者提供的设备智能分析服务,全链路覆盖了设备数据生成、管理(存储)、清洗、分析及可视化等环节。有效降低数据分析门槛,助力物联网开发工作。这里分别演示通过二维数据可视化功能展示设备位置 + 通过数据分析实现定时下发数据到设备。
2645 0
阿里云数据分析最佳实践:二维数据可视化 + 设备数据下发
|
11月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
381 1
|
小程序 JavaScript 前端开发
点餐小程序实战教程08-购物车功能开发
点餐小程序实战教程08-购物车功能开发
|
弹性计算 负载均衡 对象存储
阿里云服务器申请免费试用图文教程(个人和企业均可申请)
阿里云服务器申请免费试用图文教程(个人和企业均可申请)
528 0
|
存储 消息中间件 JSON
【领域驱动系列3】DDD实践
在前面的《一文带你学习DDD,全是干货!》文章中,里面讲述了一个Demo,虽然有DDD的思想,但是感觉整体很乱,每一层都没有做好隔离,所以我参考小米内部的DDD脚手架,对这个Demo进行了重构,也就诞生了我这个版本,代码已经上传到GitHub中,大家可以自取:https://github.com/lml200701158/ddd-framework
973 0
【领域驱动系列3】DDD实践
|
存储 Kubernetes 前端开发
appsmith 怎么用?评价如何
AppSmith 是印度一家创业公司开发的低代码开发工具,它的原型是另一家名叫 Retool 的美国的创业公司。AppSmith 从 2019 年开始开发,到现在已经发行了 1.x 版本,也就是处于正式发行状态。那么 Appsmith 到底怎么样?它的评价如何?对比卡拉云它有哪些优缺点呢?
1803 0
|
开发框架 Java Spring
Autowired和Resource的区别
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
329 0
|
存储 分布式计算 Hadoop
Hadoop : hdfs的客户端操作
Hadoop : hdfs的客户端操作
支付宝预授权配置芝麻分门槛、借用数量等信息流程分享
说明: 商户签约“支付宝预授权”接口成功,并且成功开通芝麻免押功能后就可以登录:[url]https://b.xin.xin/ant/index.htm[/url]   来自助配置芝麻分门槛、借用数量等信息。
1651 11
|
Ubuntu Java Unix
《HotSpot实战》—— 1.2 动手编译虚拟机
由于开发环境各不相同,每个人遇到的问题可能都不尽相同;即使遇到相同的问题,在不同的平台上解决的方式可能也有所不同。当然,对于相同的问题,也会有多种办法解决。限于篇幅,在这里不能对所有错误信息和解决办法都列举出来。
5437 1