win32 ListBox自绘

文章详细描述了如何在Windows中使用ListBox控件,创建自定义数据结构ListBoxItemData,以及处理WM_INITDIALOG、WM_MEASUREITEM和WM_DRAWITEM消息,实现列表项的动态绘制,包括图标和文本颜色的控制。
摘要由CSDN通过智能技术生成

//ListBox数据结构体
struct ListBoxItemData {
    int iconIndex;  //图标索引
    LPWSTR text;    //文本内容
};

case WM_INITDIALOG: {// 初始化对话框
//新建ListBox
HWND    hwndListBox = CreateWindowEx(0, WC_LISTBOX, L"",WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER | WS_TABSTOP | LBS_NOTIFY | LBS_OWNERDRAWFIXED ,20, 80, 160, 160, hDlg, HMENU(1809), GetModuleHandle(nullptr), nullptr);  //添加自绘风格LBS_OWNERDRAWFIXED 
//添加数据        
ListBoxItemData* itemData1 = new ListBoxItemData;
itemData1->iconIndex = 0;
itemData1->text = (LPWSTR)L"数据1";
ListBox_InsertItemData(hwndListBox, 0, (LPARAM)(itemData1));

ListBoxItemData* itemData2 = new ListBoxItemData;
itemData2->iconIndex = 1;
itemData2->text = (LPWSTR)L"数据2";
ListBox_InsertItemData(hwndListBox, 1, (LPARAM)(itemData2));
        
ListBoxItemData* itemData3 = new ListBoxItemData;
itemData3->iconIndex = 2;
itemData3->text = (LPWSTR)L"数据3比较长";
ListBox_InsertItemData(hwndListBox, 2, (LPARAM)(itemData3));


break;
}
case WM_MEASUREITEM: {  //设置每项的宽高
    LPMEASUREITEMSTRUCT m = (LPMEASUREITEMSTRUCT)lParam;
        if (m->CtlType == ODT_LISTBOX) {
            m->itemHeight = 30;
        }
        break;
}
case WM_DRAWITEM: { //绘制每个项目
    LPDRAWITEMSTRUCT d = (LPDRAWITEMSTRUCT)lParam;
    if (d->CtlType == ODT_LISTBOX) {  //CtlType 表示自绘控件类型
            
        HWND hListBox = GetDlgItem(hDlg, 1809);
        ListBoxItemData* itemData;
        int index = d->itemID;  //itemID表示项目索引
        itemData=(ListBoxItemData*)ListBox_GetItemData(hListBox, index);
        if (d->itemState & ODS_SELECTED) { //未被选择
                
                
            DrawListBoxItem(d, RGB(255, 0, 150), RGB(160, 32, 240), itemData->text,itemData->iconIndex);
                
            }
            else {  //被选择
                
                if (d->itemID % 2 == 0) //单数行
                    DrawListBoxItem(d, RGB(255, 165, 0), RGB(160, 32, 240), itemData->text, itemData->iconIndex);
                else  //双数行
                    DrawListBoxItem(d, RGB(255, 0, 255), RGB(160, 32, 240), itemData->text, itemData->iconIndex);
            }
            
        }

        break;
}

//绘制每个项目,包括图标和内容
void DrawListBoxItem(LPDRAWITEMSTRUCT d, COLORREF bg, COLORREF text, TCHAR* title,int icoIndex)
{
    //bg   背景色
    //text   文本颜色
     // title  文本内容
    // icoIndex图标索引
    //d->hDC  绘图设备
     //d->hDC  绘图设备
    //d->rcItem  每个项目区域
     //iMageList   添加了三章图片的HIMAGELIST


    //绘制背景
    HBRUSH hb = CreateSolidBrush(bg);
    HBRUSH hbo = (HBRUSH)SelectObject(d->hDC, hb);
    HPEN hp = CreatePen(PS_SOLID, 10, bg);
    SelectObject(d->hDC, hp);
    FillRect(d->hDC, &d->rcItem, hb);
    SelectObject(d->hDC, hbo);
    DeleteObject(hb);

    //绘制文字
    SetBkMode(d->hDC, TRANSPARENT);
    SetTextColor(d->hDC, text);
    DrawText(d->hDC, title, wcslen(title), &d->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

    //绘制图片
    ImageList_Draw(iMageList, icoIndex, d->hDC, d->rcItem.left+5, d->rcItem.top+5, ILD_TRANSPARENT);
}

效果如图所示:


 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中使用win32gui模块来操作列表框(listbox)有几个步骤。首先,你需要获取列表框的句柄(handle)。你可以使用win32gui.FindWindow函数来查找包含列表框的父窗口句柄。如果你已经有了父窗口的句柄,那么可以使用win32gui.FindWindowEx函数来查找列表框的子窗口句柄。 一旦你获取到了列表框的句柄,你可以使用win32gui.SendMessage函数来发送消息给列表框,以实现列表框的操作。例如,要向列表框添加一个项,你可以使用win32gui.SendMessage函数发送LB_ADDSTRING消息,并传递要添加的项的文本作为参数。 如果你想获取列表框中的所有项,你可以使用win32gui.SendMessage函数发送LB_GETCOUNT消息来获取项的数量,然后使用win32gui.SendMessage函数和LB_GETTEXT消息来逐个获取每个项的文本。 如果你想实现拖拽功能,你可以使用win32gui模块的一些函数来处理鼠标事件。你可以使用win32gui.SetCapture函数来捕获鼠标事件,在鼠标移动期间使用win32gui.SetCursor函数来设置鼠标指针的样式,以实现拖拽效果。 总结起来,在Python中使用win32gui模块操作列表框的步骤如下: 1. 获取列表框的父窗口句柄和子窗口句柄。 2. 使用win32gui.SendMessage函数发送消息给列表框,实现列表框的操作。 3. 如果需要获取列表框中的项,使用win32gui.SendMessage函数发送相应消息获取项的数量和文本。 4. 如果需要实现拖拽功能,使用win32gui模块的函数来处理鼠标事件。 希望以上信息对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值