关于mfc重载CListbox控件出现参数错误的问题

来源:互联网 发布:什么淘宝炒作 编辑:程序博客网 时间:2024/06/04 19:27

昨天辛苦写了一天的程序,交给同事测试,结果他告诉我出现参数错误对话框,找了半天才发现,原来忽略了CListbox空白内容的问题。


首先讲一下DrawItem函数中的结构体变量成员吧。

DRAWITEMSTRUCT

DRAWITEMSTRUCT结构体为所有者窗体的自绘控件与菜单提供决定如何绘制的一些必要的信息.所有者的WM_DRAWITEM消息lParam参数指向自绘控件或菜单项的结构体指针

typedef struct tagDRAWITEMSTRUCT {  // dis 
    UINT  CtlType; 
    UINT  CtlID; 
    UINT  itemID; 
    UINT  itemAction; 
    UINT  itemState; 
    HWND  hwndItem; 
    HDC   hDC; 
    RECT  rcItem; 
    DWORD itemData; 
} DRAWITEMSTRUCT;

成员

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

itemID
 表示一个指定菜单项的标识符或combo box(组合框), list box(列表框)的索引.对于一个空的combo box(组合框), list box(列表框),这个成员可以是-1。

 即使控件在那里没有项目,不管用户指出combo box(组合框)或list box(列表框)是否有焦点,应用程序都会绘制焦点矩形,由rcItem成员给出坐标.
 虽然combo box(组合框), list box(列表框)已经有焦点,但可以通过设置itemAction成员值决定是否绘制焦点矩形.


itemAction
 指定绘制必需的行为.这个成员可用下列的一个或多个值

 ODA_DRAWENTIRE 整个控件需要绘制时.
 
 ODA_FOCUS  控件失去或得到键盘焦点.必需检查itemState成员,确定控件是否已经有焦点.

 ODA_SELECT  选中状态被改变.必需检查itemState成员确定是否有新的选择状态.

itemState
 指定在当前绘制的动作发生之后,项目的可视状态.成员可以是下列的一个或多个组合值
 
 ODS_CHECKED  菜单项是被选中的.这个只对菜单有效.

 ODS_COMBOBOXEDIT 自绘组合框绘制发生时只绘制选择区

 ODS_DEFAULT  这个项是一个默认的项
 
 ODS_DISABLED  项目被禁止时

 ODS_FOCUS  项目有键盘焦点时
 
 ODS_GRAYED 项目变灰时。这个只对菜单有效

 ODS_SELECTED 菜单项的状态是被选中的

 ODS_HOTLIGHT  Windows 98/Me, Windows 2000/XP: 项目有热跟踪,换句话说,鼠标在项目上面的时候,项目将被加亮
 
 ODS_INACTIVE Windows 98/Me, Windows 2000/XP: 项目是非活动的和窗体有关的菜单是非活动的。

 ODS_NOACCEL
  Windows 2000/XP: 控件不绘制键盘加速提示

 ODS_NOFOCUSRECT
  Windows 2000/XP: 控件不绘制焦点提示标记
hwndItem
 combo box(组合框), list box(列表框),控钮(button),或静态控件(combo box)控件的句柄.对于菜单,这个成员是包含菜单项的菜单句柄

hDC
   设备上下文的句柄;这个设备上下文必需在要绘图操作时使用。

rcItem
 定义将被绘制的矩形边界.这个矩形是hDC成员指定的设备上下文.(笔者注:矩形与hdc是一样的大小),系统自动裁剪
 combo box(组合框), list box(列表框),控钮(button)在所有者窗体的设备上下文
 (注:使用控件自己的坐标系,rcItem中的坐标点(0,0)指的就是控件的左上角),但不裁剪菜单项.
 当绘制菜单项的时候,所有者窗体不应在rcItem成员定义矩形边界之外给制.

itemData
 应用程序定义与菜单项相关联的值.对于控件,这个参数最后分配给列表框(list box)或组合框(combo box)的LB_SETITEMDATA或CB_SETITEMDATA消息
 如果列表框(list box)或组合框(combo box)已经有LBS_HASSTRINGS或CBS_HASSTRINGS风格,这个值最初是零,
 否则,这个值最初的值是传给列表框(list box)或组合框(combo box)
 下列消息中lparam参数的一个值:
 CB_ADDSTRING
 CB_INSERTSTRING
 LB_ADDSTRING
 LB_INSERTSTRING 
 如果CtlType是ODT_BUTTON或ODT_STATIC,itemData是零.

备注
  少量的控件类型,不设置CtlType。这样的是状态条


好了,现在回归正题。如前所属,通过itemID来获得选项内容,如果内容为空,则会弹出参数错误提示框。

所以,解决方法就是在通过项目ID来获取内容时,判断项目ID是否为-1,如果是则返回,否则继续执行,就可以解决了。当然,有人可能会用itemData得到数据,但是会出现其他错误,在这里就不说了。

阅读全文
0 0