- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家。 /image/ugfY4.jpg
我有这种 ListView 颜色编辑器,每个项目代表单独的颜色。因此,用户单击 COLOR_CODE 子项,颜色选择器将更新为选定的 HSV 值,然后用户将颜色选择器光标拖动到调色板上,COLOR_CODE 子项应以及颜色 ID 文本实时更新。大多数情况下,更新执行得很好且流畅,但有时它只是以某种方式闪烁 - ----它以一种非常闪烁的方式发生,就好像没有时间快速绘制它一样。
我已经开始搜索并发现了很多帖子,所有这些都导致了双缓冲。好的,我已经在 ListView 中启用了双缓冲,就像这样
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,然后将 subItem 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]!='\0'){}
if (--ix!=5) while((ix++)<5)
digits[di++]=0;
while (color[i]!='\0')
{
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。
关于带有 NM_CUSTOMDRAW 的 ListView 项目闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113279/
大家。 /image/ugfY4.jpg 我有这种 ListView 颜色编辑器,每个项目代表单独的颜色。因此,用户单击 COLOR_CODE 子项,颜色选择器将更新为选定的 HSV 值,然后用户将颜
这是代码的摘录。工具栏创建前的样式: DWORD styles = TBSTYLE_FLAT | WS_CHILD | TBSTYLE_TOOLTIPS; //| TBSTYLE_CUSTOMERA
我正在尝试更改我从资源创建的 ListView 的行文本颜色。为此,我在对话过程中处理 NM_CUSTOMDRAW。如果重要的话,这是一个模态对话框。根据the documentation , dwD
我是一名优秀的程序员,十分优秀!