C++ MFC / VS2013 之六 (对话框:创建对话框类和添加控件变量)

对话框:创建对话框类和添加控件变量

       前两讲中为大家讲解了如何创建对话框资源。创建好对话框资源后要做的就是生成对话框类了。再声明下,生成对话框类主要包括新建对话框类添加控件变量控件的消息处理函数等。

      因为给大家的例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的。大家用过VC++ 6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDialogEx类。

一  . 创建对话框类

     如果是自己新添加的对话框模板,怎样为它创建对话框类呢

     

     1.首先就按第五讲:创建对话框模板和修改对话框属性中说的那样,在资源视图的“Dialog”节点上右键,然后在右键菜单中选择“插入 Dialog”创建一个新的对话框模板,ID就使用默认的IDD_DIALOG1。

    2.在中间区域会显示新建的对话框模板,然后选中此对话框模板,点右键,在右键菜单中选择添加 Class

    3.选择“添加 Class”后会弹出一个对话框,在对话框中“类名”下的编辑框中写入自定义的类名就可以了,例如CMyDialog。

    4.最后点“Finish”完成。


     最终你就可以在类视图中看到新生成的对话框类CMyDialog了,并且在解决方案资源管理器中有相应的MyDialog.h头文件和MyDialog.cpp源文件生成。CMyDialog类同样派生于CDialogEx类。

    

       注意,一般类名都以C打头,又比如,CTestDlg。

  二.  为对话框中的控件添加变量

       在上一讲中为对话框添加了几个控件,包括三个静态文本框,三个编辑框,一个按钮控件。程序自动生成的取消按钮保留,作为退出按钮,而确定按钮删除掉了。

      首先选中任意一个编辑框,看看编辑框都有哪些属性,其中常用到属性有:

     Multiline:多行,表示内容可以多行显示,一般记录性的编辑框需要多行;

     Password:密码,表示文本以密码形式呈现,一般用来输出密码;

     Read only:只读,表示文本内容只能读不能写;

     Number:数字,表示只能输入数字;

     Lowercase:小写,所有字母全部自动转换为小写显示;

     Uppercase:大写,所有字母全部自动转换为大写显示;

     Horizontal scroll:水平滚动条,需要先选中Multiline属性;

     Vertical scroll:垂直滚动条,需要先选中Multiline属性;

      静态文本框只是为了说明后面紧跟的编辑框中数据的意义,是被加数、加数还是和,所以它们是不会变的,我们就不为它们添加变量了。按钮控件是用来操作的,这里也不为它们添加变量。编辑框中的数据可能会经常变化,有必要为它们每个控件关联一个变量。

      首先为被加数的编辑框IDC_SUMMAND_EDIT添加变量。

       1.在编辑框上点右键,在右键菜单中选择“添加变量”。弹出添加成员变量的向导对话框。

       2.我们想为其添加值变量而不是控件变量,所以对话框中“Category”下的组合框中选择Value。

       3.“Variable type”下的组合框此时默认选中的是“CString”,CString是字符串类,显然不能进行加法运算。我们可以选择double、float、int等。这里我们选择double,即编辑框关联一个double类型的变量。

       4.在“Variable name”中写入自定义的变量名。鸡啄米为其取名m_editSummand。

      注意,类的成员变量名一般以m_打头,以标识它是一个成员变量。

      

      参照此方法,再分别为加数的编辑框IDD_ADDEND_EDIT添加double型变量m_editAddend、和的编辑框IDD_SUM_EDIT添加double型变量m_editSum。

     可能出现的问题: VS2013 MFC 编辑框右键属性添加变量,未弹出对话框

      原因是右侧的IDD_ADDITION_DIALOG是系统自动设置的ID。我在改ID静态文本和示例编辑框时不小心改了Dialog的ID,所以未弹出对话框。当把左侧的ID改回至系统默认的ID时就弹出了添加变量的对话框。然后就可以进行修改啦

                                                              

三.  对话框类的数据交换和检验

      在程序运行界面中,用户往往会改变控件的属性,例如,在编辑框中输入字符串,或者改变组合框的选中项,又或者改变复选框的选中状态等。控件的属性改变后MFC会相应修改控件关联变量的值。这种同步的改变是通过MFC为对话框类自动生成的成员函数DoDataExchange()来实现的,这也叫做对话框的数据交换和检验机制

     我们为三个编辑框添加了变量以后,在AdditionDlg.cpp中CAdditionDlg的DoDataExchange()函数的函数体中多了三条DDX_Text调用语句。下面是函数体代码和鸡啄米添加的注释。

void CAdditionDlg::DoDataExchange(CDataExchange* pDX)   
{   
    // 处理MFC默认的数据交换   
    CDialogEx::DoDataExchange(pDX);   
    // 处理控件IDC_SUMMAND_EDIT和变量m_editSummand之间的数据交换   
    DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand);   
    // 处理控件IDC_ADDEND_EDIT和变量m_editAddend之间的数据交换   
    DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend);   
    // 处理控件IDC_SUM_EDIT和变量m_editSum之间的数据交换   
    DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);   
}

       再以Addition程序为例简单说下数据交换机制。如果我们在程序运行界面中输入被加数,则通过CAddition的DoDataExchange()函数可以将输入的值保存到m_editSummand变量中,反之如果程序运行中修改了变量m_editSummand的值,则通过CAddition的DoDataExchange()函数也可以将新的变量值显示到被加数的编辑框中。

       但是这种数据交换机制中,DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。

 CDialogEx::UpdateData()函数的原型为:

       BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

       参数:bSaveAndValidate用于指示数据传输的方向,TRUE表示从控件传给变量,FALSE表示从变量传给控件。默认值是TRUE,即从控件传给变量。

       返回值:CDialogEx::UpdateData()函数的返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE。

      在下一讲中将具体演示CDialogEx::UpdateData()函数如何使用。

       本节主要讲的是新建对话框类和添加控件变量,控件的消息处理函数将在下一讲详细介绍。依然欢迎大家来我的博客学习和讨论。




  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过以下步骤在C++ MFC对话框中实现拖动和放缩件加载的图片: 1. 在对话框资源中添加一个静态图片件,可以通过拖拽方式添加。 2. 在件类头文件中添加以下成员变量: ``` CPoint m_ptOrigin; //记录鼠标按下时的坐标 BOOL m_bDragging; //标记是否正在拖拽 ``` 3. 在件类头文件中添加以下函数: ``` void OnLButtonDown(UINT nFlags, CPoint point); //鼠标左键按下事件处理函数 void OnMouseMove(UINT nFlags, CPoint point); //鼠标移动事件处理函数 void OnLButtonUp(UINT nFlags, CPoint point); //鼠标左键抬起事件处理函数 void OnSize(UINT nType, int cx, int cy); //窗口大小改变事件处理函数 ``` 4. 在件类实现文件中实现以上四个函数: ``` void CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) { m_bDragging = TRUE; m_ptOrigin = point; SetCapture(); //设置鼠标捕获 } void CMyStatic::OnMouseMove(UINT nFlags, CPoint point) { if (m_bDragging) { CRect rect; GetWindowRect(&rect); ScreenToClient(&rect); //将窗口坐标系转换为客户区坐标系 int dx = point.x - m_ptOrigin.x; int dy = point.y - m_ptOrigin.y; rect.left += dx; rect.top += dy; rect.right += dx; rect.bottom += dy; MoveWindow(&rect); } } void CMyStatic::OnLButtonUp(UINT nFlags, CPoint point) { m_bDragging = FALSE; ReleaseCapture(); //释放鼠标捕获 } void CMyStatic::OnSize(UINT nType, int cx, int cy) { //重新设置图片件的大小 CStatic::OnSize(nType, cx, cy); if (GetSafeHwnd()) { CImage image; image.Load(_T("your_image_path")); int nWidth = image.GetWidth(); int nHeight = image.GetHeight(); if (nWidth > 0 && nHeight > 0) { int nNewWidth = cx; int nNewHeight = cy; if ((double)nWidth / nHeight > (double)nNewWidth / nNewHeight) { nNewHeight = nNewWidth * nHeight / nWidth; } else { nNewWidth = nNewHeight * nWidth / nHeight; } SetWindowPos(NULL, 0, 0, nNewWidth, nNewHeight, SWP_NOMOVE | SWP_NOZORDER); Invalidate(); //刷新窗口 } } } ``` 5. 在对话框类头文件中添加以下成员变量: ``` CMyStatic m_staticImage; //静态图片件 ``` 6. 在对话框类实现文件中的OnInitDialog函数中初始化静态图片件: ``` m_staticImage.SubclassDlgItem(IDC_STATIC_IMAGE, this); //将静态图片件与对应的对话框件关联 ``` 7. 在对话框类实现文件中重载OnSize函数,调整静态图片件的位置和大小: ``` void CMyDialog::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (m_staticImage.GetSafeHwnd()) { CRect rect; m_staticImage.GetWindowRect(&rect); ScreenToClient(&rect); rect.right = rect.left + cx; rect.bottom = rect.top + cy; m_staticImage.MoveWindow(&rect); } } ``` 通过以上步骤,您可以在C++ MFC对话框中实现拖动和放缩件加载的图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值