7

When using custom-draw (NM_CUSTOMDRAW) to draw the entire contents of a ListView SubItem (in Report/Details view), it would be nice to be able to apply the same left and right padding in my custom paint method that is applied by the control itself for non-custom-drawn items.

Is there a way to programmatically retrieve this padding value? Is it related to the width of a particular character (" " or "w" or something?) or is it a fixed value (6px on left and 3px on right or something) or...?

EDIT: To clarify, I want to add the same padding to my NM_CUSTOMDRAWn SubItems that the control adds to items that it draws, and the metric that I'm looking for, for example, is the white space between the beginning of the 2nd column and the word "Siamese" in the following screenshot (Note: screenshot from MSDN added to help explain my question):

List View in Report View
(source: microsoft.com)

Note that the word "Siamese" is aligned with the header item ("Breed"). I would like to be able to guarantee the same alignment for custom-drawn items.

4

5 回答 5

2

使用 ListView Header 消息 HDM_GETBITMAPMARGIN 查看链接文本

于 2009-12-21T01:39:21.040 回答
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 );
于 2011-12-09T16:01:52.510 回答
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 进行比较并使用差异的建议。

于 2008-09-11T06:25:57.373 回答
0

只能猜测没有看到你的输出。

几点建议:如果您使用的是 DrawTextEx 函数,您是否尝试过 DT_INTERNAL 等?

您是否不小心放入了空白图像/图标。

在经典屏幕模式下看起来还可以吗?如果是这样,我会查看 XP Theme 功能,看看是否发生了某些事情。

第一次评论后的后期编辑:

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

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

于 2008-09-11T01:35:12.503 回答
0

我假设GetSystemMetrics()是您需要查看的。我认为SM_CXEDGESM_CYEDGE可能是您想要的值,但不要引用我的话。;-)

于 2008-09-09T10:50:48.643 回答