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

C++MFC編程筆記day10 MF界面控件的使用2、屬性頁對話框、MFC線程

編輯:C++入門知識

C++MFC編程筆記day10 MF界面控件的使用2、屬性頁對話框、MFC線程


一 樹型控件
1 相關類
CTreeCtrl-父類是CWnd,控件類。
CTreeView-父類是CCtrlView,視圖類。CTreeView=CView+CTreeCtrl
CTreeView::GetTreeCtrl
2 CTreeCtrl的使用
對比CListCtrl:列表控件的每個數據項之間是平等關系,通過數據項
的索引值得到數據項的信息。樹控件每個數據項稱之為節點。節點之間
的關系包括父子關系和兄弟關系。通常通過節點句柄得到某個節點。
通常用來表示層次關系的數據。


2.1 設置控件的圖標列表
CTreeCtrl::SetImageList
2.2 插入樹節點
CTreeCtrl::InsertItem
2.3 設置節點的展開狀態
CTreeCtrl::Expand
2.4 設置節點高度
CTreeCtrl::SetItemHeight
....
作業:使用樹控件模擬資源管理器左邊部分






二 屬性頁對話框
1 分類
標簽式和向導式
2 相關類
CPropertyPage-頁面對話框類。
CPropertySheet-框架窗口類,也稱表單類。
一個屬性頁對話框=一個Sheet類的對象+多個Page類的對象
3 使用
3.1 創建標簽式的屬性頁
3.1.1 設置對話框資源窗口,修改語言為簡體中文,雙擊生成相應的類。
注意父類一定是CPropertyPage。
3.1.2 重復3.1.1 步驟可以設計和添加多個頁面
3.1.3 在工程添加CPropertySheet的子類,在類中添加兩個對話框類的
成員變量,並在構造函數中,調用AddPage()函數,添加頁面對象。
3.1.4 創建和顯示標簽式屬性頁
CPropertySheet::DoModal()
3.1.5 在CPage1的編輯框控件的EN_CHANGE消息處理函數中:
CPropertyPage::SetModified()
將應用按鈕設置為可用
3.1.6 在CPage1類添加虛函數OnApply(),在函數中,將對話框中的線寬
傳遞給視圖,視圖重繪。
3.1.7 在CPage2的"顏色"按鈕的消息處理函數中:
1 將應用按鈕設置為可用
2 彈出顏色對話框,選擇相應的顏色,保存到對話框的變量中。
3.1.8 在CPage2類添加虛函數OnApply(),在函數中,將對話框中的顏色
傳遞給視圖,視圖重繪。
在Page頁面(繼承自CPropertyPage)的OnApply中,獲取並操作視圖窗口示例:
CFrameWnd *pFrame=(CFrameWnd*) AfxGetMainWnd();
CSDI_propertypageView *pView=(CSDI_propertypageView*)pFrame->GetActiveView();
pView->m_curLineColor=m_curColor;//設置視圖中的顏色變量
pView->InvalidateRect(NULL,TRUE);//設置視圖窗口無效,引發重繪
在Sheet頁面(繼承自CPropertySheet)中,定義page變量,在構造函數(有兩個)中,添加:
AddPage(&m_page1);
AddPage(&m_page2);
顏色對話框的使用:
CColorDialog cd;
int result=cd.DoModal();
if(result==IDOK)//如果修改了值
{
m_curColor=cd.GetColor();//獲取選擇的值
SetModified(TRUE);//修改後,將應用按鈕設置為可用狀態
}


3.2 創建向導式屬性頁
3.2.1創建和顯示步驟與標簽式的相似,唯一不同的是在創建和顯示前,
設置為向導模式
CPropertySheet::SetWizardMode
3.2.2 設置每個頁面的向導按鈕,在CPropertyPage::OnSetActive()
虛函數中設置向導按鈕。
CPropertyPage::GetParent-獲取頁面的父窗口
CPropertySheet::SetWizardButtons-設置向導按鈕
3.2.3 處理CPage1
1 為控件綁定成員變量
2 添加WM_INITDIALOG消息處理函數,在函數中添加城市選項
3 在CPage1的虛函數OnWizardNext函數中,為空判斷。
3.2.4 處理CPage2
1 為控件綁定成員變量
2 在CPage2的虛函數OnWizardNext函數中,為空判斷。
3.2.5 處理CPage
1 為控件綁定成員變量
2 在CPage2的虛函數OnWizardFinish函數中,為空判斷。
3.2.6 在視圖類對菜單的消息函數中:
1 將對話框中的數據傳遞給視圖
2 視圖重繪
3.2.7 在視圖類的OnDraw函數中,輸出數據




三 MFC線程
MFC按用途把線程分為兩大類:
工作者線程-通常沒有用戶界面,完成後台的一些耗時的操作。
用戶界面線程-通常擁有用戶界面和消息循環,能夠與用戶交互。
1 工作者線程的使用步驟
1.1 定義線程函數,函數原型
UINT MyControllingFunction( LPVOID pParam );
注意:線程函數要麼是全局函數,要麼是類的靜態成員函數
1.2 調用AfxBeginTread,並將線程函數作為第一個參數傳遞。另外
第二參數功能是主線程與子線程之間傳遞數據。
2 用戶界面線程的使用步驟
2.1 在工程中添加CWinThread類的派生類
2.2 在CMyThread::InitInstance()函數中創建子線程的用戶界面
(子線程的用戶界面采用對話框)
2.3 調用AfxBeginTread,將CMyThread的運行時類信息作為參數傳入


3 線程同步類
CSyncObject-線程同步類的父類,子類有:
CCriticalSection-臨界區
CEvent-事件
CMutex-互斥

CSemaphore-信號量


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

\

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

\
4、***Dlg.h 中 添加成員變量和函數
CImageList m_ilNormal;//圖標列表
void initTreeCtrl();


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

// MFCtreeCtrlDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCtreeCtrl.h"
#include "MFCtreeCtrlDlg.h"
#include "resource.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()

/////////////////////////////////////////////////////////////////////////////
// CMFCtreeCtrlDlg dialog

CMFCtreeCtrlDlg::CMFCtreeCtrlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMFCtreeCtrlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMFCtreeCtrlDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCtreeCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMFCtreeCtrlDlg)
	DDX_Control(pDX, IDC_TREE, m_tree);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMFCtreeCtrlDlg, CDialog)
	//{{AFX_MSG_MAP(CMFCtreeCtrlDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMFCtreeCtrlDlg message handlers

BOOL CMFCtreeCtrlDlg::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
	initTreeCtrl();
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMFCtreeCtrlDlg::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 CMFCtreeCtrlDlg::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 CMFCtreeCtrlDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMFCtreeCtrlDlg::initTreeCtrl()
{
	m_ilNormal.Create(IDB_NORMAL,16,1,RGB(0,0,0));
	m_tree.SetImageList(&m_ilNormal,LVSIL_NORMAL);
	HTREEITEM hroot=m_tree.InsertItem("根文件夾",0,1);
	HTREEITEM h1=m_tree.InsertItem("子文件夾1",0,1,hroot);
	HTREEITEM h2=m_tree.InsertItem("子文件夾2",0,1,hroot);
	HTREEITEM h3=m_tree.InsertItem("子文件夾3",0,1,hroot);
	HTREEITEM h4=m_tree.InsertItem("子文件夾4",0,1,hroot);
	HTREEITEM h2_1=m_tree.InsertItem("子文件夾2_1",0,1,h2);
	HTREEITEM h2_1_1=m_tree.InsertItem("子文件夾2_1_1",0,1,h2_1);
	m_tree.SetItemHeight(25);//高度
	m_tree.Expand(hroot,TVE_EXPAND);//設置某個節點項的展開狀態
}


【其他示例稍後補充】




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