• CUSTOMDRAW和OwnerDraw


    1.Owner Draw

    当Button控件被设置成OwnerDraw属性时,父窗体就会接受到WM_DRAWITEM、WM_MEASUREITEM、WM_COMPAREITEM、WM_DELETEITEM四个消息。

    除了Button空间外,还有ListBox控件设置CBS_OWNERDRAWVARIABLE属性。

    The WM_DRAWITEM message is sent to the owner window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo box, list box, or menu has changed.

    在MFC中,已经将这个4个消息反射到子控件的类中,如
    void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
    void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);


    2.Custom Draw

    如下控件都支持Custom Draw。



    父窗体会收到NM_CUSTOMDRAW的通知消息。即

    WM_NOTIFY idCtrl = (int) wParam;

    pnmh = (LPNMHDR) lParam;
    typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT idFrom;
    UINT code; //通知消息码
    } NMHDR;

    当控制码是NM_CUSTOMDRAW时候
    #ifdef LIST_VIEW_CUSTOM_DRAW
    lpNMCustomDraw = (LPNMLVCUSTOMDRAW) lParam;
    #elif TOOL_TIPS_CUSTOM_DRAW
    lpNMCustomDraw = (LPNMTTCUSTOMDRAW) lParam;
    #elif TREE_VIEW_CUSTOM_DRAW
    lpNMCustomDraw = (LPNMTVCUSTOMDRAW) lParam;
    #elif TOOL_BAR_CUSTOM_DRAW
    lpNMCustomDraw = (LPNMTBCUSTOMDRAW) lParam;
    #else
    lpNMCustomDraw = (LPNMCUSTOMDRAW) lParam;
    #endif
    lpNMCustomDraw->dwDrawStage有如下几种可能

    Global Values
    Description

    CDDS_POSTERASE
    After the erasing cycle is complete.

    CDDS_POSTPAINT
    After the painting cycle is complete.

    CDDS_PREERASE
    Before the erasing cycle begins.

    CDDS_PREPAINT
    Before the painting cycle begins.

    Item-specific Values
    Description

    CDDS_ITEM
    Indicates that the dwItemSpec, uItemState, and lItemlParam members are valid.

    CDDS_ITEMPOSTERASE
    After an item has been erased.

    CDDS_ITEMPOSTPAINT
    After an item has been drawn.

    CDDS_ITEMPREERASE
    Before an item is erased.

    CDDS_ITEMPREPAINT
    Before an item is drawn.

    CDDS_SUBITEM
    Version 4.71. Flag combined with CDDS_ITEMPREPAINT or CDDS_ITEMPOSTPAINT if a subitem is being drawn. This will only be set if CDRF_NOTIFYITEMDRAW is returned from CDDS_PREPAINT.

    在MFC或WTL中,已经反射到子控件,并封装好如下函数
    DWORD OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnPostPaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnPreErase(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnPostErase(int idCtrl, LPNMCUSTOMDRAW lpNMCD);

    DWORD OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnItemPostPaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnItemPreErase(int idCtrl, LPNMCUSTOMDRAW lpNMCD);
    DWORD OnItemPostEraset(int idCtrl, LPNMCUSTOMDRAW lpNMCD);

    DWORD OnSubItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD);

  • 相关阅读:
    Nginx Record
    Go 查找元素
    博客转移公告
    模板库
    模板库
    【BZOJ2276】Temperature
    【BZOJ3524】Couriers
    【BZOJ4458】GTY的OJ
    AtCoder Grand Contest 007
    Editing 2011-2012 ACM-ICPC Northeastern European Regional Contest (NEERC 11)
  • 原文地址:https://www.cnblogs.com/BeyondTechnology/p/1995944.html
Copyright © 2020-2023  润新知