簡體   English   中英

Win32 ListView:使彩色進度條顯示整行

[英]Win32 ListView: Make colored progress bar for full row

我想為ListView中的整行制作一個彩色進度條。 我從這里接受這個想法:

自定義抽獎

在上圖中,我們為進度條着色,但只有單個單元格。 我想要的是相同的想法,但要整行。
這是我所做的:

制作進度條

不像我預期的那樣:)我試圖在CDDS_ITEM | CDDS_POSTPAINT CDDS_ITEM | CDDS_POSTPAINT情況。 編碼:

static LRESULT
HandleCustomDraw(NMLVCUSTOMDRAW* pcd)
{
    TCHAR buffer[16];
    LVITEM item;

    switch (pcd->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            /* Tell the control we are interested in per-item notifications.
            * (We need it just to tell the control we want per-subitem
            * notifications.) */
            return CDRF_DODEFAULT | CDRF_NOTIFYITEMDRAW;

        case (CDDS_ITEM | CDDS_PREPAINT) :
            /* Tell the control we are interested in per-subitem notifications. */
            return CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYSUBITEMDRAW;
        case (CDDS_ITEM | CDDS_POSTPAINT) :
        {
            // Test: assume the progress value is 50%
            float percent = 0.5;
            RECT r = pcd->nmcd.rc;
            r.right = r.left + percent * (r.right - r.left);
            HBRUSH hProgressBrush = CreateSolidBrush(RGB(255, 255, 0));
            FillRect(pcd->nmcd.hdc, &r, hProgressBrush);
            return CDRF_SKIPDEFAULT;
        }
    }
}

預期的結果(例如,在行Item 8percent = 0.5 )是從行的開始到第三列之間的填充矩形,該行的其余部分是其他顏色。
我該如何實現? 我知道我必須為選定/重點/原始行繪制不同的顏色,但是我可以接受。

編輯:
上面的圖像(第二個)是我在上面的代碼中得到的。
演示我想要的:

在此處輸入圖片說明

在窗口的WM_SIZE處理程序中,使用GetClientRect()檢索並保存列表視圖的客戶端RECT (例如,在全局變量中GetClientRect()

RECT list_view_rc;  // Global.
GetClientRect(list_view_hwnd, &list_view_rc);

RECT r = pcd->nmcd.rc; HandleCustomDraw() ,您可以在列表視圖的客戶區域內看到當前繪制項目的矩形。 您現在要做的就是用從列表視圖的客戶矩形獲得的值替換r.leftr.right

r.left = list_view_rc.left;
r.right = list_view_rc.right;

這將為您繪制整個行的矩形。 如果您使用CDDS_POSTPAINT則只需要對繪制的最后一個項目執行此CDDS_POSTPAINT 這就是為什么您需要另一個包含列表視圖列數的全局變量list_view_column_count原因:

int list_view_column_count;   // Global.
list_view_column_count = Header_GetItemCount(ListView_GetHeader(list_view_hwnd));

使用CDDS_POSTPAINT您必須自己在項目內部繪制文本,因為已用矩形將其破壞,或者嘗試通過使用SetROP2()更改前景混合模式來將矩形與文本混合。 這大致是您需要的代碼(沒有文本繪圖):

static LRESULT
HandleCustomDraw(NMLVCUSTOMDRAW* pcd)
{
    TCHAR buffer[16];
    LVITEM item;
    // This static variable works only if you're always calling
    // HandleCustomDraw() only for one specific list view.
    static int current_item_count;

    switch (pcd->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            /* Tell the control we are interested in per-item notifications.
            * (We need it just to tell the control we want per-subitem
            * notifications.) */
            current_item_count=0;
            return CDRF_DODEFAULT | CDRF_NOTIFYITEMDRAW;

        case (CDDS_ITEM | CDDS_PREPAINT) :
            /* Tell the control we are interested in per-subitem notifications. */
            return CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYSUBITEMDRAW;
        case (CDDS_ITEM | CDDS_POSTPAINT) :
        if (++current_item_count == list_view_column_count)
        {
            // Test: assume the progress value is 50%
            float percent = 0.5;
            RECT r = pcd->nmcd.rc;
            r.left=list_view_rc.left;
            r.right=list_view_rc.right;
            r.right = r.left + percent * (r.right - r.left);
            HBRUSH hProgressBrush = CreateSolidBrush(RGB(255, 255, 0));
            FillRect(pcd->nmcd.hdc, &r, hProgressBrush);
            return CDRF_SKIPDEFAULT;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM