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);
===========================================================================================