设置静态文本颜色Win32

Jon*_*aub 4 c api winapi

我正在制作一个控制对话框的dll.我喜欢让某个区域有红色文字.这段代码确实编译,但没有看到效果.这是dialogProc完成的区域:

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:     
        CheckDlgButton(hDlg, IDC_CHECK, FALSE);
        EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
        return TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_CHECK:
            if (IsDlgButtonChecked(hDlg, IDC_CHECK))
            {
                EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
                EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
            }
            else
            {
                EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
                EnableWindow(GetDlgItem(hDlg, IDCANCEL), TRUE);
            }
            break;
        case IDOK:
            {           
                EndDialog(hDlg, TRUE);
                return FALSE;
            }
        case IDCANCEL:
            {               
                EndDialog(hDlg, FALSE);
                return FALSE;
            }
        case WM_CTLCOLORSTATIC:
            // Set the colour of the text for our URL
            if ((HWND)lParam == GetDlgItem(hDlg,IDC_WARNING)) 
            {
                // we're about to draw the static
                // set the text colour in (HDC)lParam
                SetBkMode((HDC)wParam,TRANSPARENT);
                SetTextColor((HDC)wParam, RGB(255,0,0));
                return (BOOL)CreateSolidBrush (GetSysColor(COLOR_MENU));
            }
    return TRUE;
        }
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

mek*_*ian 10

WM_CTLCOLORSTATIC是来自WM_COMMAND的单独消息.您对邮件的理想处理似乎是正确的,除了检查邮件是在WM_COMMAND特定项目的检查范围内.尝试重新组织外部switch语句.也许类似如下:

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:         
        // ...
        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_CHECK:
            // ...
            break;
        case IDOK:
            // ...
            break;
        case IDCANCEL:
            // ...
            break;
        }
        break;
    case WM_CTLCOLORSTATIC:
        // Set the colour of the text for our URL
        if ((HWND)lParam == GetDlgItem(hDlg, IDC_WARNING)) 
        {
                // we're about to draw the static
                // set the text colour in (HDC)lParam
                SetBkMode((HDC)wParam,TRANSPARENT);
                SetTextColor((HDC)wParam, RGB(255,0,0));
                // NOTE: per documentation as pointed out by selbie, GetSolidBrush would leak a GDI handle.
                return (BOOL)GetSysColorBrush(COLOR_MENU);
        }
        break;
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

还要注意,当wParam应该为WM_CTLCOLORSTATIC提供HDC时,过滤WM_COMMAND的wParam参数会有点奇怪.

MSDN上的WM_CTLCOLORSTATIC通知

  • 上述解决方案泄漏了至少一个GDI对象.没有代码可以调用DeleteObject来调用CreateSolidBrush.我不确定WM_CTLCOLORSTATIC是否在每个绘制操作上传递,或者它是否仅在对话框初始化时传递.但泄漏是泄漏.上面的代码应该在WM_INITDIALOG中创建画笔,然后在WM_DESTROY中调用DeleteObject.或者,GetSysColorBrush可能是上述代码的更好解决方案,而不是调用CreateSolidBrush. (6认同)
  • 有没有办法在不处理CTLCOLORSTATIC消息的情况下执行此操作>? (2认同)