gpt4 book ai didi

c++ - 编辑控件替换背景需要选择HBRUSH吗?

转载 作者:行者123 更新时间:2023-11-30 03:40:50 25 4
gpt4 key购买 nike

我的目标是为公共(public)控件的 edit control 替换背景。我当前的代码是这样做的:

HBITMAP hBmp = ::LoadBitmap(hInstance, MAKEINTRESOURCE(BKGND_ID));
HBRUSH hBkgndBrush = ::CreatePatternBrush(hBmp);
::DeleteObject(hBmp);


HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

if(pWnd->GetDlgCtrlID() == MY_CTRL_ID && hBkgndBrush)
{
hbr = hBkgndBrush;

//Do I need to select it?
//pDC->SelectObject(hbr); //This line?

pDC->SetBkMode(TRANSPARENT);
}

// TODO: Return a different brush if the default is not desired
return hbr;
}

问题是,我需要在返回之前选择hbr吗? (请参阅上面的注释行。)我似乎在不同的在线示例中看到它是两种方式完成的。

编辑: 还忘了说,我这样覆盖了 WM_ERASEBKGND:

HDC hDc = ::GetDC(hWnd);
if(hDc)
{
RECT rc = {0};
::GetClientRect(hWnd, &rc);

::FillRect(hDc, &rc, hBkgndBrush);

::ReleaseDC(hWnd, hDc);
}

EDIT2: 我做了一个小的 sample MFC project 来说明这个问题。基本上,当我将应用程序快速移出屏幕然后返回时,它会产生这种视觉“故障”,但前提是控件没有 ES_MULTILINE 样式:

enter image description here

最佳答案

当使用 CreatePatternBrush 从位图创建背景画笔时,在对话框调整大小或移动过程中可能会出现一些“重复伪像”。

要移除这些瑕疵,强制子控件重新绘制以响应 ON_WM_WINDOWPOSCHANGED 消息:

void CMyDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
CDialog::OnWindowPosChanged(wndpos);

CWnd *wnd = GetWindow(GW_CHILD);
while (wnd)
{
wnd->Invalidate(TRUE);
wnd = wnd->GetWindow(GW_HWNDNEXT);
}
}

void CMyDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
CDialog::OnWindowPosChanged(wndpos);
edit1.Invalidate(FALSE);
edit2.Invalidate(FALSE);
...
}

OnCtlColor 重写如下:

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* wnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_DLG)
return CDialogEx::OnCtlColor(pDC, wnd, nCtlColor);
pDC->SetBkMode(TRANSPARENT);
return hBkgndBrush;
}

您可以根据wndnCtlColor 添加其他条件,仅更改编辑控件的背景。

关于c++ - 编辑控件替换背景需要选择HBRUSH吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37783444/

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