无模式对话框和Windows通用对话框
无模式对话框和Windows通用对话框
1、利用对话框编辑器创建一个对话框资源
2、用ClassWizard来创建CEx07aDialog类
3、添加变量到CEx07aDialog类中
IDC_EDIT1----〉 m_strEdit1
4、编辑CEx07aDialog.h增加视图指针和函数原型
private:
CView* m_pView;
public:
CEx07aDialog(CView* pView);
BOOL Create();
5、编辑CEx07aDialog.h并在其中定义WM,GOODBYE消息ID #define WM_GOODBYE WM_USER + 5 //常量WM_USER是用户自定义消息中可利用的第一个消息
6、在文件CEx07aDialog.cpp中加入无模式对话框的构造函数 CEx07aDialog::CEx07aDialog(CView* pView) // modeless constructor
{
m_pView = pView;
}
7、在CEx07aDialog.cpp文件中加进Create函数 BOOL CEx07aDialog::Create()
{
return CDialog::Create(CEx07aDialog::IDD);
}
8、编辑CEx07aDialog.cpp文件中的OnOK和OnCancel的单击响应函数 void CEx07aDialog::OnCancel() // not really a message handler {
if (m_pView != NULL) {
// modeless case -- do not call base class OnCancel
m_pView->PostMessage(WM_GOODBYE, IDCANCEL);
}
else {
CDialog::OnCancel(); // modal case
}
}
void CEx07aDialog::OnOK() // not really a message handler {
if (m_pView != NULL) {
// modeless case -- do not call base class OnOK
UpdateData(TRUE);
m_pView->PostMessage(WM_GOODBYE, IDOK);
}
else {
CDialog::OnOK(); // modal case
}
}
9、编辑ex07aView.h头文件
class CEx07aView : public CView
{
private:
CEx07aDialog* m_pDlg;
}
10、修改ex07aView.cpp文件中的CEx07aView类的构造函数和析构函数 CEx07aView::CEx07aView()
{
m_pDlg = new CEx07aDialog(this);
}
11、CEx07aView::~CEx07aView()
{
delete m_pDlg; // destroys window if not already destroyed }
12、在ex07aView.cpp文件的虚函数OnDraw中加进一些代码 void CEx07aView::OnDraw(CDC* pDC) {
pDC->TextOut(0, 0, "Press the left mouse button here."); }
13、利用ClassWizard加进CEx07aView的鼠标消息处理函数。请加进WM _LBUTTON
DOWN和 WM_RBOTTONDOWN消息的处理函数,然后再按如下的代码对 ex07aView.cpp
文件中的这两个消息处理函数分别进行编辑: void CEx07aView::OnLButtonDown(UINT nFlags, CPoint point) {
// creates the dialog if not created already
if (m_pDlg->GetSafeHwnd() == 0) {
m_pDlg->Create(); // displays the dialog window
}
}
void CEx07aView::OnRButtonDown(UINT nFlags, CPoint point) {
m_pDlg->DestroyWindow();
// no problem if window was already destroyed
}
14、在ex07aView.cpp文件中加进对对话框头文件的包含语句 #include "ex07aView.h"
#include "ex07aDialog.h"
15、针对WM_GOODBYE消息加进自己的消息代码
在ex07aView.cpp将下列语句行加在BECIN MESSAGE MAP I语句之后但必须将它加在
AFX_MSG_MAP之外:
BEGIN_MESSAGE_MAP(CEx07aView, CView)
ON_MESSAGE(WM_GOODBYE, OnGoodbye)
//{{AFX_MSG_MAP(CEx07aView)
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后加进完整的消息处理函数
LRESULT CEx07aView::OnGoodbye(WPARAM wParam, LPARAM lParam)
{
// message received in response to modeless dialog OK
// and Cancel buttons
m_pDlg->DestroyWindow();
return 0L;
}
16、在ex07aView.h中加人如下函数原型。将下面的语句加在
DECLARE_MESSAGE_MAP()语句之前AFX_ MSC括弧对之外:
//{{AFX_MSG(CEx07aView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
afx_msg LRESULT OnGoodbye(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
Windows通用对话框--CfileDialog
1、用对话框编辑器创建对话框资源
2、利用ClassWizard来创建CSpecialFileDialog类
把名字更改相应文件名为SpecFileDlg.h和SpecFileDlg..cpp
手工将Base Class 改为CfileDialog
在SpecFileDlg.h中将class CSpecialFileDialog : public CDialog
改为class CSpecialFileDialog : public CFileDialog
加人下面两个公有数据成员
public:
CString m_strFilename;
BOOL m_bDeleteAll;
最后;编辑构造函数声明如下
public:
CSpecialFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen,
FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
D
dwFlags = OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
3、在SpecFileDlg.h中用CFileDialog替换CDialog
4、在SpecFileDlg..CPP文件中CSpecialFileDialog构造函数进行编辑 CSpecialFileDialog::CSpecialFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags,
LPCTSTR lpszFilter, CWnd* pParentWnd)
: CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
//{{AFX_DATA_INIT(CSpecialFileDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILESPECIAL);
m_ofn.lpstrTitle = "Delete File";
m_bDeleteAll = FALSE;
}
5、在CSpecialFileDialog类中映射WM_INITDIALOG消息 BOOL CSpecialFileDialog::OnInitDialog()
{
BOOL bRet = CFileDialog::OnInitDialog();
if (bRet == TRUE) {
GetParent()->GetDlgItem(IDOK)->SetWindowText("Delete");
}
return bRet;
}
6、在CSpecialFileDialog类中映射IDC_DELETE按钮 void CSpecialFileDialog::OnDelete()
{
m_bDeleteAll = TRUE;
// 0x480 is the child window ID of the File Name edit control
// (as determined by SPYXX)
GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);
GetParent()->SendMessage(WM_COMMAND, IDCANCEL); }
7、在ex07aView.cpp文件的虚函数OnDraw中加进一些代码 void CEx07aView::OnDraw(CDC* pDC)
{
pDC->TextOut(0, 0, "Press the left mouse button here."); }
8、利用ClassWizard加进CEx07aView的鼠标消息处理函数。加进WM _LBUTTON
DOWN消息的处理函数
void CEx07bView::OnLButtonDown(UINT nFlags, CPoint point) {
CSpecialFileDialog dlgFile(TRUE, NULL, "*.obj");
CString strMessage;
int nModal = dlgFile.DoModal();
if ((nModal == IDCANCEL) && (dlgFile.m_bDeleteAll)) {
strMessage.Format(
"Are you sure you want to delete all %s files?",
dlgFile.m_strFilename);
if (AfxMessageBox(strMessage, MB_YESNO) == IDYES) {
HANDLE h;
WIN32_FIND_DATA fData;
while((h = ::FindFirstFile(dlgFile.m_strFilename, &fData))
!= (HANDLE) 0xFFFFFFFF) { // no MFC equivalent
if (::DeleteFile(fData.cFileName) == FALSE) {
strMessage.Format("Unable to delete file %s\n",
fData.cFileName);
AfxMessageBox(strMessage);
break;
}
}
}
}
else if (nModal == IDOK) {
CString strSingleFilename = dlgFile.GetPathName();
strMessage.Format(
"Are you sure you want to delete %s?", strSingleFilename);
if (AfxMessageBox(strMessage, MB_YESNO) == IDYES) {
CFile::Remove(strSingleFilename);
}
}
}
9、我们还需要将包含语句#include "SpecFileDlg.h"加在如下语句行之后#include
"ex07bView.h"