1. 程式人生 > >動態Static文字導致字型重疊的解決方案

動態Static文字導致字型重疊的解決方案

場景: 需要動態更新Static靜態文字框的內容來顯示不同狀態資訊

要求:設定文字框背景透明

方法:新增訊息ON_WM_CTLCOLOR()

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

	// TODO:  在此更改 DC 的任何特性

	// TODO:  如果預設的不是所需畫筆,則返回另一個畫筆

	//設定標籤背景透明
	if (pWnd->GetDlgCtrlID() == IDC_Status)
	{
		pDC->SetBkMode(TRANSPARENT);			//文字背景
		pDC->SetTextColor(RGB(60, 160, 60));		//文字顏色
		return (HBRUSH)GetStockObject(HOLLOW_BRUSH);    //控制元件背景
	}

	return hbr;
}
但這種方法有一個弊端:不能動態更新static控制元件內容,否則輸出的文字會重疊
解決辦法:在設定CStatic的文字內容之前,先呼叫InvalidateRect() 強制重新整理該CStatic區域,然後再呼叫SetDlgItemText();
void CAppHelperDlg::RefreshStatic()
{
	if (((CStatic*)GetDlgItem(IDC_Status))->GetSafeHwnd())
	{
		CStatic* pStatic = (CStatic*)GetDlgItem(IDC_Status);
		ASSERT(pStatic);

		CRect rc;
		pStatic->GetWindowRect(&rc);
		ScreenToClient(&rc);
		InvalidateRect(&rc);
	}
}


或者在OnCtlColor()中將字型背景色和控制元件背景色設定成和父視窗背景色一致也行,但如果該控制元件的後面為漸變色,則這方法就不好辦了。