如何在所选项目上设置组合框的背景颜色?

杰克

我有一个所有者绘图组合框,我想在其中重新创建标准行为,即当前所选项目上方的蓝色背景色。当收到WM_DRAWITEM消息但没有运气时,我已经尝试过设置X:

    case WM_DRAWITEM:
    {
      LPDRAWITEMSTRUCT b = (LPDRAWITEMSTRUCT) lParam;
      if(b->itemAction & ODA_FOCUS)
      {
        SetBkMode(b->hDC, TRANSPARENT);
        SetBkColor(b->hDC, GetSysColor(COLOR_HIGHLIGHT));
        DrawFocusRect(b->hDC, &b->rcItem);
        return (INT_PTR) TRUE;
      }

我指的是行为示例:

在此处输入图片说明

目前看起来像什么:

在此处输入图片说明

完整代码:

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Gdi32.lib")
    
#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE

#include <windows.h>
#include <Commctrl.h>
#include <assert.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void SetDefaultFont(HWND hwnd);
HFONT LoadSystemDefaultFont();
void DrawBorder(HDC hdc, RECT *rect);
void DrawLine(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2);
void freeBrushes();
HBRUSH getBrushAt(int index);
void drawColorRect(HDC dc, RECT *editRect, int colorIndex);

HINSTANCE g_hinst;
HFONT hDefaultSystemFont;

#define COUNTOF(a) (sizeof(a)/sizeof(a[0]))
#define LIST \
    X(L"Black", RGB(0, 0, 0)) \
    X(L"Red", RGB(255, 0, 0)) \
    X(L"Blue", RGB(0, 0, 255)) \
    X(L"Green", RGB(0, 128, 0)) \
    X(L"Yellow", RGB(255, 255, 0))

#define X(a, b) a,
const wchar_t *items[] = { LIST };
#undef X

#define X(a, b) b,
const int colorCodes[] = { LIST };
#undef X

HBRUSH brushes[COUNTOF(items)];

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PWSTR lpCmdLine, int nCmdShow) {

  
    HWND hwnd;
    MSG  msg;
    WNDCLASSW wc = {0};
    wc.lpszClassName = L"Application";
    wc.hInstance     = hInstance ;
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    wc.lpfnWndProc   = WndProc;
    wc.hCursor       = LoadCursor(0,IDC_ARROW);

    g_hinst = hInstance;

    RegisterClassW(&wc);
    hwnd = CreateWindowW(wc.lpszClassName, L"Combo box",
                  WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                  100, 100, 270, 170, 0, 0, hInstance, 0);  


    while (GetMessage(&msg, NULL, 0, 0)) {
        DispatchMessage(&msg);
    }
    
    DeleteObject(hDefaultSystemFont);
    freeBrushes();

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 
        WPARAM wParam, LPARAM lParam) {

    static HWND hwndCombo;

    switch(msg)
    {
        case WM_CREATE:
        {
            hwndCombo = CreateWindow(L"Combobox", NULL, 
                WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST |
                CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | WS_VSCROLL | WS_HSCROLL,
                10, 10, 100, 110, hwnd, NULL, g_hinst, NULL);
            SendMessage(hwndCombo, CB_SETMINVISIBLE, 5, 0);
            SetDefaultFont(hwndCombo);
            for (int i = 0; i < COUNTOF(items); ++i)
            {
                SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) items[i]);
            }
        }
        break;

        case WM_DRAWITEM:
        {
          LPDRAWITEMSTRUCT b = (LPDRAWITEMSTRUCT) lParam;
          if(b->itemAction & ODA_FOCUS)
          {
            SetBkMode(b->hDC, TRANSPARENT);
            SetBkColor(b->hDC, GetSysColor(COLOR_HIGHLIGHT));
            DrawFocusRect(b->hDC, &b->rcItem);
            return (INT_PTR) TRUE;
          }
          else if(b->itemAction & ODA_DRAWENTIRE)
          {
            if(b->itemAction & ODA_FOCUS)
            {
                DrawFocusRect(b->hDC, &b->rcItem);
            }

            if(b->itemID != -1)
            {
                drawColorRect(b->hDC, &b->rcItem, b->itemID);
                DrawText(b->hDC, items[b->itemID], -1, &b->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
            }
            else
            {
                //drawColorRect(b->hDC, &b->rcItem, 0);
                DrawText(b->hDC, L"Select", -1, &b->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
            }

            return (INT_PTR) TRUE;
          }
        }
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break; 
    }

  
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


HFONT LoadSystemDefaultFont()
{
  if(hDefaultSystemFont == NULL) {
    NONCLIENTMETRICS ncm;
    ncm.cbSize = sizeof(NONCLIENTMETRICS);
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
    hDefaultSystemFont = CreateFontIndirect(&ncm.lfMessageFont);
  }
  return hDefaultSystemFont;
}


void SetDefaultFont(HWND hwnd)
{
    SendMessage(hwnd, WM_SETFONT, (LPARAM) LoadSystemDefaultFont(), TRUE);
}

void drawColorRect(HDC dc, RECT *editRect, int colorIndex)
{
    assert(colorIndex >= 0 && colorIndex < COUNTOF(brushes));
    assert(editRect != NULL);

    RECT rt = {0};
    rt.left = editRect->left + 2;
    rt.top = editRect->top - 2;
    rt.right = editRect->right / 5;
    rt.bottom = editRect->bottom - 2;
    InflateRect(&rt, -1, -1);
    DrawBorder(dc, &rt);
    //FrameRect(dc, &rt, getBrushAt(0));
    FillRect(dc, &rt, getBrushAt(colorIndex));
}

void DrawLine(HDC hdc, LONG x1, LONG y1, LONG x2, LONG y2)
{
    MoveToEx(hdc, x1, y1, NULL);
    LineTo(hdc, x2, y2);
}
    
void DrawBorder(HDC hdc, RECT *rect)
{
    DrawLine(hdc, rect->left, rect->top, rect->left, rect->bottom);
    DrawLine(hdc, rect->left, rect->top, rect->right, rect->top);
    DrawLine(hdc, rect->right, rect->top, rect->right, rect->bottom);
    DrawLine(hdc, rect->left, rect->bottom, rect->right, rect->bottom);
}

HBRUSH getBrushAt(int index)
{
    assert(index >= 0 && index < COUNTOF(brushes));
    HBRUSH b = brushes[index];
    if(b == NULL) {
        int code = colorCodes[index];
        brushes[index] = CreateSolidBrush(code);
        b = brushes[index];
    }
    return b;
}

void freeBrushes()
{
    for(int i = 0; i < COUNTOF(brushes); ++i){
        DeleteObject(brushes[i]);
        brushes[i] = NULL;
    }
}
阿德里安·摩尔

要使用不同的背景和文本颜色绘制所选项目,需要检查itemState给定DRAWITEMSTRUCTlParam)参数成员是否包含该ODS_SELECTED标志。

类似于以下内容:

    case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT b = (LPDRAWITEMSTRUCT) lParam;
        SetBkMode(b->hDC, TRANSPARENT);
        if(b->itemState & ODS_SELECTED) // Selected ...
        {
            SetTextColor(b->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
            FillRect(b->hDC, &b->rcItem, (HBRUSH)(COLOR_HIGHLIGHT+1));
        }
        else // Not selected ...
        {
            SetTextColor(b->hDC, GetSysColor(COLOR_WINDOWTEXT));
            FillRect(b->hDC, &b->rcItem, (HBRUSH)(COLOR_WINDOW+1));
        }
        DrawText(b->hDC, items[b->itemID], -1, &b->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        // Check for focus ...
        if(b->itemAction & ODA_FOCUS)
        {
            DrawFocusRect(b->hDC, &b->rcItem);
        }
        return (I
NT_PTR) TRUE;

注意:在呼叫hbr参数中使用系统颜色时FillRect,您需要在值上添加一个文档中FillRect

...如果为hbr参数指定颜色值,则该颜色值必须是标准系统颜色之一(必须将值1添加到所选颜色中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在组合框类中设置所选项目?

来自分类Dev

如何在TreeView上为所选项目设置颜色

来自分类Dev

如何在组合框中设置所选项目并在txtfield中设置等效值

来自分类Dev

组合框所选项目

来自分类Dev

在Android下拉导航上设置所选项目的背景颜色

来自分类Dev

在WPF组合框中设置所选项目

来自分类Dev

在组合框中设置所选项目-vb.net

来自分类Dev

在C#组合框中设置所选项目

来自分类Dev

在组合框中设置所选项目-vb.net

来自分类Dev

C# - 如何通过比较我的 int 值在组合框中设置所选项目?

来自分类Dev

如何在WPF中居中对齐组合框所选项目

来自分类Dev

Android-如何在下拉菜单中更改所选项目的背景颜色

来自分类Dev

如何在微调器中设置所选项目的颜色?

来自分类Dev

如何在微调器中设置所选项目的颜色?

来自分类Dev

如何在微调器中设置所选项目的颜色?

来自分类Dev

如何在Html.Listbox中设置所选项目的文本颜色

来自分类Dev

如何在“选择”元素中设置所选项目的背景色?

来自分类Dev

JavaFX:样式组合框弹出列表的文本颜色和所选项目的颜色?

来自分类Dev

从组合框获取所选项目

来自分类Dev

从组合框获取所选项目

来自分类Dev

如何在所选点上设置图像?

来自分类Dev

更改列表框中所选项目的背景颜色

来自分类Dev

如何在SelectListItem中正确设置所选项目?

来自分类Dev

在组合框所选项目中访问分配的变量项目

来自分类常见问题

如何在RecyclerView上正确突出显示所选项目?

来自分类Dev

如何在p:selectOneMenu的所选项目上显示图像

来自分类Dev

所选项目的导航抽屉项目背景颜色

来自分类Dev

xamarin 表单:无法更改 ListView 上所选项目的背景颜色

来自分类Dev

当另一个组合框更改所选值时设置 ComboBox 所选项目 c#

Related 相关文章

  1. 1

    如何在组合框类中设置所选项目?

  2. 2

    如何在TreeView上为所选项目设置颜色

  3. 3

    如何在组合框中设置所选项目并在txtfield中设置等效值

  4. 4

    组合框所选项目

  5. 5

    在Android下拉导航上设置所选项目的背景颜色

  6. 6

    在WPF组合框中设置所选项目

  7. 7

    在组合框中设置所选项目-vb.net

  8. 8

    在C#组合框中设置所选项目

  9. 9

    在组合框中设置所选项目-vb.net

  10. 10

    C# - 如何通过比较我的 int 值在组合框中设置所选项目?

  11. 11

    如何在WPF中居中对齐组合框所选项目

  12. 12

    Android-如何在下拉菜单中更改所选项目的背景颜色

  13. 13

    如何在微调器中设置所选项目的颜色?

  14. 14

    如何在微调器中设置所选项目的颜色?

  15. 15

    如何在微调器中设置所选项目的颜色?

  16. 16

    如何在Html.Listbox中设置所选项目的文本颜色

  17. 17

    如何在“选择”元素中设置所选项目的背景色?

  18. 18

    JavaFX:样式组合框弹出列表的文本颜色和所选项目的颜色?

  19. 19

    从组合框获取所选项目

  20. 20

    从组合框获取所选项目

  21. 21

    如何在所选点上设置图像?

  22. 22

    更改列表框中所选项目的背景颜色

  23. 23

    如何在SelectListItem中正确设置所选项目?

  24. 24

    在组合框所选项目中访问分配的变量项目

  25. 25

    如何在RecyclerView上正确突出显示所选项目?

  26. 26

    如何在p:selectOneMenu的所选项目上显示图像

  27. 27

    所选项目的导航抽屉项目背景颜色

  28. 28

    xamarin 表单:无法更改 ListView 上所选项目的背景颜色

  29. 29

    当另一个组合框更改所选值时设置 ComboBox 所选项目 c#

热门标签

归档