1. 程式人生 > >MFC基本控制元件使用——靜態文字框(Static)

MFC基本控制元件使用——靜態文字框(Static)

眾所周知,在MFC應用程式中,靜態文字框的使用可以說是必不可少。但是呢,就MFC提供的Static直接使用起來還是有一些小問題的。比如說:

(1)當對話方塊有背景圖片或其他顏色的時候,靜態文字框會有很難看的灰色的背景顏色,所以這裡存在一個透明的問題;

(2)如何怎麼修改靜態文字框中文字的顏色、大小、字型等等;

(3)其實靜態文字框也可以像按鈕一樣,Click、MoveOn等等事件可以觸發。

下面就一一講述下怎麼實現的。

第一個問題:對靜態文字框的背景實現透明處理:

首先,過載對話方塊的OnCtlColor()函式,也就是負責控制元件的顏色繪製

然後,如下所示,指定ID相對應的控制元件的背景模式為透明

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	int n = pWnd->GetDlgCtrlID();
	if (n == IDC_STATIC_XXX)		//這裡的ID就是你自己要設定透明的靜態文字框ID
	{
		 pDC->SetBkMode(TRANSPARENT);
		 return HBRUSH(GetStockObject(HOLLOW_BRUSH));
	}
	// TODO:  如果預設的不是所需畫筆,則返回另一個畫筆
	return hbr;
}

第二個問題:修改靜態文字框中文字的顏色、大小、字型:

如果是要修改文字的顏色,那麼就如同第一個問題一樣,過載OnCtlColor()函式,並在裡面修改文字的顏色

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);


	// TODO:  在此更改 DC 的任何特性
	int n = pWnd->GetDlgCtrlID();
	if (n == IDC_STATIC_XXX)					//這裡的ID就是你自己要設定透明的靜態文字框ID
	{
		 pDC->SetTextColor(RGB(255, 0, 0));		//這裡的RGB(255, 0, 0)就是你自己要設定的字型顏色
		 return HBRUSH(GetStockObject(HOLLOW_BRUSH));
	}
	// TODO:  如果預設的不是所需畫筆,則返回另一個畫筆
	return hbr;
}

如果是要修改文字的大小、字型,那麼需要分2步

1.在對話方塊的標頭檔案中,建立CFont m_font,這是對話方塊的類成員變數;

2.在OnInitDialog()函式中給m_font建立字型,並用靜態文字框的控制元件設定該建立的字型

XXXDlg對話方塊標頭檔案:

#pragma once

// CXXXDlg 對話方塊
class CXXXDlg : public CDialogEx
{
// 構造
public:
	CTestDlg(CWnd* pParent = NULL);	// 標準建構函式

// 對話方塊資料
	enum { IDD = IDD_TEST_DIALOG };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支援

// 實現
protected:
	HICON m_hIcon;
	// 生成的訊息對映函式
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CFont m_font;				// 待建立的字型
	CStatic m_static_xxx;		// 為靜態文字框控制元件新增的Control型別的變數(注意:最好統一用ClassWizard來給控制元件新增變數)
};


XXXDlg對話方塊原始檔的OnInitDialog()函式:
BOOL CXXXDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動執行此操作
	SetIcon(m_hIcon, TRUE);			// 設定大圖示
	SetIcon(m_hIcon, FALSE);		// 設定小圖示

	// TODO: 在此新增額外的初始化程式碼
	m_font.CreatePointFont(100, _T("楷體"), NULL);		// 100即為文字的大小,_T("楷體")即為文字的字型
	m_static_xxx.SetFont(m_font);						// 設定字型
	return TRUE;  // 除非將焦點設定到控制元件,否則返回 TRUE
}
第三個問題:怎麼給靜態文字框新增事件

其實要給靜態文字框新增事件很簡單。最簡單的,例如:新增一個OnClick()訊息事件,然後在這個OnClick函式體內寫上一句MessageBoxW(_T("XXX"));但是執行後卻會現當點選這個靜態文字框時,並不會彈出一個帶有"XXX"字樣的文字框。

這是因為靜態文字框預設是不會給父視窗傳送訊息的,只有在靜態文字框的屬性中的Notify(通知)改為TRUE,這樣再點選靜態文字框就會有訊息框彈出啦~

當然,還可以自己寫一個繼承自CStatic的CStaticEx類,在這個裡面可以實現更多的訊息事件。

總結:好了,到這裡靜態文字框的最基本的一些使用方法都說了。不過會發現,雖然以上的這些解決方法確實能夠實現想要的效果,但是用起來卻並不是這麼方便。就比如說我想要設定靜態文字框中文字的顏色、大小、字型之類的,這些程式碼都被分散開來。如果是小的MFC工程,那這點當然沒有問題,但是當一個比較大的工程,作為開發人員當然想統一處理這些控制元件的一些屬性。所以我覺得很有必要寫一個CStaticEx類,將這些功能在這個擴充套件類中實現,提供一些介面,使開發人員更直接方便的設定靜態文字框的屬性。

這裡,我寫了一個比較簡單的CStaticEx,可以支援

(1)背景透明;

(2)設定文字的顏色、大小、字型、粗體、斜體、下劃線;

(3)修改文字內容(如用上文方法設定背景透明後,修改文字內容會有重影,而此方法不會有重影);

(4)連結效果(滑鼠停在控制元件上,滑鼠變成手的形狀,並且文字帶有下劃線);

(5)手型效果(滑鼠停在控制元件上,滑鼠變成手的形狀);

(6)flash文字效果(根據設定的2種顏色,定時變換文字的顏色,一閃一閃的效果)。