動態Static文字導致字型重疊的解決方案
阿新 • • 發佈:2019-01-05
場景: 需要動態更新Static靜態文字框的內容來顯示不同狀態資訊
要求:設定文字框背景透明
方法:新增訊息ON_WM_CTLCOLOR()
但這種方法有一個弊端:不能動態更新static控制元件內容,否則輸出的文字會重疊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; }
解決辦法:在設定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()中將字型背景色和控制元件背景色設定成和父視窗背景色一致也行,但如果該控制元件的後面為漸變色,則這方法就不好辦了。