【问题标题】:Owner draw listbox alway return (LPDRAWITEMSTRUCT)->itemID = -1所有者绘制列表框总是返回 (LPDRAWITEMSTRUCT)->itemID = -1
【发布时间】:2016-08-27 13:49:58
【问题描述】:

我创建了一个所有者绘制列表框。你知道为什么在WM_DRAWITEM消息中,我只收到(LPDRAWITEMSTRUCT)lParam->itemID = -1吗?

我正在使用 VS 2010 C++ Express 和 Win 7 进行编码。

创建列表框并设置滚动信息:

lbHWND = CreateWindowExW(NULL, WC_LISTBOX, NULL,
    WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_NODATA | 
    LBS_OWNERDRAWFIXED | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT,
    0, 0, 400, 400, tkHWND, (HMENU)IDC_LISTBOX_ENTRY, hInstance, 0);

SCROLLINFO lbSi = { 0 };
lbSi.cbSize = sizeof(SCROLLINFO);
lbSi.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
lbSi.nMin = 0;
lbSi.nMax = 1000;
lbSi.nPage = 20;
lbSi.nPos = 0;
SetScrollInfo(lbHWND, SB_VERT, &lbSi, TRUE);

WinProc:

LRESULT CALLBACK WndProc(HWND phwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_MEASUREITEM:
        {
            MEASUREITEMSTRUCT*  lpmis = (LPMEASUREITEMSTRUCT)lParam;
            switch (lpmis->CtlID)
            {
                case IDC_LISTBOX_ENTRY:
                    lpmis->itemHeight = 20;
                    break;
                default:
                    break;
            }
            return TRUE;
        }
        case WM_DRAWITEM:
        {
            DRAWITEMSTRUCT* lpdis = (LPDRAWITEMSTRUCT)lParam;

            // Check lpdis->itemID, for test purpose only
            FILE *f;
            if (!_wfopen_s(&f, L"E:\\lb.txt", L"ab"))
            {
                fprintf(f,"%d\r\n", lpdis->itemID);
                fclose(f);
            }
            // lpdis->itemID always = -1
            return TRUE;
        }
    }
}

【问题讨论】:

  • 您是否在列表框中添加了任何项目?看起来您正在调整滚动条范围并期望它会导致列表框绘图项目,但它不是那样工作的。列表框使用项目数来计算滚动条范围,而不是相反。
  • @JonathanPotter 你是对的,我再次检查,发现它是LBS_NODATA 列表框,我忘了打电话给LB_SETCOUNT 消息。如果您发表评论作为答案,我会接受!非常感谢:)

标签: c++ winapi listbox ownerdrawn


【解决方案1】:

我找到了答案:对于具有LBS_NODATA 样式的所有者绘制列表框,我必须告诉列表框它拥有的项目数。

SendMessage(lbHWND, LB_RESETCONTENT, 0, 0);    // Remove all items, if have any
SendMessage(lbHWND, LB_SETCOUNT, 1000, 0);     // Set number of items (here is 1000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多