zoukankan      html  css  js  c++  java
  • MFC常用控件CListCtrl 、CSliderCtrl、CToolTipCtrl、CTreeCtrl的自绘

    Window平台下MFC提供的CListCtrl CSliderCtrlCToolTipCtrl、CTreeCtrl等控件大多时候是不能满足我们的需求,如果我要在改变滑动条的颜色,我要改变滑动条的背景色;我在CListCtrl中添加图片,添加一个复选框,等等等等。可是使用OnPaint自己完全重回,实现将较为费力。

    common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和究竟这个特性有什么好处。

    Custom draw可以被想象成一个轻量级的,容易使用的重绘方法(重绘方法还有几种,例如Owner Draw等)。这种容易来自于我们只需要处理一个消息(NM_CUSTOMDRAW),就可以让Windows为你干活了,你就不用被逼去处理"重绘过程"中所有的脏活了。

    MFC框架中添加自绘函数(注意不要添加WM_PAINT消息,不然NM_CUSTOMDRAW消息有时是无效的)。我们可以通过类向导添加=NM_CUSTOMDRAW消息。也可以手动添加如下代码:

    .h头文件中:

    Afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);

    .cpp中添加

    BEGIN_MESSAGE_MAP(MyListCtrl, CListCtrl)

    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw);

    END_MESSAGE_MAP

    void MyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

    {

    NMLVCUSTOMDRAW *pLVCD = reinterpret_cast<NMLVCUSTOMDRAW>(pNMHDR);

    *pResult = 0;

    }

    而对于CSliderCtrl中定义的函数中应该这么转换类型

    LPNMCUSTOMDRAW lpNCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

    控件

    对应结构

    List view

    NMLVCUSTOMDRAW

    ToolTips

    NMTTCUSTOMDRAW

    Tree view

    NMTVCUSTOMDRAW

    其他支持控件

    NMCUSTOMDRAW

    为什么不一样那,下面让我们查一下他们的结构:

    1NMLVCUSTOMDRAW结构包含信息用于list-view controlNM_CUSTOMDRAW消息(MSDN)

    typedefstructtagNMLVCUSTOMDRAW {

    NMCUSTOMDRAW nmcd;                  // 常规的绘制信息

    COLORREFclrText;                    // 文本色

    COLORREFclrTextBk;                  // 文本背景色

    #if (_WIN32_IE >= 0x0400)

    int iSubItem;

    #endif

    #if (_WIN32_IE >= 0x0560)

    DWORD dwItemType;

    COLORREF clrFace;

    int iIconEffect;

    int iIconPhase;

    int iPartId;

    int iStateId;

    RECT rcText;

    UINT uAlign;

    #endif

    } NMLVCUSTOMDRAW, *LPNMLVCUSTOMDRAW;

    2结构包含信息用于ToolTip control发送的NM_CUSTOMDRAW消息(MSDN)

    typedef struct tagNMTTCUSTOMDRAW {

      NMCUSTOMDRAW nmcd;

      UINT uDrawFlags;

    } NMTTCUSTOMDRAW, FAR* LPNMTTCUSTOMDRAW;

    uDrawFlags

    使用一个整型表示toolTip文本的格式。应用程序可以改变这个成员变量的值,以改动ToopTip绘制的文本。这个值传送给DrawText函数。具体请查阅:

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

    3结构包含信息用于tree view control发送的NM_CUSTOMDRAW消息(MSDN)

    typedef struct tagNMTVCUSTOMDRAW {

     NMCUSTOMDRAW nmcd;                 // 绘制信息

     COLORREF clrText;                  // 文本颜色

     COLORREF clrTextBk;                // 文本背景色

    } NMTVCUSTOMDRAW, *LPNMTVCUSTOMDRAW;

    4、其他支持控件使用结构(以上结构也包含该结构)

    typedefstructtagNMCUSTOMDRAWINFO {

    NMHDR hdr;                  // 指向包含这个消息信息的NMHDR结构的句柄

    DWORD dwDrawStage;         // 表示当前的绘制阶段

    HDC hdc;                    // 绘图设备上下文句柄,用于完成GDI函数

    RECT rc;                    // 当前项的绘图范围

    DWORD_PTR dwItemSpec;      // 指明绘制控件的那个部分

    UINT uItemState;           // 当前项目条的状态

    LPARAM lItemlParam;        // 应用程序规定的数据

    } NMCUSTOMDRAW, *LPNMCUSTOMDRAW;

    下表为dwDrawStage参数,显示的全局绘制阶段的值:

    描述

    CDDS_POSTERASE

    擦除之后完成的

    CDDS_POSTPAINT

    绘制之后完成的

    CDDS_PREERASE

    擦除之前

    CDDS_PREPAINT

    绘制之前

    CDDS_ITEM

    表明dwItemSpecuItemState,lItemParam成员是有效的

    CDDS_ITEMPOSTERASE

    在某项被擦除之后

    CDDS_ITEMPOSTPAINT

    某项被绘制后

    CDDS_ITEMPREERASE

    某项被擦除之前

    CDDS_ITEMPREPAINT

    某项绘制之前

    dwItemSpec

        区分控件部分的编号。这个值是控件约定的值。此外,trackbar控件使用下面的值去表示控件的一部分。

    描述

    TBCD_CHANNEL

    即将绘制滑动控件的轨道

    TBCD_THUMB

    表示将要绘制的滑动控件的项目是滑标

    TBCD_TICS

    表示将要绘制的滑动控件的项目是刻度

    uItemState

    当前项的状态,它可以是下面值的结合。

    描述

    CDIS_CHECKED

    该项被复选

    CDIS_DEFAULT

    该项处于它的默认状态

    CDIS_DISABLED

    该项不可用

    CDIS_FOCUS

    该项处于激活状态

    CDIS_GRAYED

    该项为灰

    CDIS_HOT

    该项目前处于热区

    CDIS_SELECTED

    该项被选中

    lItemlParam

    应用程序定义的数据。

    实例:

    CListCtrl

    1、改变CListCtrl某行的颜色

    http://hi.baidu.com/zll2117/item/f25961b2c3d4f770254b09db

    http://www.cnblogs.com/rainbowzc/archive/2012/02/26/2369082.html

    2CListCtrl Demo大全

    http://www.verydemo.com/demo_c378_i31212.html

    3CListCtrl的自绘

    http://hi.baidu.com/xingxing/item/dc04649580f278bfcd80e59d

    CTreeCtrl

    http://blog.csdn.net/wojiushi3344/article/details/7463942

    CToolTipCtrl

    http://www.codeproject.com/Articles/36/Tooltips-in-modal-dialog-boxes

    CSliderCtrl

    http://tech.sina.com.cn/s/2006-01-24/0953828115.shtml

    http://www.codeproject.com/KB/miscctrl/CustomDrawCSliderCtrl.aspx

    相关文章:

    自绘控件的4种方法

    http://blog.csdn.net/weiwangchao_/article/details/6832566

  • 相关阅读:
    用jquery判断当前显示器的分辨率,加载不同CSS
    [置顶] Android SDK下载和更新失败的解决方法!!!
    [置顶] 最全的Android开发开发资料
    [置顶] Android入门教程导入现有Android工程
    [置顶] 用Android访问本地站点(localhost,10.0.2.2)
    [置顶] Android入门教程Android工程目录结构介绍
    [置顶] 解决Android解析图片的OOM问题
    [置顶] Android入门教程环境搭建
    [置顶] Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)
    Windows 8 平板电脑体验及思考
  • 原文地址:https://www.cnblogs.com/riasky/p/3435845.html
Copyright © 2011-2022 走看看