Winapi 自定义绘制子项的Win32列表视图控件子项填充?

Winapi 自定义绘制子项的Win32列表视图控件子项填充?,winapi,listview,custom-draw,Winapi,Listview,Custom Draw,当使用custom draw(NM_CUSTOMDRAW)绘制ListView子项(在报告/详细信息视图中)的全部内容时,最好能够应用相同的左视图和右视图 控件本身为非自定义绘制项目应用的自定义绘制方法中的填充 是否有一种方法可以通过编程检索此填充值?它是 与特定字符的宽度相关(““或“w”或其他什么?)或 它是一个固定值(左边是6px,右边是3px)还是 编辑:为了澄清,我想在NM_CustomDrawed子项中添加与控件添加到其绘制的项中相同的填充,并且我要查找的度量,例如,第2列开头和下面

当使用custom draw(NM_CUSTOMDRAW)绘制ListView子项(在报告/详细信息视图中)的全部内容时,最好能够应用相同的左视图和右视图 控件本身为非自定义绘制项目应用的自定义绘制方法中的填充

是否有一种方法可以通过编程检索此填充值?它是 与特定字符的宽度相关(““或“w”或其他什么?)或 它是一个固定值(左边是6px,右边是3px)还是

编辑:为了澄清,我想在NM_CustomDrawed子项中添加与控件添加到其绘制的项中相同的填充,并且我要查找的度量,例如,第2列开头和下面屏幕截图中“暹罗”一词之间的空白(注意:添加了MSDN的屏幕截图以帮助解释我的问题):


(来源:)


请注意,“暹罗”一词与标题项目(“品种”)对齐。我希望能够保证自定义绘制项目的对齐方式相同。

我假设GetSystemMetrics()我认为SM\u CXEDGESM\u CYEDGE可能是您想要的值,但不要引用我的话。;-

只能猜测而看不到您的输出

一些建议:如果您正在使用DrawTextEx函数,您是否尝试过DT_INTERNAL等人的方法

您是否无意中输入了空白图像/图标

它在经典屏幕模式下看起来正常吗?如果是这样的话,我会看看XP主题函数,看看是否发生了什么事情

第一次评论后延迟编辑:

我想知道矩形的大小是否与文本周围的LVN_ENDLABELEDIT编辑框所需的空间相匹配,以便文本不会移动(或焦点矩形)

我想您可以将LVM_GETITEMRECT的结果与第一列上的LVIR_标签进行比较,并将差异用作左边框。

ListView_GetSubItemRect(LVM_GETSUBITEMTECT)

不管文档怎么说,我怀疑LVIR_标签只返回项文本的边框,正如ListView_GetItemRect

(这让我一直很烦恼,好像我在玩NM_CUSTOMDRAW的时候在什么地方看到了答案一样)

在评论2之后编辑:

如果您愿意使用6.0版,我想您已经看到了NMLVCUSTOMDRAW。有一个文本。我不会,因为我用的是Win2K

考虑到你的发现,我会回到使用
ListView_GetItemRect获取LVIR_标签,并将其与LVIR_边界进行比较,然后使用差异。

使用ListView标题消息HDM_GETBITMAPMARGIN
请参见

执行此操作的方法是使用 ListView_GetColumn() 然后检查检索到的myLVCOLUMN.mask

LVCOLUMN myLVCOLUMN;
myLVCOLUMN.mask=LVCF_FMT;
ListView_GetColumn(hwnd,nCol,&myLVCOLUMN);
然后,当我们绘制属于该列的相应标签时

if(myLVCOLUMN.fmt & LVCFMT_CENTER)
    DrawText(x,x,x,x, DT_CENTER | DT_WORD_ELLIPSIS );
else if (myLVCOLUMN.fmt & LVCFMT_RIGHT)
    DrawText(x,x,x,x, DT_RIGHT | DT_WORD_ELLIPSIS );
else
    DrawText(x,x,x,x, DT_LEFT | DT_WORD_ELLIPSIS );

SM_CXEDGE和SM_CYEDGE是窗口边框宽度。我正在查找处于“报表视图”模式的ListView控件中每个表单元格的内部前导和尾随填充。或者我遗漏了什么?如果你自定义绘制一个列表视图子项(NM_CUSTOMDRAW),你会得到一个NMLVCUSTOMDRAW结构,其中包含一个DC和边界矩形,它是从地板到天花板和从墙到墙的整个“表格单元”空间。我想知道在我的自定义绘制方法中应用什么填充,所以我的内容aI使用了NM_CUSTOMDRAW,但只是更改单个单元格的背景颜色(CDD_ITEMPREPAINT),并让它在主进程上通过LVN_GETDISPINFO。不幸的是没有。很容易尝试,LVIR_BOUNDS和LVIR_LABEL返回的值是相同的:它们都返回整个子项,从墙到墙。因此文档是正确的,这使Win32看起来好像出错了。真痛苦。你找到答案了吗?我遇到了同样的问题。