用于自定义绘制的子项的Win32 List-View Control SubItem填充?

时间:2008-09-09 02:06:14

标签: winapi listview custom-draw

使用自定义绘制(NM_CUSTOMDRAW)绘制ListView子项的全部内容时(在“报告/详细信息”视图中),能够应用左右相同的内容会很不错 在我的自定义绘制方法中填充,该方法由控件本身应用于非自定义绘制的项目。

有没有办法以编程方式检索此填充值?是吗 与特定字符的宽度相关(“”或“w”或某事?)或 它是一个固定值(左边是6像素,右边是3像素还是东西)还是......?

编辑:为了澄清,我想在我的NM_CUSTOMDRAWn子项中添加相同的填充,控件添加到它绘制的项目,并且我正在寻找的指标,例如,以下屏幕截图中第二列开头和单词“Siamese”之间的空白区域(注意:MSDN中添加了截图以帮助解释我的问题):

List View in Report View

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

5 个答案:

答案 0 :(得分:2)

使用ListView标头消息HDM_GETBITMAPMARGIN 见link text

答案 1 :(得分:1)

ListView_GetSubItemRect(LVM_GETSUBITEMTECT)

http://msdn.microsoft.com/en-us/library/ms930172.aspx

尽管文档说明我怀疑LVIR_LABEL只返回项目文本的边界矩形,按照ListView_GetItemRect。

(这只是让我嘻嘻哈哈,因为我在玩NM_CUSTOMDRAW时实际上已经看到了答案。)

评论2后编辑:

我想你已经看过NMLVCUSTOMDRAW,如果你愿意使用6.0版。有rcText。我不会因为我使用Win2K。

鉴于你发现了什么,我会回到使用的建议 ListView_GetItemRect获取LVIR_LABEL并将其与LVIR_BOUNDS进行比较并使用差异。

答案 2 :(得分:1)

这样做的方法是检索相应列的格式 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 );

答案 3 :(得分:0)

我认为你需要查看 GetSystemMetrics()。我认为 SM_CXEDGE SM_CYEDGE 可能是您想要的值,但请不要引用我。 ; - )

答案 4 :(得分:0)

只能猜测而不会看到你的输出。

一些建议:如果您正在使用DrawTextEx函数,您是否已经尝试过DT_INTERNAL等?

您是否不小心插入了空白图片/图标。

在经典屏幕模式下看起来不错吗?如果是这样,我会看看XP主题功能,看看是否有一些事情正在发生。

第一条评论后的晚编辑:

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

我猜你可以在第一列上比较LVM_GETITEMRECT和LVIR_LABEL的结果,并将差值用作左边界。