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

时间:2009-12-01 03:50:16

标签: c++ winapi

我的窗口上有一些STATIC标签和BUTTON。 我使所有LABELS透明背景,所以我可以让背景RED说。 在CALLBACK中,我处理WM_CTLCOLORSTATIC消息,用GetDlgCtrlID()确定控件的ID,然后:

SetBkMode((HDC)wParam, TRANSPARENT); // Make STATIC control Bkgd transparent
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);

到目前为止一切顺利。绘制表格,背景为红色,标签文字绘制在顶部。

用户交互后我需要更改文本,因此我发出了一个SetDlgItemText()消息,并且新文本是draw。问题是旧文本没有被删除,新文本被绘制在它上面。

今天看了一下,似乎问题是控件父(表单)负责绘制背景。这意味着当您更改标签文本时,控件会重新绘制新文本,但表单不会自动重绘背景。

问题是如何强制表单重绘标签控件的矩形区域(最好没有子类化任何东西)?

增加:

我尝试了以下内容:

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;
} 
马克,谢谢你的确有效。

1 个答案:

答案 0 :(得分:3)

在控件占用的矩形上使用InvalidateRect。

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