使用自定义绘制(NM_CUSTOMDRAW)绘制ListView子项的全部内容时(在“报告/详细信息”视图中),能够应用左右相同的内容会很不错 在我的自定义绘制方法中填充,该方法由控件本身应用于非自定义绘制的项目。
有没有办法以编程方式检索此填充值?是吗 与特定字符的宽度相关(“”或“w”或某事?)或 它是一个固定值(左边是6像素,右边是3像素还是东西)还是......?
编辑:为了澄清,我想在我的NM_CUSTOMDRAWn子项中添加相同的填充,控件添加到它绘制的项目,并且我正在寻找的指标,例如,以下屏幕截图中第二列开头和单词“Siamese”之间的空白区域(注意:MSDN中添加了截图以帮助解释我的问题):
请注意,“Siamese”一词与标题项(“Breed”)对齐。我希望能够保证自定义绘制项目的对齐方式。
答案 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的结果,并将差值用作左边界。