image - 优化校准背景是灰色的,我想要白色的

标签 image visual-c++ mfc background-color picturebox

我的应用程序有一个图片控件,其背景是灰色的,我希望它是白色的。我已经尝试了几件事,例如:派生一个类并重写 OnPaint 方法;响应WM_CTLCOLOR消息(添加ON_WM_CTLCOLOR()并处理它),但没有成功。

消息映射上的条目:

ON_WM_CTLCOLOR()

实现:

BOOL CMyDialog::OnInitDialog()
{
    __super::OnInitDialog();

    white.CreateSolidBrush(RGB(255,255,255));

    //...

    return TRUE;  // return TRUE  unless you set the focus to a control
}


HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd == GetDlgItem(IDC_PICTURE))
    {
        return white;
    }

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}

头文件类定义:

CBrush white;

HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

gray back

最佳答案

使用 Spy++ 进行一些调试后,我意识到 Picture Control 是一个静态控件,并且我必须处理的消息不是 WM_CTLCOLOR 而是 WM_CTLCOLORSTATIC

enter image description here

因此,在包含它的对话框中,我更改了消息映射

ON_WM_CTLCOLOR()

ON_MESSAGE(WM_CTLCOLORSTATIC, OnCtlColorStatic)

在实现上,改变方法

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd == GetDlgItem(IDC_PICTURE))
    {
        return white;
    }

    return __super::OnCtlColor(pDC, pWnd, nCtlColor);
}

LRESULT CMyDialog::OnCtlColorStatic(WPARAM wParam, LPARAM lParam)
{
    HWND hWnd = (HWND)lParam;

    if (::GetDlgCtrlID(hWnd) == IDC_PICTURE)
        return (LRESULT)white.GetSafeHandle();

    return DefWindowProc(WM_CTLCOLORSTATIC, wParam, lParam);
}

并在头文件中,更改方法

HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

LRESULT OnCtlColorStatic(WPARAM wParam, LPARAM lParam);

请注意一个细微的差别:旧的通过直接返回 HBRUSH 画笔 handle 来工作;新函数需要一个返回 LRESULT 类型变量的函数,因此需要进行强制转换。

结果正是我所期望的:

enter image description here

更新:我最近需要做一件事,我必须设置静态的文本颜色,并发现我还可以获取其设备上下文:

HDC hDC= (HDC)wParam;
HWND hWnd = (HWND)lParam;

所以,在我可以轻松地做到这一点之后:

SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(0,127,127));

关于image - 优化校准背景是灰色的,我想要白色的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120661/

相关文章:

c++ - 如何通过socket编程在两台机器之间发送文件?

c++ - 将带有 MFC 的 C++ 移植到触摸屏

android - Imageview 和 PagerAdapter

visual-c++ - 是否可以将 Visual C++ v120 编译器工具集添加到 Visual Studio 2015?

.net - 使用 OpenCV 的感兴趣区域

c++ - 如何在 Visual C++ 2008 中创建 UTF-8 字符串文字

c++ - 不断增加物理内存 Visual C++ CryptMsgClose 和 CryptReleaseContext

c++ - 重新编译 MFC 扩展 DLL 更改导出函数的入口点

javascript - Canvas 上的 JavaScript 错误(HTML5)- 无法弄清楚

javascript - 使用 JavaScript 在 Firefox 中不显示图像