MFC day05

目录:
模式对话框的使用
非模式对话框的使用
对话框的数据交换技术
基本控件的使用
1 模式对话框的使用
1.1 问题
CDialog类 - 对话框类的父类,用于创建一般的对话框。

CCommonDialog类 - 父类是CDialog类,通用对话框类,包含了一系列的可以直接使用的通用对话框,以它子类的方式提供。文件对话框、颜色对话框、字体对话框、打印对话框页面设置对话框、查找替换对话框。

CPropertyPage类 - 父类也是CDialog类,属性页对话框。可以完成标签式属性页和向导式属性页。

1.2 方案
编写一个应用程序程序,在应用程序中使用CDialog类创建对话框。

1.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:创建对话框类

添加CDialog类的派生类CMyModalDialog类,添加资源和对对话框资源,点击确定键时退出程序!代码如下所示:

class CMyModalDialog : public CDialog
{
public:
CMyModalDialog( );
public:
virtual BOOL OnInitDialog( );
DECLARE_MESSAGE_MAP( )
public:
afx_msg void OnPaint( );
afx_msg void OnMyOK( );
};
BEGIN_MESSAGE_MAP( CMyModalDialog, CDialog )
ON_WM_PAINT( )
ON_COMMAND( IDOK, OnMyOK )
END_MESSAGE_MAP( )
CMyModalDialog::CMyModalDialog( ) :
CDialog( IDD_DIALOG1 )
{
}
BOOL CMyModalDialog::OnInitDialog( )
{
CDialog::OnInitDialog( );
return TRUE;
}
void CMyModalDialog::OnPaint( )
{
CPaintDC dc( this );
dc.Rectangle( 0, 0, 100, 100 );
}
void CMyModalDialog::OnMyOK( )
{
CDialog::OnOK( );
}
步骤二:创建应用程序类

添加CWinApp类的派生类CDlgApp类,创建应用程序类以及创建对话框!代码如下所示:

class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CMyModalDialog dlg;
m_pMainWnd = &dlg;
if( IDOK == dlg.DoModal( ) )
{
AfxMessageBox( “你点击了确定” );
}
else
{
AfxMessageBox( “你点击了取消” );
}
return TRUE;
}
1.4 完整代码
本案例的完整代码如下所示:

#include “stdafx.h”
#include “resource.h”
class CMyModalDialog : public CDialog
{
public:
CMyModalDialog( );
public:
virtual BOOL OnInitDialog( );
DECLARE_MESSAGE_MAP( )
public:
afx_msg void OnPaint( );
afx_msg void OnMyOK( );
};
BEGIN_MESSAGE_MAP( CMyModalDialog, CDialog )
ON_WM_PAINT( )
ON_COMMAND( IDOK, OnMyOK )
END_MESSAGE_MAP( )
CMyModalDialog::CMyModalDialog( ) :
CDialog( IDD_DIALOG1 )
{
}
BOOL CMyModalDialog::OnInitDialog( )
{
CDialog::OnInitDialog( );
//AfxMessageBox( “OnInitDialog” );
return TRUE;
}
void CMyModalDialog::OnPaint( )
{
CPaintDC dc( this );
dc.Rectangle( 0, 0, 100, 100 );
}
void CMyModalDialog::OnMyOK( )
{
CDialog::OnOK( );
}
class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CMyModalDialog dlg;
m_pMainWnd = &dlg;
if( IDOK == dlg.DoModal( ) )
{
AfxMessageBox( “你点击了确定” );
}
else
{
AfxMessageBox( “你点击了取消” );
}
return TRUE;
}
运行结果:如图-1所示
在这里插入图片描述
2 非模式对话框的使用
2.1 问题
模式对话框的实现机制

1 定义对话框对象并执行

2 对话框查找资源获取资源数据

3 创建对话框窗口

2.2 方案
编写一个应用程序程序,使用CDialog类实现非模式对话框。

2.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:创建对话框类

添加CDialog类的派生类CModelessDlg类,当用户点击确定是销毁窗口。

代码如下所示:

class CModelessDlg : public CDialog
{
public:
virtual void OnOK( );
};
void CModelessDlg::OnOK( )
{
DestroyWindow( );
}
步骤二:创建应用程序类

添加CWinApp类的派生类CDlgApp类,创建应用程序类以及创建非模式对话框!代码如下所示:

class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CModelessDlg * pDlg = new CModelessDlg( );
pDlg->Create( IDD_DIALOG1 );
m_pMainWnd = pDlg;
m_pMainWnd->ShowWindow( SW_SHOW );
m_pMainWnd->UpdateWindow( );
return TRUE;
}
2.4 完整代码
本案例的完整代码如下所示:

#include “stdafx.h”
#include “resource.h”
class CModelessDlg : public CDialog
{
public:
virtual void OnOK( );
};
void CModelessDlg::OnOK( )
{
DestroyWindow( );
}
class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CModelessDlg * pDlg = new CModelessDlg( );
pDlg->Create( IDD_DIALOG1 );
m_pMainWnd = pDlg;
m_pMainWnd->ShowWindow( SW_SHOW );
m_pMainWnd->UpdateWindow( );
return TRUE;
}
运行结果:如图-2所示:
在这里插入图片描述
3 对话框的数据交换技术
3.1 问题
对话框的数据交换将对话框的子控件和对话框类的成员变量绑定,通过这些变量值接获取或设置子控件的值,以及获取子控件的窗口对象。

3.2 方案
编写一个应用程序程序,通过数据绑定的方式,使用变量操作对话框的控件。

3.3 步骤
实现此案例需要按照如下步骤进行。

步骤一:创建对话框类

添加CDialog类的派生类CMyModalDialog类,添加资源和对话框资源,以及进行数据绑定和交换操作!代码如下所示:

class CMyDialog : public CDialog
{
public:
CMyDialog( );
public:
virtual void DoDataExchange( CDataExchange* pDX );
DECLARE_MESSAGE_MAP( )
public:
afx_msg void OnButton1( );
public:
CString m_strText;
CWnd m_wndButton1;
};
BEGIN_MESSAGE_MAP( CMyDialog, CDialog )
ON_COMMAND( IDC_BUTTON1, OnButton1 )
END_MESSAGE_MAP( )
CMyDialog::CMyDialog( ) :
CDialog( IDD_DIALOG1 )
{
m_strText = “hello DDX”;
}
void CMyDialog::DoDataExchange( CDataExchange* pDX )
{
CDialog::DoDataExchange( pDX );
DDX_Text( pDX, IDC_EDIT1, m_strText );
DDX_Control( pDX, IDC_BUTTON1, m_wndButton1 );
}
void CMyDialog::OnButton1( )
{
UpdateData( TRUE );
AfxMessageBox( m_strText );
m_wndButton1.GetWindowText( m_strText );
UpdateData( FALSE );
}
步骤二:创建应用程序类

添加CWinApp类的派生类CDlgApp类,创建应用程序类以及创建对话框!代码如下所示:

class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CMyDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal( );
return TRUE;
}
3.4 完整代码
本案例的完整代码如下所示:

#include “stdafx.h”
#include “resource.h”
class CMyDialog : public CDialog
{
public:
CMyDialog( );
public:
virtual void DoDataExchange( CDataExchange* pDX );
DECLARE_MESSAGE_MAP( )
public:
afx_msg void OnButton1( );
public:
CString m_strText;
CWnd m_wndButton1;
};
BEGIN_MESSAGE_MAP( CMyDialog, CDialog )
ON_COMMAND( IDC_BUTTON1, OnButton1 )
END_MESSAGE_MAP( )
CMyDialog::CMyDialog( ) :
CDialog( IDD_DIALOG1 )
{
m_strText = “hello DDX”;
}
void CMyDialog::DoDataExchange( CDataExchange* pDX )
{
CDialog::DoDataExchange( pDX );
DDX_Text( pDX, IDC_EDIT1, m_strText );
DDX_Control( pDX, IDC_BUTTON1, m_wndButton1 );
}
void CMyDialog::OnButton1( )
{
UpdateData( TRUE );
AfxMessageBox( m_strText );
m_wndButton1.GetWindowText( m_strText );
UpdateData( FALSE );
}
class CDlgApp : public CWinApp
{
public:
virtual BOOL InitInstance( );
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance( )
{
CMyDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal( );
return TRUE;
}
运行结果:如图-3所示
在这里插入图片描述
4 基本控件的使用
4.1 问题
使用一个综合的对话框例子演示基本控件的使用,并包含通用对话框的使用。

4.2 方案
创建对话框工程,使用动画按钮,按钮,静态框,列表框,单选按钮等来获取播放的动画文件并播放。

4.3 步骤
1 创建对话框工程,添加基本控件到窗口

2 打开动画文件,文件路径显示在静态框,文件名显示在列表框

3 通过单选按钮来选择循环播放的次数

4 点击开始或者停止按钮来控制动画的播放

4.4 完整代码
本案例的完整代码如下所示:

void CMFCCtrlDlg::OnOpenfile()
{
//
CHAR szFilter[] = “AVI File(.avi)|.avi||”;
CFileDialog dlg( TRUE, NULL, NULL,OFN_HIDEREADONLY, szFilter );
if( IDOK != dlg.DoModal( ) )
{
return;
}
//获取选择的文件
m_strFilePath = dlg.GetPathName( );
UpdateData( FALSE );
//将选择的文件加入到ListBox
int nItem = m_wndHistory.AddString(
dlg.GetFileName( ) );
//保存文件路径到选项
CString * pstrFilePath = new CString;
*pstrFilePath = dlg.GetPathName( );
m_wndHistory.SetItemData( nItem,
(DWORD)pstrFilePath );
//
}
void CMFCCtrlDlg::OnStart()
{ //打开播放文件
m_wndAnimate.Open( m_strFilePath );
//播放文件
if( m_wndLoop.GetCheck( ) )
{ //获取循环次数
int nSel = m_wndLoopNum.GetCurSel( );
switch( nSel )
{
case 0: //不限次数
m_wndAnimate.Play( 0, -1, -1 );
break;
case 1:
m_wndAnimate.Play( 0, -1, 2 );
break;
case 2:
m_wndAnimate.Play( 0, -1, 3 );
break;
case 3:
m_wndAnimate.Play( 0, -1, 4 );
break;
}
}
else
{
m_wndAnimate.Play( 0, -1, 1 );
}
}
void CMFCCtrlDlg::OnStop()
{ //停止
m_wndAnimate.Stop( );
//关闭
m_wndAnimate.Close( );
}
void CMFCCtrlDlg::OnLoop()
{ //获取CheckBox状态
BOOL bCheck = m_wndLoop.GetCheck();
//设置ComboBox状态
m_wndLoopNum.EnableWindow( bCheck );
}
void CMFCCtrlDlg::OnDblclkHistory()
{ //获取被选择项
int nSel = m_wndHistory.GetCurSel( );
if( LB_ERR == nSel )
{
return;
}
//获取选择项的路径
CString * pstrPathName = ( CString * )
m_wndHistory.GetItemData( nSel );
//设置到EDIT中
m_strFilePath = *pstrPathName;
UpdateData( FALSE );
}
void CMFCCtrlDlg::OnSethotkey()
{ //获取设置的热键
DWORD nHotKey = m_wndHotKey.GetHotKey( );
//设置成程序的热键
SendMessage( WM_SETHOTKEY, nHotKey );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值