程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++MFC編程筆記day09 MF界面控件的使用1

C++MFC編程筆記day09 MF界面控件的使用1

編輯:C++入門知識

C++MFC編程筆記day09 MF界面控件的使用1


一 MFC控件
1 控件介紹

1.1 靜態控件包括圖片、靜態文本和分組框。生成的控件的ID統一是
IDC_STATIC。很少程序中訪問和操作,只是使用靜態控件顯示信息
1.2 編輯框控件,控件類是CEdit,通常使用它接收用戶的輸入,顯示
信息給用戶。
1.3 按鈕控件包括一般按鈕、復選按鈕和單元按鈕,控件類都是CButton
單選按鈕注意,同一組的按鈕Tab鍵順序的編號連續(Ctrl+d 顯示tab順序),而且編號小的
按鈕設置group屬性,才能在同一個對話框中,實現多個單選按鈕的
多個分組。
1.4 組合框(下拉框),控件類是CComboBox。可以在多個選項中選擇一項
也可以輸入新的選項。組合框中的數據項可以通過屬性添加。
在屬性對話框的Data標簽中,添加數據項時,換行是Ctrl+回車鍵。
注意設置控件時,給定足夠的高度。
1.5 列表框,控件類是CListBox,支持單選和多選。
1.6 動畫控件,控件類是CAnimateCtrl。能夠播放簡單的幀動畫。
2 播放動畫的例子
2.1 添加打開文件按鈕的消息處理函數:
2.1.1 彈出打開文件對話框
打開文件對話框CFileDialog類,構造函數
CFileDialog(
BOOL bOpenFileDialog,標識是打開還是另存為對話框
LPCTSTR lpszDefExt = NULL,//默認的擴展名
LPCTSTR lpszFileName = NULL,//默認的文件名稱
DWORD dwFlags//對話框的樣式
LPCTSTR lpszFilter = NULL,//設置文件類型,進行類型過濾
CWnd* pParentWnd = NULL //父窗口,設置為NULL即可。
);
設置文件類型字符串格式:
1 字符串以"||"作為結束符。
2 每個數據項之間用"|"分割
3 每項由兩部分組成,第一部分是顯示部分,第二部分設置過濾的
後綴,這兩部分也是以"|"分割。
"視頻文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
2.1.2 在編輯框中顯示文件路徑
為編輯框控件綁定值類型的成員變量,將文件路徑賦值給該變量
2.1.3 在文件列表中添加文件名稱
為列表框控件綁定控件類型的變量,調用AddString()函數添加
文件名稱。
2.1.4 播放動畫文件
為動畫控件綁定控件類型的變量,調用它的Open、Play函數播放
2.2 在列表控件中實現雙擊播放功能
2.2.1 使用類向導添加列表控件的雙擊消息處理函數,在函數中,
想獲取選擇項對應的文件路徑,所以,在2.1中,列表控件
添加文件名稱,通過附加數據,同時添加了文件路徑
2.2.2 獲取文件路徑,實現雙擊播放功能。注意,對於播放功能,
提取到Play函數中。
2.3 設置重復播放功能
2.3.1為復選框、組合框綁定控件類型的變量。
2.3.2 在對話框的OnInitDialog()函數中,設置組合框控件為
不可用。
2.3.3 雙擊復選框按鈕,生成消息處理函數,在函數中,根據
復選框的Check狀態,設置組件框的狀態
2.3.4 修改Play()函數,根據上述兩個控件的值,設置播放的次數
2.4 添加單選按鈕播放和停止的消息處理函數,播放只需調用Play函數
而停止,只需調用動畫控件的Stop函數即可。
3 靜態控件以及單選按鈕如何實現綁定操作
3.1 靜態控件需要修改ID
3.2 單選按鈕需要設置Group屬性,而且每一組單選按鈕綁定一個變量。
4 組合框和列表框的常用函數
4.1 添加數據項
AddString
4.2 刪除數據項
DeleteString
4.3 查找字符串
FindString
如果找不到,組合框返回CB_ERR,列表框返回LB_ERR
4.4 設置/獲取數據項的附加數據
SetItemData/GetItemData
4.5 設置/獲取當前的選擇項
SetCurSel/GetCurSel
...
5 完成列表框的例子
CListBox,數值綁定計算加法運算。






一 MFC控件介紹
1 控件介紹
1.1 微調按鈕(旋轉按鈕)
通常和編輯框共同完成相關功能,使用前,設置微調按鈕的屬性,增加或減少,和編輯框結成伙伴關系,還可以設置對齊方式。ctrl+d顯示tab順序,編輯框和微調要相鄰,微調樣式,排序選擇“靠右”,選擇復選框“自動結伴”、“設置結伴整數”
1.2 進度條
通常用於安裝程序或者復制文件時顯示完成進度。
1.3 滑塊
可以通過屬性設置刻度,用來顯示一個能調節的數值功能。
2 控件使用
2.1 這三個控件在使用前,通常都需要設置表式的數值范圍
SetRange/GetRange
SetRange32/GetRange32
2.2 設置控件的步長
CProgressCtrl::SetStep
CSliderCtrl::SetPageSize
CSliderCtrl::SetLineSize
CSpinButtonCtrl::SetAccel
2.3 設置/獲取當前位置
SetPos/GetPos




二 列表控件
1 相關類
CListCtrl- 父類是CWnd,控件類的一種,通常用在對話框上。
CListView-父類是CCtrlView,視圖類的一種。
CListView=CView+CListCtrl,CListView相當於
在CView的客戶區添加了一個CListCtrl控件。調用
CListView::GetListCtrl,得到控件。
2 CListCtrl的使用
2.1 設計並設置控件的圖標列表(大圖標和小圖標)
2.1.1 添加位圖資源,設計圖標列表


2.1.2 創建CImageList
CImageList::Create
2.1.3 將圖標列表設置到控件
CListCtrl::SetImageList
2.1.4 添加列
CListCtrl::InsertColumn
2.1.5 添加數據項
CListCtrl::InsertItem
2.1.6 設置列的文本
CListCtrl::SetItemText
2.1.7 設置/獲取數據項的附加數據
CListCtrl::SetItemData/GetItemData
2.1.8 設置控件的背景圖片
CListCtrl::SetBkImage
注意:調用該函數前,需要Ole庫的初始化
AfxOleInit();
另外,通常也需將字體的背景色設置為透明

m_wndList.SetTextBkColor(CLR_NONE);


示例1:
1、新建MFC對話框應用程序DlgCtrl。
2、可視化編輯界面控件

\
3、ctrl+w 綁定控件對應的成員變量

\
4、ctrl+w 綁定列表框項的雙擊事件和按鈕的單擊事件

\
5、***Dlg.cpp中的主要實現代碼(部分是自動生成的)

#include "stdafx.h"
#include "DlgCtrl.h"
#include "DlgCtrlDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrlDlg dialog

CDlgCtrlDlg::CDlgCtrlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgCtrlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgCtrlDlg)
	m_strFilePath = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDlgCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgCtrlDlg)
	DDX_Control(pDX, IDC_PLAYTIMES, m_cboPlayCount);
	DDX_Control(pDX, IDC_REPLAY, m_btnReplay);
	DDX_Control(pDX, IDC_VIDEO, m_animateVideo);
	DDX_Control(pDX, IDC_LIST_FILENAME, m_listFileName);
	DDX_Text(pDX, IDC_EDIT_FILEPATH, m_strFilePath);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDlgCtrlDlg, CDialog)
	//{{AFX_MSG_MAP(CDlgCtrlDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPEN_FILE, OnOpenFile)
	ON_LBN_DBLCLK(IDC_LIST_FILENAME, OnDblclkListFilename)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_REPLAY, OnReplay)
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrlDlg message handlers

BOOL CDlgCtrlDlg::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
	m_cboPlayCount.EnableWindow(FALSE);//次數不可用
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDlgCtrlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDlgCtrlDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDlgCtrlDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDlgCtrlDlg::OnOpenFile()
{
	// TODO: Add your control notification handler code here
	char lpszFilter[]="視頻(*.avi)|*.avi|視頻(*.rmvb)|*.rmvb|所有文件(*.*)|*.*||";
	CFileDialog dlg(TRUE,NULL,NULL,
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		lpszFilter);
	if(IDOK!=dlg.DoModal()) return;
	//編輯框中更新文件路徑
	m_strFilePath=dlg.GetPathName();
	UpdateData(FALSE);
	//列表加入文件名
	//m_listFileName.AddString(dlg.GetFileName());
	CString strName=dlg.GetFileName();
	if (LB_ERR==m_listFileName.FindString(-1,strName))
	{
		//添加文件名稱
		int nIndex=m_listFileName.AddString(strName);
		CString *pPath=new CString;
		*pPath=m_strFilePath;
		//通過附加數據,保存文件路徑
		m_listFileName.SetItemData(nIndex,(DWORD)pPath);

	}

	//動畫控件播放動畫
	play();
}

void CDlgCtrlDlg::play()
{
	int nCount=1;//保存播放的次數
    if (m_btnReplay.GetCheck())
    {
		int nSel=m_cboPlayCount.GetCurSel();
		switch(nSel)
		{
		case 0://重復播放
			nCount=-1;
			break;
		case 1://重復一次
			nCount=2;
			break;
		case 2://重復兩次
			nCount=3;
			break;
		}
    }
	m_animateVideo.Open(m_strFilePath);
	m_animateVideo.Play(0,-1,nCount);
}

void CDlgCtrlDlg::OnDblclkListFilename()
{
	//獲取雙擊時,當前的選擇項
	int nSel=m_listFileName.GetCurSel();
	if (LB_ERR==nSel)return;
	//播放當前選中的文件
	CString *pPath=(CString*) m_listFileName.GetItemData(nSel);
	m_strFilePath=*pPath;
	//播放
	play();
	UpdateData(FALSE);
	AfxMessageBox(*pPath);
}

void CDlgCtrlDlg::OnClose()
{
	//字符串路徑在附加數據裡,關閉時要刪除
	for (int i=0;i



示例2:
1、新建MFC對話框應用程序DlgCtrl2。
2、可視化編輯界面控件

\
3、ctrl+w 綁定控件對應的成員變量

\
4、ctrl+w 綁定列表框項的雙擊事件和按鈕的單擊事件

\
5、***Dlg.cpp中的主要實現代碼(部分是自動生成的)

#include "stdafx.h"
#include "DlgCtrl2.h"
#include "DlgCtrl2Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrl2Dlg dialog

CDlgCtrl2Dlg::CDlgCtrl2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgCtrl2Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgCtrl2Dlg)
	m_edit_a = 0;
	m_edit_b = 0;
	m_edit_sum = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDlgCtrl2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgCtrl2Dlg)
	DDX_Control(pDX, IDC_LIST_RIGHT, m_list_right);
	DDX_Control(pDX, IDC_LIST_LEFT, m_list_left);
	DDX_Text(pDX, IDC_EDIT_A, m_edit_a);
	DDX_Text(pDX, IDC_EDIT_B, m_edit_b);
	DDX_Text(pDX, IDC_EDIT_SUM, m_edit_sum);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDlgCtrl2Dlg, CDialog)
	//{{AFX_MSG_MAP(CDlgCtrl2Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_EQUAL, OnButtonEqual)
	ON_BN_CLICKED(IDC_BUTTON_ToLeft, OnBUTTONToLeft)
	ON_BN_CLICKED(IDC_BUTTON_ToLeftALL, OnBUTTONToLeftALL)
	ON_BN_CLICKED(IDC_BUTTON_ToRight, OnBUTTONToRight)
	ON_BN_CLICKED(IDC_BUTTON_ToRightALL, OnBUTTONToRightALL)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrl2Dlg message handlers

BOOL CDlgCtrl2Dlg::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
	//初始化左邊列表框
	m_list_left.AddString("北京");
	m_list_left.AddString("上海");
	m_list_left.AddString("廣州");
	m_list_left.AddString("深圳");

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDlgCtrl2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDlgCtrl2Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDlgCtrl2Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDlgCtrl2Dlg::OnButtonEqual()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_edit_sum=m_edit_a+m_edit_b;
	UpdateData(FALSE);
}

void CDlgCtrl2Dlg::OnBUTTONToLeft()
{
	// TODO: Add your control notification handler code here
	int sel=m_list_right.GetCurSel();
	if(sel==LB_ERR) return;
	CString str;
	m_list_right.GetText(sel,str);//獲取右邊值
	m_list_left.AddString(str);//添加到左邊
	m_list_right.DeleteString(sel);//刪除右邊
}

void CDlgCtrl2Dlg::OnBUTTONToLeftALL()
{
	// TODO: Add your control notification handler code here
	CString str;
	while(m_list_right.GetCount()>0)
	{
		m_list_right.GetText(0,str);
		m_list_left.AddString(str);
		m_list_right.DeleteString(0);
	}
}

void CDlgCtrl2Dlg::OnBUTTONToRight()
{
	// TODO: Add your control notification handler code here
	//獲取左邊列表選擇項
	int sel=m_list_left.GetCurSel();
	if(sel==LB_ERR) return;
	CString str;
	m_list_left.GetText(sel,str);//獲取左邊值
	m_list_right.AddString(str);//添加到右邊
	m_list_left.DeleteString(sel);//刪除左邊
}

void CDlgCtrl2Dlg::OnBUTTONToRightALL()
{
	// TODO: Add your control notification handler code here
	CString str;
	while(m_list_left.GetCount()>0)
	{
		m_list_left.GetText(0,str);
		m_list_right.AddString(str);
		m_list_left.DeleteString(0);
	}
}




【示例代碼稍後補充】


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved