MFC 对话框程序基础解析

10:52 2012-10-26
对话框

一、对话框说明
===========================================================================================
1、DoDataExchange
作用
1.1
  ClassWizard 自动加入数据
1.2
   写动态按扭过程中须对按钮添加变量时,添加新的变量就要用到DoDataExchange函数。
说明:
    对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:

DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造

函数里)绑定到IDC_CHECK1中。
总结:
    DoDataExchange函数是被框架与控件用来交流数据的。而里面的DDX函数才是动态绑定技术。
MSDN:
Never call this function directly. It is called by the UpdateData member function. Call

UpdateData to initialize a dialog box's controls or retrieve data from a dialog box.
UpdataData函数内部调用了DoDataExchange
 UpdateData(false)是将变量的值传到控件.
 UpdateData(TRUE)是从控件中取值到关联的变量
总之:
   DoDataExchange函数是被框架与控件用来交流数据的。而里面的DDX函数才是动态绑定技术。
===========================================================================================
2、默认生成的消息--说明
 WM_SYSCOMMAND
 WM_PAINT
 WM_QUERYDRAGICON
===========================================================================================
2.1 OnSysCommand 说明
afx_msg void OnSysCommand( UINT nID, LPARAM lParam );
这个函数响应系统控制菜单的命令.(即左上角图标处:关闭、最大化、最小化等)。

注意:
在WM_SYSCOMMAND消息中,nID参数的低四位被Windows内部使用。
当应用程序测试nID的值时,它必须用位与操作符AND将值0xFFF0与nID的值组合在一起以获得正确的结果。
===========================================================================================
2.2 OnPaint 说明
afx_msg void OnPaint( );
当Windows或应用程序请求重画应用程序窗口的一部分时,框架调用这个成员函数。

WM_PAINT在调用UpdateWindow或RedrawWindow成员函数时发出。
The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.
UpdateWindow
RedrawWindow

补充:
Invalidate和UpdateWindow的区别。
Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。
UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的

无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,

而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate之后想马上更

新屏幕,那就加上UpdateWindow()这条语句。
===========================================================================================

2.3 OnQueryDragIcon 说明
afx_msg HCURSOR OnQueryDragIcon( );

MSDN说明:
  框架为不具有为类图标的最小化(图标化)窗口调用这个成员函数。系统调用这个函数以在用户拖拉最

小化窗口的时候显示光标。
  如果应用程序返回图标或光标的句柄,系统将它转换为黑与白。
  如果应用程序返回一个句柄,则这个句柄必须标识与显示设备分辨率相兼容的单色光标或图标。应用程

序可以调用CWinApp::LoadCursor或CWinApp::LoadIcon成员函数以从它的可执行文件的资源中载入光标或图

标并获得其句柄。
    可以在此函数中设置,鼠标显示的样式
===========================================================================================
3.1 OnInitDialog
CDialog::OnInitDialog
virtual BOOL OnInitDialog();

调用这个成员函数是对WM_INITDIALOG消息作出的反应。这条消息是在对话框即将显示之前,在Create,

CreateIndirect或DoModal调用期间发出的。

默认创建的对话框程序 源代码:
BOOL CXXXXXDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here
 
 return TRUE;  // return TRUE  unless you set the focus to a control
}
解析:
首先,添加菜单选项。所有已有的选项的ID值大于0xF000,添加的ID值小于0xF000.本程序将添加ID值为

IDM_ABOUTBOX的选项到菜单,使得用户点击选项后可以弹出about对话框。

CMenu* pSysMenu = GetSystemMenu(FALSE);  //用于获取当前的菜单,返回菜单的指针

pSysMenu->AppendMenu(MF_SEPARATOR);  //在当前菜单下添加一分隔符

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  //添加ID为
IDM_ABOUTBOX的菜单选项,显示的选项文字为strAboutMenu,

其次,设定about对话框的图标
SetIcon(m_hIcon, TRUE);    //m_hIcon在CDialog中定义,该语句设定32*32大小的图标

SetIcon(m_hIcon, FALSE);    //m_hIcon在CDialog中定义,该语句设定16*16大小的图标

其中  m_hIcon 在构造函数中
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

===========================================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值