NM_CUSTOMDRAW的Listview项目正在闪烁



每个人。https://i.stack.imgur.com/ugfY4.jpg

我有这种列表视图颜色编辑器,每个项目都代表单独的颜色。因此,用户单击COLOR_CODE子项,颜色选择器更新为选定的HSV值,然后用户在托盘上拖动颜色选择器光标,COLOR_CODE子项和颜色ID文本应实时更新。大多数时候,更新表现得很好,很顺利,但有时它只是以一种方式闪烁——----它以一种非常闪烁的方式发生,就好像没有时间快速绘制一样。

我已经开始搜索,发现了很多帖子,所有这些都导致了双重缓冲。好的,我已经在我的列表视图中启用了双重缓冲,就像一样

case WM_INITDIALOG:
ListView_SetExtendedListViewStyle(GetDlgItem(hDlg,id_listview),LVS_EX_DOUBLEBUFFER);

也尝试过这种方式

SendDlgItemMessage(hWnd,id_listview,LVM_SETEXTENDEDLISTVIEWSTYLE,NULL,(LPARAM)LVS_EX_DOUBLEBUFFER);

但这无济于事。这是我的自定义绘图程序它基本上采用ID子项中写入的任何字符串-例如0xffb400并将其转换为COLORREF,然后将子项2的BG颜色设置为得到的颜色;

case WM_NOTIFY:
if(((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
        {
            SetWindowLong(hDlg, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam,hDlg));
            return TRUE;
        }
        break;
LRESULT colorEditor::ProcessCustomDraw (LPARAM lParam,HWND hDlg)
{
    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
    switch(lplvcd->nmcd.dwDrawStage) 
    {
        case CDDS_PREPAINT:
            return CDRF_NOTIFYITEMDRAW;
        case CDDS_ITEMPREPAINT: 
            return CDRF_NOTIFYSUBITEMDRAW;
        case CDDS_ITEMPREPAINT|CDDS_SUBITEM: //Before an item is drawn//
            if (lplvcd->iSubItem==2)
            {
                item_redraw.iItem=lplvcd->nmcd.dwItemSpec;
                SendDlgItemMessageA(hWnd,id_listview,LVM_GETITEM,0,(LPARAM)&item_redraw);
                lplvcd->clrTextBk = colorrefFromString(item_redraw.pszText);
            }
            return CDRF_NEWFONT;
    }
    return CDRF_DODEFAULT;
}

万一你认为colorrefFromString就是我提供的情况,它的列表是:

COLORREF colorEditor::colorrefFromString(wchar_t *color)
{
    COLORREF res_color;
    unsigned short i=0,di=0;
    int digits[6];
    int h_digits[3];
    if (color[i]=='0'&&(color[i+1]=='x'||color[i+1]=='X')) i=2;
    int ix=0;
    while (color[(ix++)+i]!=''){}
    if (--ix!=5) while((ix++)<5)
        digits[di++]=0;
    while (color[i]!='')
    {
        if (color[i]>47&&color[i]<58) digits[di++]=color[i]-48;
        else if (color[i]>64&&color[i]<71) digits[di++]=color[i]-65+10;
        else if (color[i]>96&&color[i]<103) digits[di++]=color[i]-97+10;
        i++;
    }
    h_digits[0]=digits[0]*16+digits[1];
    h_digits[1]=digits[2]*16+digits[3];
    h_digits[2]=digits[4]*16+digits[5];
    res_color=0x00000000|(h_digits[2]<<16)|(h_digits[1]<<8)|h_digits[0];
    return res_color;
}

现在的问题是:为什么我有闪烁?

第一眼就看不出闪烁的真正原因。

但是,尽量自己在这里画画。,可能就是这个作品。

只需计算颜色即可。在具有给定dc的项矩形上调用FillRect,并返回CDRF_SKIPDEFAULT。

相关内容

  • 没有找到相关文章

最新更新