更新使用 WS_EX_TRANSPARENT 绘制的 C Win32 API STATIC 控件中的文本

Mik*_*der 4 c++ winapi

我有一个带有一些静态标签和按钮的窗口。我将所有标签设置为透明背景,这样我就可以将背景设置为红色。在 CALLBACK 中,我处理 WM_CTLCOLORSTATIC 消息,使用 GetDlgCtrlID() 确定控件的 ID,然后:

SetBkMode((HDC)wParam, TRANSPARENT); // Make STATIC control Bkgd transparent
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。绘制表格,背景为红色,标签文本绘制在顶部。

用户交互后,我需要更改文本,因此我发出 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 
Run Code Online (Sandbox Code Playgroud)

和:

我根本不处理 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;
} 
Run Code Online (Sandbox Code Playgroud)

马克,谢谢你,这有效。

Mar*_*som 6

对控件占用的矩形使用 InvalidateRect。

RECT rect;
GetClientRect(hctrl, &rect);
InvalidateRect(hctrl, &rect, TRUE);
MapWindowPoints(hctrl, hwnd, (POINT *) &rect, 2);
RedrawWindow(hwnd, &rect, NULL, RDW_ERASE | RDW_INVALIDATE);
Run Code Online (Sandbox Code Playgroud)