2008-09-09 77 views
7

使用自定义绘制(NM_CUSTOMDRAW)绘制ListView子项目的全部内容(在Report/Details视图中)时,最好能够在我的自定义绘制方法中应用相同的左侧和右侧填充由控件本身应用于非自定义绘制的项目。自定义绘制的子项的Win32 List-View控件子项填充?

有没有办法以编程方式检索此填充值?它是 与特定字符(“”或“w”或其他?)的宽度有关或 是固定值(左侧是6px,右侧是3px还是...)?

编辑:为了澄清,我想同样的填充添加到我的NM_CUSTOMDRAWn子项目,控制添加到它绘制项目,我正在寻找,度量例如是之间的空白第二列的开始,在下面的截图单词“连体”(注:从MSDN截图加入到帮忙解释一下我的问题):

List View in Report View

注意单词“连体”对齐与标题项目(“品种”)。我希望能够保证自定义绘制物品的相同路线。

+0

你有没有找到答案 - 我遇到了同样的问题。 – 2009-12-02 03:19:17

回答

0

我会假设GetSystemMetrics()是你需要看看。我认为SM_CXEDGESM_CYEDGE可能是你想要的值,但不要在此引用我。 ;-)

+0

SM_CXEDGE和SM_CYEDGE是窗口边框宽度。我在ListView控件的“报表视图”模式下查找每个表格单元格中的内部前导和后缀填充。或者我错过了什么? – 2008-09-10 01:28:56

0

只能猜测不看你的输出。

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

你是不小心把一个空白的图像/图标。

它在经典屏幕模式下看起来不错吗?如果是这样,我会看XP主题功能,看看是否有一些事情正在进行。第一个注释后

后期编辑:

不知矩形的大小,使文本不动(或焦点矩形)周围的文本所需LVN_ENDLABELEDIT编辑框的空间相匹配?

我想你可以比较LVM_GETITEMRECT的结果与第一列的LVIR_LABEL,并将差异作为左边界。

+0

如果您自定义绘制列表视图子项(NM_CUSTOMDRAW),则会​​得到一个NMLVCUSTOMDRAW结构,其中包含DC和边界矩形,即从地板到天花板和墙到墙的整个“表格单元格”空间。我想知道在我的自定义绘制方法中应用了哪些填充,所以我的内容是 – 2008-09-11 05:02:36

+0

我已经使用了NM_CUSTOMDRAW,但仅用于更改单个单元格的背景颜色(CDDS_ITEMPREPAINT),并让它在主proc上通过LVN_GETDISPINFO。 – 2008-09-11 05:47:57

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

使用的ListView标题讯息HDM_GETBITMAPMARGIN 看到link text

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); 
相关问题