gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:30:50 26 4
gpt4 key购买 nike

我有一个带有一些 STATIC 标签和 BUTTON 的窗口。我把所有的标签都设为透明背景,这样我就可以把背景设为红色。在 CALLBACK 中,我处理 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;
}

马克,谢谢你这个作品。

最佳答案

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

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

关于c++ - 更新使用 WS_EX_TRANSPARENT 绘制的 C Win32 API STATIC 控件中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com