代码之家  ›  专栏  ›  技术社区  ›  David Citron

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

  •  7
  • David Citron  · 技术社区  · 16 年前

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

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

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

    List View in Report View

    请注意,“暹罗”一词与标题项(“品种”)对齐。我想能够保证相同的路线为定制画项目。

    5 回复  |  直到 7 年前
        1
  •  2
  •   Almaz    15 年前

    使用ListView标题消息HDM_GETBITMAPMARGIN 看见 link text

        2
  •  1
  •   David L Morris    16 年前

    ListView获取子项矩形(LVM获取子项检测)

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

    不管文档上说什么,我怀疑LVIR_LABEL只返回项目文本的边框,如ListView_GetItemRect所示。

    (这一直困扰着我,好像我在玩nmu CUSTOMDRAW的时候看到了答案一样)。

    在评论2后编辑:

    我想你已经看过NMLVCUSTOMDRAW,如果你愿意使用版本6.0的话。有rcText。既然我用了Win2K我就不会了。

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

        3
  •  1
  •   Patrick    13 年前

    这样做的方法是使用 列表视图获取列() 然后检查检索到的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 );
    
        4
  •  0
  •   Andrew    16 年前

    我想 GetSystemMetrics() 你需要看看。我想是的 山毛榉 山猫 可能是你想要的价值观,但不要引用我的话。;-)

        5
  •  0
  •   David L Morris    16 年前

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

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

    你是不是不小心放进了一个空白的图片/图标。

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

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

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

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