关于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得到数据,但是会出现其他错误,在这里就不说了。
- 关于mfc重载CListbox控件出现参数错误的问题
- MFC的CListBox控件使用LBS_OWNERDRAWVARIABLE风格不能AddString的问题
- C++MFC学习心得(四)——CListBox自绘控件碰到的一个小问题
- MFC CListBox的使用
- CListBox控件的重写
- MFC 错误:没有与参数列表匹配的 重载函数
- MFC 错误:没有与参数列表匹配的 重载函数
- 关于MFC控件变量错误的处理
- MFC编程错误:CListBox::InsertString”: 不能将参数 2 从“char [4096]”转换为“LPCTSTR
- (VC/MFC) CListBox类 和 Listbox控件
- MFC重绘控件篇---按钮CListBox
- VC MFC列表框(CListBox)控件
- 关于MFC中list控件的问题
- 关于MFC控件的一些问题
- 关于CListBox和CComboBox修改窗口Style的问题
- CListBox控件的Multicolumn属性
- 一个关于重载的出现的问题(暂记录)
- 关于CLISTBOX 的另类操作
- Windows下qwtplot3d编译(win7+qt5.7.1+vs2013)
- Spring IOC 2
- 【Unet】Unet Failed to spawn server object, assetId=0000000000000e2656f netId=2 问题
- 深度学习之物体检测——Fast R-CNN(Ross Girshick)
- G711编码原理
- 关于mfc重载CListbox控件出现参数错误的问题
- Error: This class should provide a default constructor (a public constructor with no arguments)
- Matrix矩阵类的学习总结
- 制作Unity插件之-创建一个Window窗口
- spring ioc 3
- Datatables Server-side processing
- python基础------正则表达式
- SSH客户端开发开源组件Ganymed SSH-2 for Java初体验
- 【模板】Treap (模板题:洛谷P3369普通平衡树)