我有一个窗口,上面有一些静态标签和按钮。我将所有标签设置为透明背景,这样我就可以将背景设置为红色。
在回调函数中处理WM_CTLCOLORSTATIC消息,使用GetDlgCtrlID()确定控件的ID,然后执行以下操作:
SetBkMode((HDC)wParam, TRANSPARENT); // Make STATIC control Bkgd transparent
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);
目前为止还不错。表格已绘制,背景为红色,标签文本位于顶部。
用户交互后,我需要更改文本,所以我发出了一个 SetDlgItemText() 消息,并绘制了新文本。问题是旧文本没有被擦除,新文本在其上绘制。
根据今天的一些阅读,似乎问题在于控件的父级(即表格)负责绘制背景。这意味着当您更改标签文本时,控件会重新绘制新文本,但表格不会自动重新绘制背景。
问题是如何强制表格重新绘制标签控件的矩形区域(最好不要子类化任何内容)?
添加:
我已尝试以下操作:
HWND hctrl;
hctrl = GetDlgItem(hwnd, ControlID);
RedrawWindow( hctrl, 0, 0,
RDW_UPDATENOW || RDW_ALLCHILDREN || RDW_FRAME || RDW_INVALIDATE || RDW_ERASE || RDW_INTERNALPAINT ); // RDW_UPDATENOW
同时:
我并没有处理WM_PAINT消息,只有:
case WM_CTLCOLORSTATIC:
SetBkMode((HDC)wParam, TRANSPARENT);
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);
int Library::SetControlTxt( int ControlID, string sText ) // Dialog Out
{
int RetVal;
RetVal = SetDlgItemText( hwnd, ControlID, sText.c_str() );
RECT rect;
HWND hctrl;
hctrl = GetDlgItem(hwnd, ControlID);
GetClientRect(hctrl, &rect);
MapWindowPoints(hctrl, hwnd, (POINT *)&rect, 2);
InvalidateRect(hwnd, &rect, TRUE);
return RetVal;
}
马克,谢谢,这个可行。
RedrawWindow(hwnd, &rect, NULL, RDW_ERASE | RDW_INVALIDATE);
我也会更新我的答案。 - Mark Ransom