MFC Dialog使用

 

 1. OnInitDialog 对话框初始化函数

在MFC主对话框OnInitDialog()中弹出对话框app

BOOL CXXXDlg::OnInitDialog()

{
  CDialogEx::OnInitDialog();
  SetIcon(m_hIcon, TRUE);
  SetIcon(m_hIcon, FALSE);less

  CChildDlg dlg;
  dlg.DoModal();ide

  //你的业务代码函数

}工具

在MFC中新建基于对话框的程序时,会使用到OnInitDialog()函数,OnInitDialog函数主要用于对话框对象初始化操做,好比:在对话框类的定义中有指针、数据或者布尔类型变量等,这些成员的初始化均可以放在OnInitDialog函数中。post

其函数原型是: virtual BOOL OnInitDialog(),是虚函数,在对话框显示以前被调用。
 this

 

有时候须要在OnInitDialog弹出对话框,例如密码框来决定是否显示主对话框。那么子对话框CChildDlg的风格必须是Popup或Overlapped风格,Child风格是弹不出来的.spa

 

设置dialog的标题:指针

在对应对话框的初始化函数OnInitDialog()中添加如下代码:orm

CString title;

title.Format("%d",Id);//在标题栏动态显示Id的值

this->SetWindowText(title);

 

 

 

首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc.

MFC:

一、Called when the user clicks the OK button (the button with an ID ofIDOK).

二、The framework calls this member function when the user clicks the Cancel button or presses the ESC key in a modal or modeless dialog box.

 

两个函数都是CDialog类的virtual的成员函数, 也就是MFC是但愿你去重载它们. 两个函数有一个共同点,就是都会调用CDialog::EndDialog. 这个CDialog::EndDialog函数是在CDialog::OnOK();中调用的。EndDialog的做用以下,摘自MSDN:

 

Call this method to destroy a modal dialog box

Do not call EndDialog to destroy a modeless dialog box. Call CWindow::DestroyWindow instead

 

模态对话框能够用EndDialog来销毁, 非模态对话框要用DestroyWindow来销毁. 如下摘自MSDN:

 

If you implement the OK button in a modeless dialog box, you must override the OnOK method and call DestroyWindow inside it. Do not call the base-class method, because it calls EndDialog which makes the dialog box invisible but does not destroy it.

 

为何强调用谁来销毁,由于这牵涉到资源释放的问题:

//调用基类的OnOK()函数,执行基类中的EndDialog(IDOK)函数,做用是关闭对话框,并把IDOK做为对话框的返回值,返回给调用对话(DoModal)的地方。

一、对于模态对话框:

void CMyDlg::OnOK()
{
CDialog::OnOK();
}

二、对于非模态对话框,你关闭对话框时,就不能只调用CDialog的OnOK, 还应该DestroyWindow,像下面这样:

void CMyDlg::OnOK()
{
CDialog::OnOK();//关闭窗口,窗口不可见,可是并无销毁
DestroyWindow();//销毁窗口,释放窗口资源
}
-- 

 

 

OnOK 和OnCancel函数:

MFC默认创建的Dialog按Esc响应OnCancel,回车响应OnOK,都会关闭对话框。

而点击下方两个按钮功能相同,点击肯定是响应OnOK, 点击取消调用OnCancel。

而OnOK和OnCancel之间是有区别的:

CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,而后调用CDialog::EndDialog关闭对话框。 
CDialog::OnCancel只调用CDialog::EndDialog关闭对话框。  

因此咱们在销毁dialog须要进行一些数据交换就能够在OnOK中进行。

 

 

 


/*
* Dialog Box Command IDs
*/
#define IDOK 1
#define IDCANCEL 2

 

INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理什么时候用
// “肯定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理什么时候用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框建立失败,应用程序将意外终止。\n");
}

 

在对话框程序中,

1)用户点击X关闭按钮,调用的是CDialog::OnCancel函

 

 

使用RichEdit切记:

在mfc中使用工具栏里的RichEdit 控件时,应该在对话框构造函数中用

AfxInitRichEdit()或者 AfxInitRichEdit2()。

不然程序启动后没有界面。

 

解决MFC对话框不显示最小化、最大化和关闭按钮的问题

右击属性栏,发现以下设置成了灰色的了
解决办法:
设置System Menu为True,上面的最大化和最小化就能够设置了
 
RichEdit2不换行的问题:
Auto HScroll
属性中 设置mulitiline为TRUE,wantreturn设置为true,Audo Vscroll为TRUE、Vertical SCroll为TRue
TransParent必须为false(不然滚动滑轮,字会花掉).
相关文章
相关标签/搜索