自绘控件时用到的WM_MEASUREITEM消息

发布时间:2014年5月2日 作者:未知 查看次数:1505

自绘控件时用到的WM_MEASUREITEM消息


自绘控件时用到的WM_MEASUREITEM消息和MEASUREITEMSTRUCT结构

在自绘菜单时,菜单总是不能正确显示宽度,后来找到可以改变自绘控件或菜单项的尺寸的WM_MEASUREITEM消息和MEASUREITEMSTRUCT结构体。

http://blog.csdn.net/StamHe/article/details/4298388

MEASUREITEMSTRUCT结构体通知系统自绘控件或菜单项的尺寸.这充许系统正确的处理用户与控件的相互动作
typedef struct tagMEASUREITEMSTRUCT {   // mis
    UINT  CtlType;      // 控件类型
    UINT  CtlID;        // combo box, list box, or button 标识符
    UINT  itemID;       // menu item, variable-height list box, 菜单项,可变高的列表框
                        // or combo box identifier 或组合框的标识符
    UINT  itemWidth;    // width of menu item, in pixels 菜单项的宽,单位:象素
    UINT  itemHeight;   // height of single item in list box menu,
                        // in pixels 菜单或列表框单一项目的高,单位象素
    DWORD itemData;     // application-defined 32-bit value 应用程序定义的32位值
} MEASUREITEMSTRUCT;

CtlType:
 指定控件的类型.这个成员可以是下列的一个值:
  ODT_BUTTON    自绘按钮
  ODT_COMBOBOX  自绘组合框
  ODT_LISTBOX  自绘列表框
  ODT_LISTVIEW 自绘列表视图控件
  ODT_MENU 自绘菜单
CtlID:
 指定组合框(combo box), 列表框(list box), 或 控钮(button)的标识符.这个成员不能在菜单中使用

itemID:
 指定菜单项的标识符或组合框(combo box), 列表框(list box)的位置索引.
  列表框(list box)风格已经有LBS_OWNERDRAWVARIABLE时这个值才被指定
  组合框(combo box)风格已经有CBS_OWNERDRAWVARIABLE风格时这个值才被指定

itemWidth:
 指定宽,单位象素,一个菜单项目.在从消息返回之前,自绘菜单项的所有者必需填充这个成员.

itemHeight:
 指定高,单位象素,列表框(list box)一个个别的项或一个菜单.在从消息返回之前自绘组合框,列表框或菜单项必需填写这个参数.

itemData:
 指定与应用程序定义的菜单项相关联的32位值.做为控件,这个参数指定值是最后指定给列表框(list box)或组合框(combo box)的LB_SETITEMDATA或CB_SETITEMDATA消息中的值.如果列表框(list box)或组合框(combo box)已经使用LB_HASSTRINGS或CB_HASSTRINGS风格这个最初值是零.否则,这个值最初的值是传给列表框(list box)或组合框(combo box)
 下列消息中lparam参数的一个值:
 CB_ADDSTRING
 CB_INSERTSTRING
 LB_ADDSTRING
 LB_INSERTSTRING
备注:
 所有者窗体接收一个自绘控件的WM_MEASUREITEM消息lParam参数指向的MEASUREITEMSTRUCT结构体的指针.就在控件被创建的时候自绘控件发送这个消息到它的所有者窗体.所有者然后为控件和返回的结构体填写适当成员.
 这个结构体是共同的所有自绘控件
 如果应用程序没有填充MEASUREITEMSTRUCT适当的成员.这个控件或菜单不可能被完全的绘制

 

==================================================================

WM_MEASUREITEM消息

 

WM_MEASUREITEM
在控件或菜单被创建的时候,向自绘按钮(button),组合框(combo box),列表框(list box),
列表视图(list view)或菜单项的所有者发送WM_MEASUREITEM消息

WM_MEASUREITEM
idCtl = (UINT) wParam;                // 控件标识符
lpmis = (LPMEASUREITEMSTRUCT) lParam; // 项目大小信息

参数:
idCtl
    wParam值. lpmis参数指向MEASUREITEMSTRUCT结构体CtlID成员包含的值,
 这个值由发送到控件的WM_MEASUREITEM消息确定

 如果这个值是零.消息是由一个菜单发出.如果这个值是非零,消息是由组合框(combo box),列表框(list box)
  发出,如果这个值是非零并且lpmis指向的MEASUREITEMSTRUCT结构体itemID成员的值是(UINT)-1,
 消息是发送到组合框编辑区域.
lpmis
    lparam值.指向包含自绘控件或菜单项的尺寸的MEASUREITEMSTRUCT结构体
返回值:
 如果应用程序处理这个消息,返回的是TRUE

备注:
 就在所有者接收WM_MEASUREITEM消息的时候,所有者填充消息中lParam参数指向的MEASUREITEMSTRUCT结构体,
 这告诉系统控件的尺寸.如果一个组合框(combo box)或列表框(list box)创建时有
 LBS_OWNERDRAWVARIABLE或 CBS_OWNERDRAWVARIABLE风格,这个消息发送到所有者控件各自的项;否则,这个消息发送一次.

 在WM_INITDIALOG消息发送之前,系统为在创建时有OWNERDRAWFIXED风格的列表框和组合框的所有者窗体
 发送WM_MEASUREITEM消息.在所有者收到这个消息的时候,系统还没有决定控件使用字体的宽度和高度尺寸.
 将在应用程序或库中调用主要的函数计算需要的值

 



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110