1.在VC中的Edit Box中使用换行... 1<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2.关于list control的高级应用---条目编辑... 2
3. 如何在VC MFC的List Control中实现拷贝功能?... 4
5.在列表控件(List Control)中实现工作区... 5
6.处理列表控件(List Control)中的通知消息... 7
9.列表控件(List Control)和列表视图... 11
16.向List Control添加列利用Cstring的例子... 16
18. CListCtrl::InsertItem.. 17
20. 请教关于c++的combo box的用法... 21
默认情况下,Edit Box是默认按了Ctrl+Enter换行,但是在输出数据的时候,这样很不方便,于是就需要设置成自动换行,设置方法是在属性的Styles中设置成Auto VScroll和Vertical scroll,把Auto HCcroll去掉,如下图:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
http://www.fa39.com/Article/c/200610/1952.html
论坛中搜索一下,你会发现不少类似的提问:我如何编辑list control的条目?如何直接编辑list control...等等;list control可用来做数据库表的视图,十分有用.
但报表风格的list control只能编辑第一列,其余的该死的微软没为vc做到.它怕VB卖不出.于是C++程序员只好DIY.主要思想是在list control中动态创建一个控件,动态移动该控件到相应位置.这些方法早有人讨论过了,本文也是基于如上思想的,但注重于可扩充性与使用的方便.
List control 这头主要是重载OnLButtonDown方法,计算出被点中的条目.这里重要的函数是SubItemHitTest和GetSubItemRect,看msdn上有相关说明. 用户点中后,就要负责显示控件了:如果之前选中了其他,就要验证之前的改动是否成功.不成功就要回到原来的地方,成功就应用修改并移到新位置.看代码:
static const UINT IDCHAILD="3000";
void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
LVHITTESTINFO hi;
hi.pt = point;
if(SubItemHitTest(&hi) != -1 )//没有点中条目就不管
{if(m_col==-1||//-1 还没被选过
true==(m_col+m_validate)->Validate (m_row))
{
m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col成
//员分别跟踪选中的行列
}
((m_col+m_validate))->Move (_GetRect(),m_row);
}
}
WinBlast* CValidateList::SetValidate( WinBlast*in)//设置验证的
//控件群,in对应第一列,in+1第二列……
{
WinBlast*ret=m_validate;
m_validate=in;
int counts="GetHeaderCtrl"()->GetItemCount();;
RECT rect;
memset(&rect,0,sizeof(rect));
for(int i="0";i
(in+i)->Create (this,rect,IDCHAILD+i,i);
m_col=-1;//没有被选中的
return ret;
}
RECT CValidateList::_GetRect()//内部使用,得到相应显示位置
{
CRect ret;
GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);
return ret;
}
void CValidateList::NoSelect()//置未选中状态
{
m_col=-1;//没有被选中的
}
看到了WinBlast*ret=m_validate吧.WinBlast是用来修改和验证数据的控件看它的实现:
class WinBlast
{
int m_col;//跟踪列,为什么要这个?因为你可以让一种控件对
//不同列用不同的验证策略
CWnd* m_win;//你的控件窗口
CListCtrl *m_parent;//用它获得文本
public:
WinBlast(){m_win=NULL;}
~WinBlast(){m_win->DestroyWindow();delete m_win;}
virtual bool Create( CWnd* pParentWnd,
const RECT& rect, UINT nID,
int col)
{
m_col=col;m_parent=(CListCtrl *)pParentWnd;
m_win=new CEdit;
return ((CEdit*)m_win)->
Create(ES_NOHIDESEL,rect,pParentWnd,nID);
}
void Move(const RECT &rect,int row)//最重要的函数但前面
//两个动作是必作的,SetText为虚,你在那做你喜欢的
; {
m_win->ShowWindow(SW_SHOW);
m_win->MoveWindow(&rect);
SetText(row);
}
virtual bool Validate(int row)//验证,虚函数.这里永远返回true
{
m_win->ShowWindow(SW_HIDE);
CString set;
m_win->GetWindowText(set);
m_parent->SetItemText(row,m_col,set);
return true;
}
virtual void SetText(int row)
{
m_win->SetWindowText(m_parent->GetItemText(row,m_col));
((CEdit*)m_win)->SetSel (0,-1);
}
};
实际使用通常是这样的:
WinBlast*p=new WinBlast[sizeof(col)/sizeof(col[0])];//col是
//列名字符数组,sizeof(col)/sizeof(col[0])计算列数
m_test.SetValidate (p);//m_test是CValidateList类
你可以继承WinBlast,重载Create建立一个下拉框,加入你喜爱的验证方法.
注意我的设计漏洞:CValidateList应接收WinBlast**,而不是WinBlast*-----不理解这个漏洞其实也不要紧:但要记住,不改正的话你的WinBlast后继类就不能加数据成员了.
Reference: http://zhidao.baidu.com/question/13639294.html
我在单文档视图中加入一个List Control控件(Report形式),并关联类CListCtrl的一个对象,往里面写数据什么的都行,但在界面上无法实现对报表数据的拷贝(快捷或右键都不行),想请教如何实现拷贝该报表显示的数据?
1对CListCtrl创建click事件,记录item
2在视图所在的类创建虚函数PreTranslateMessage
加入代码
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam==13)//这里13是表示回车键盘,你也可以改成其他的
{
copy();
}
}
3.编写copy函数,取得item处的文本,保存只剪切板
创建列表控件 (List Control) (CListCtrl) 后,可以在任何时间更改它的窗口样式。通过更改窗口样式来更改控件使用的视图类型。例如,为了模拟“资源管理器”,您可以提供菜单项或工具栏按钮以在不同的视图(图标视图、列表视图等)之间切换控件。
例如,用户选择您的菜单项后,您可以调用 GetWindowLong 来检索控件的当前样式,然后调用 SetWindowLong 来重置样式。有关更多信息,请参见 Platform SDK 中的使用列表视图 (ListView) 控件。
可用样式在 Create 中列出。样式 LVS_ICON、LVS_SMALLICON、LVS_LIST 和 LVS_REPORT 指定四种列表控件 (List Control) 视图。
扩展样式
除了列表控件 (List Control) 的标准样式之外,还有另一个称为扩展样式的样式集。Platform SDK 中的扩展列表视图样式讨论了这些样式,这些样式可提供自定义列表控件 (List Control) 行为的各种有用功能。若要实现某个样式的行为(如随意选择),请调用 CListCtrl::SetExtendedStyle 传递所需的样式。下面的示例说明该函数调用:
m_myListCtrl.SetExtendedStyle(LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE);
注意 要使随意选择起作用,还必须打开 LVS_EX_ONECLICKACTIVATE 或 LVS_EX_TWOCLICKACTIVATE。
默认情况下,列表控件 (List Control) 按标准网格格式排列所有项。但也支持另一种方法:工作区。工作区将列表项排列到矩形组中。有关实现工作区的列表控件 (List Control) 的图像,请参见 Platform SDK 中的“使用列表-视图控件”。
注意 工作区只有当列表控件 (List Control) 处于图标或小图标模式时才可见。但是,如果视图切换到报表或列表模式,将维持任何当前工作区。
工作区可用来显示空边框(在项的左侧、顶部和/或右侧),或在通常不会有水平滚动条的时候显示水平滚动条。另一个普通用法是创建多个工作区,可以将项移动或放置到这些工作区。使用该方法可以在单一视图中创建具有不同意义的区域。然后用户可以将项放置到不同的区域以对它们分类。此类示例可以是一个文件系统的视图,它包含一个读/写文件区,一个只读文件区。如果将文件项移动到只读区,它将自动变为只读。将文件从只读区移动到读/写区会使文件成为可读/写的。
CListCtrl 为创建和管理列表控件 (List Control) 工作区提供几个成员函数。GetWorkAreas 和 SetWorkAreas 检索并设置 CRect 对象(或 RECT 结构)数组,该数组存储当前实现的列表控件 (List Control) 工作区。另外,GetNumberOfWorkAreas 检索列表控件 (List Control) 的当前工作区数目(默认值为零)。
项和工作区
工作区创建后,工作区中的项成为其成员。同样,如果将一个项移动到某个工作区,则该项成为它所移动到的工作区的成员。如果某个项不在任何工作区中,则它自动成为第一个工作区(索引 0)的成员。如果想创建项并将其放置到一个特定的工作区,则需要创建该项,然后调用 SetItemPosition 将项移动到所需工作区。下面的第二个示例说明该技术。
下面的示例在列表控件 (List Control) (m_listctrl
) 中实现四个大小相等的工作区 (rcWorkAreas
),每个工作区都有 10 像素宽的边框。
CRect curRect;
CSize size;
size= m_listctrl.ApproximateViewRect();
size.cx+= 100;
size.cy+= 100;
CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);
//set work areas
m_listctrl.SetWorkAreas(4, rcWorkAreas);
调用 ApproximateViewRect 来获取在一个区域显示所有项所需要的总区域大小的估计值。之后,该估计值被分成四个区域并用 5 像素宽的边框填充。
下一个示例将现有列表项分配给每一组 (rcWorkAreas
) 并刷新控件视图 (m_listctrl
) 以实现此效果。
// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
rgptWork.x = rcWorkAreas.left + 10;
rgptWork.y = rcWorkAreas.top + 10;
}
// now move all the items to the different quadrants
for (i = 0; i < 20; i++)
m_listctrl.SetItemPosition(i, rgptWork[i % 4]);
// force the control to rearrange the shuffled items
m_listctrl.Arrange(LVA_DEFAULT);
用户单击列标题、拖动图标、编辑标签等时,列表控件 (List Control) (CListCtrl) 将通知消息发送给它的父窗口。如果要进行某种响应,请处理这些消息。例如,用户单击列标题后,可能想基于单击的列的内容对项排序,如在 Microsoft Outlook 中所做的那样。
在视图或对话框类中处理列表控件 (List Control) 的 WM_NOTIFY 消息。基于正在处理的通知消息,用“属性”窗口创建带 switch 语句的 OnChildNotify 处理函数。
有关列表控件 (List Control) 可以发送到其父窗口的通知的列表,请参见 Platform SDK 中的列表视图 (ListView) 控件参考。
虚拟列表控件指具有 LVS_OWNERDATA 样式的列表视图 (ListView) 控件。该样式启用控件来支持项数达到 DWORD(默认的项数只扩展到 int)。然而,该样式的最大便利是可以使内存中一次只有一个数据项子集。这使虚拟列表视图 (ListView) 控件可以将自己借给大型信息数据库使用,而在这类数据库中已存在特定的数据访问方法。
注意 MFC 除了在 CListCtrl 中提供虚拟列表功能外,还在 CListView 类中提供相同的功能。
在开发虚拟列表控件时应注意一些兼容性问题。有关更多信息,请参见 Platform SDK 中“列表-视图控件”主题的“兼容性问题”一节。
虚拟列表控件维护非常少的项信息。除了项选择和焦点信息,所有项信息都由控件的所有者管理。框架通过 LVN_GETDISPINFO 通知消息来请求信息。若要提供请求的信息,虚拟列表控件的所有者(或控件本身)必须处理该通知。使用“属性”窗口可以很容易地完成此操作(请参见将消息映射到函数)。所得到的代码应类似于下面的示例(其中 CMyListCtrl
是虚拟列表控件对象,控件正在处理通知)。
在 LVN_GETDISPINFO 通知消息的处理程序中,必须检查正在请求的信息的类型。可能值是:
· LVIF_TEXT 必须填写 pszText 成员。
· LVIF_IMAGE 必须填写 iImage 成员。
· LVIF_INDENT 必须填写 iIndent 成员。
· LVIF_PARAM 必须填写 lParam 成员。
· LVIF_STATE 必须填写 state 成员。
然后应将所有请求的信息提供给框架。
下面的示例摘自列表控件 (List Control) 对象的通知处理程序体,它通过为文本缓冲区和项的图像提供信息来说明一种可能的方法:
由于这种类型的列表控件 (List Control) 是提供给大的数据集的,因此建议您缓存请求的项数据以提高检索性能。框架提供缓存提示机制,通过发送 LVN_ODCACHEHINT 通知消息来帮助优化缓存。但是,您必须使用一种稍有不同的方法来处理该通知。使用“属性”窗口,重写列表控件 (List Control) 对象的 OnChildNotify 函数。在该示例的情况下为 CMyListCtrl
。
在处理程序体中检查 LVN_ODCACHEHINT 消息,如果找到,则准备缓存。
下面的示例(摘自 OnChildNotify
函数体)执行此检查并调用 CMyListCtrl
类的 PrepCache
成员函数。
注意,如果消息类型不是 LVN_ODCACHEHINT,则通知将传递给基类 (CListCtrl)。有关准备和维护缓存的更多信息,请参见 Platform SDK 中的“列表-视图控件”主题的“缓存管理”一节。
当需要查找特定的列表控件项时,虚拟列表控件发送 LVN_ODFINDITEM 通知消息。列表视图 (ListView) 控件接收快捷键访问或接收 LVM_FINDITEM 消息时发送该通知消息。搜索信息以 LVFINDINFO 结构的格式发送,该结构是 NMLVFINDITEM 结构的成员。通过重写列表控件 (List Control) 对象的 OnChildNotify 函数来处理该消息,并在处理程序体中检查 LVN_ODFINDITEM 消息。如果找到此消息,则执行相应的操作。
您应该准备好搜索与列表视图 (ListView) 控件给定的信息匹配的项。如果成功,则应返回项的索引;如果没有找到匹配项,则返回 -1。
如果嵌入 CListCtrl 对象作为视图或对话框类的数据成员,则当销毁其所有者时该对象也被销毁。如果使用 CListView,则框架在销毁视图时销毁控件。
如果安排将一些列表数据存储在应用程序而不是列表控件 (List Control) 中,将需要安排对列表数据的解除分配。有关更多信息,请参见 Platform SDK 中的回调项和回调屏蔽。
另外,您要负责将您所创建的与此列表控件 (List Control) 对象关联的所有图像列表解除分配。
为方便起见,MFC 以两种方法封装列表控件 (List Control)。可以按下列两种方式使用列表控件 (List Control):
· 通过在对话框类中嵌入 CListCtrl 对象来直接使用。
· 通过使用类 CListView 来间接使用。
CListView 使得在 MFC 文档/视图结构中集成列表控件 (List Control) 变得容易,封装此控件与 CEditView 封装编辑控件 (Edit Control) 基本相同:控件填充 MFC 视图的整个表面区。(视图“是”转换为 CListView 的控件。)
CListView 对象从 CCtrlView 及其基类继承并添加一个检索基础列表控件 (List Control) 的成员函数。像视图一样使用视图成员处理视图。使用 GetListCtrl 成员函数获得对列表控件 (List Control) 的成员函数的访问权限。使用这些成员可以:
· 添加、删除或操作列表中的“项”。
· 设置或获取列表控件 (List Control) 属性。
若要获得对作为 CListView 基础的 CListCtrl 的引用,请从列表视图类调用 GetListCtrl:
该主题描述了使用列表控件 (List Control) 的两种方法。
列表控件 (List Control) (CListCtrl) 中的“项”由图标、标签和可能的其他信息(在“子项”中)组成。
列表控件项的图标包含在图像列表中。一个图像列表包含图标视图中使用的标准尺寸的图标。第二个可选图像列表包含控件的其他视图中所使用的相同图标的较小版本。第三个可选列表包含“状态”图像(如复选框),用于在某些视图的小图标前面显示。第四个可选列表包含在列表控件 (List Control) 的单个标头项中显示的图像。
注意 如果列表视图 (ListView) 控件是用 LVS_SHAREIMAGELISTS 样式创建的,则在图像列表不再使用时您要负责销毁这些图像列表。如果您将相同的图像列表分配给多个列表视图 (ListView) 控件,请指定该样式;否则,一个以上的控件可能会尝试销毁同一个图像列表。
有关列表项的更多信息,请参见 Platform SDK 中的列表视图图像列表和项和子项。另请参见“MFC 参考”中的 CImageList 类和该文章族中的使用 CImageList。
若要创建列表控件 (List Control),需要在将新项插入到列表中时提供将要使用的图像列表。下面的示例将说明此过程,其中 m_pImagelist
是 CImageList 类型的指针,m_listctrl
是一个 CListCtrl 数据成员。
但是,如果不打算在列表视图或列表控件 (List Control) 中显示图标,则不需要图像列表。请参见 DAOVIEW 示例应用程序获取有关不带图标的列表视图的说明。
对于列表视图 (ListView) 控件的每一项,列表视图 (ListView) 控件通常存储标签文本、项的图标的图像列表索引和用于项状态的一组位标志。可以将单个项定义为回调项,这在应用程序已经存储某个项的一些信息时很有用。
可以通过为 LV_ITEM 结构(请参见 CListCtrl::GetItem)的 pszText 和 iImage 成员指定适当值来将一个项定义为回调项。如果应用程序维护项或子项的文本,则为 pszText 成员指定 LPSTR_TEXTCALLBACK 值。如果应用程序跟踪项的图标,则为 iImage 成员指定 I_IMAGECALLBACK 值。
除了定义回调项之外,还可以修改控件的回调屏蔽。该屏蔽是一组指定项状态的位标志,为这些项状态存储当前数据的是应用程序而不是控件。回调屏蔽适用于控件的所有项,这和回调项指定不同,后者适用于特定的项。默认情况下,回调屏蔽为零,意思是控件跟踪所有项状态。若要更改此默认行为,请将屏蔽初始化为下列值的任意组合:
· LVIS_CUT 项被标记为进行剪贴操作。
· LVIS_DROPHILITED 项突出显示为拖放目标。
· LVIS_FOCUSED 项有焦点。
· LVIS_SELECTED 项被选定。
· LVIS_OVERLAYMASK 应用程序存储每一个项的当前覆盖图像的图像列表索引。
· LVIS_STATEIMAGEMASK 应用程序存储每一个项的当前状态图像的图像列表索引。
有关检索和设置该屏蔽的进一步信息,请参见 CListCtrl::GetCallbackMask 和 CListCtrl::SetCallbackMask。
创建列表控件 (List Control) (CListCtrl) 的方式取决于是直接使用此控件还是代之以使用类 CListView。如果使用 CListView,框架将视图构造成其文档/视图创建序列的一部分。创建列表视图也就创建了列表控件 (List Control)(二者相同)。控件在视图的 OnCreate 处理函数中创建。在这种情况下,通过调用 GetListCtrl 准备在控件中添加项。
在对话框中直接使用 CListCtrl
1. 在对话框编辑器中,向对话框模板资源添加“List Control”控件。指定其控件 ID。
2. 使用添加成员变量向导添加带 Control 属性的 CListCtrl 类型的成员变量。可以使用该成员来调用 CListCtrl 成员函数。
3. 对于需要处理的任何列表控件 (List Control) 通知消息,使用“属性”窗口来映射对话框类中的处理函数,请参见将消息映射到函数。
4. 在 OnInitDialog 中,设置 CListCtrl 的样式。请参见更改列表控件 (List Control) 样式。虽然以后可以更改视图,但该操作可确定在控件中获得的“视图”类型。
在非对话框窗口中使用 CListCtrl
1. 在视图或窗口类中定义此控件。
2. 调用控件的 Create 成员函数,可能在 OnInitialUpdate 中,也可能与父窗口的 OnCreate 处理函数一样早(如果创建此控件的子类)。设置此控件的样式。
不论使用 CListView 还是使用 CListCtrl,创建图像列表是一样的。
注意 只有在列表控件 (List Control) 包括 LVS_ICON 样式时才需要图像列表。
使用 CImageList 类创建一个或多个图像列表(对于标准尺寸的图标、小图标和状态)。请参见 Platform SDK 中的 CImageList 以及列表视图图像列表。
为每一个图像列表调用 CListCtrl::SetImageList;将指针传递给合适的 CImageList 对象。
注意 下列过程适用于 CListView 或 CListCtrl 对象。
列表控件 (List Control) 在报表视图中时显示列,提供一种组织每一列表控件项的各种子项的方法。这种组织是通过列表控件 (List Control) 中的列和列表控件项的相关子项之间的一一对应来实现的。有关子项的更多信息,请参见向控件添加项。Windows 95 和 Windows 98 资源管理器中的“详细信息”视图提供了报表视图中列表控件 (List Control) 的示例。第一列列出文件夹、文件图标和标签。其他列列出文件大小、文件类型、上次修改日期等。
虽然可以在任何时间向列表控件 (List Control) 添加列,但只有控件的 LVS_REPORT 样式位打开时列才可见。
每一列有一个关联的标头项(请参见 CHeaderCtrl)对象,该对象标记列并允许用户调整列的大小。有关代码示例的信息,请参见 DAOVIEW 示例应用程序。
如果列表控件 (List Control) 支持报表视图,则需要为列表控件项中每一个可能的子项添加一列。要添加列,先准备 LV_COLUMN 结构,然后调用 InsertColumn。添加必要的列(有时称标头项)后,可以使用属于嵌入式标头控件的成员函数和样式来对它们重新排序。有关更多信息,请参见排序标头控件中的项。
注意 如果用 LVS_NOCOLUMNHEADER 样式创建列表控件 (List Control),则将忽略任何插入列的尝试。
若要向列表控件 (List Control) (CListCtrl) 添加项,请根据您所拥有的信息调用 InsertItem 成员函数的几种版本中的一种。一种版本采用您准备的 LV_ITEM 结构。因为 LV_ITEM 结构包含大量成员,因此您对列表控件项的属性具有更强大的控制能力。
LV_ITEM 结构的两个重要成员(相对于报表视图)是 iItem 和 iSubItem 成员。iItem 成员是该结构正在引用的项的从零开始的索引,iSubItem 成员是子项的从一开始的索引(如果该结构包含有关某项的信息则从零开始)。用这两个成员确定每项的子项信息的类型和值,此信息在列表控件 (List Control) 位于报表视图中时显示。有关更多信息,请参见 CListCtrl::SetItem。
其他成员指定项的文本、图标、状态和项数据。“项数据”是与列表视图项关联的应用程序定义值。有关 LV_ITEM 结构的更多信息,请参见 CListCtrl::GetItem。
其他版本的 InsertItem 采用一个或多个与 LV_ITEM 结构中的成员相对应的独立值,使您得以只初始化想要支持的成员。通常情况下,列表控件 (List Control) 管理列表项的存储,但使用“回调项”可以将一些信息存储在应用程序中。有关更多信息,请参见本主题中的回调项和回调屏蔽和 Platform SDK 中的回调项和回调屏蔽。
有关更多信息,请参见项和子项
//
// create Columns ...
//
for( i="0" ; i
{
// create columns
str.Format(IDS_COLUMN, i+1);
colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);
nCol++;
}
关于str.Format:
IDS_COLUMN:字符串ID,内容为Column %d
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
Return Value
Nonzero if successful; otherwise zero.
Parameters
nItem
Index of the item whose text is to be set.
nSubItem
Index of the subitem, or zero to set the item label.
lpszText
Pointer to a string that contains the new item text.
Remarks
Changes the text of a list view item or subitem.
int InsertItem( const LVITEM* pItem );
int InsertItem( int nItem, LPCTSTR lpszItem );
int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam );
Return Value
The index of the new item if successful or -1 otherwise.
Parameters
pItem
Pointer to an LVITEM structure that specifies the item’s attributes, as described in the Platform SDK.
nItem
Index of the item to be inserted.
lpszItem
Address of a string containing the item’s label, or LPSTR_TEXTCALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask.
nImage
Index of the item’s image, or I_IMAGECALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask.
nMask
The nMask parameter specifies which item attributes passed as parameters are valid. It can be one or more of the mask values described in LVITEM structure in the Platform SDK. The valid values can be combined with the bitwise OR operator.
nState
Indicates the item's state, state image, and overlay image. See the Platform SDK topics LVITEM for more information and List View Item States for a list of valid flags.
nStateMask
Indicates which bits of the state member will be retrieved or modified. See LVITEM in the Platform SDK for more information.
nImage
Index of the item’s image within the image list.
lParam
A 32-bit application-specific value associated with the item. If this parameter is specified, you must set the nMask attribute LVIF_PARAM.
Remarks
Inserts an item into the list view control.
程序参考:E:\唐进\工作\项目\VC2005项目\testing\MFC\0328MauCtni\资源例程\××Print ListCtrl on multiple pages\listPrint_demo\listPrintView.cpp(111): CListCtrl &refCtrl = GetListCtrl();
void CListPrintView::OnFill()
{
CWaitCursor wait;
CListCtrl &refCtrl = GetListCtrl();//此处为引用
int i,
j,
nCol=0,
colId,
iActualItem;
CString str;
if( m_bFilled )
{
AfxMessageBox(IDS_STUPID);
return;
}
对于
CListCtrl& GetListCtrl( ) const;
Return Value
A reference to the list control associated with the view.
Remarks
Call this member function to get a reference to the list control associated with the view.
经典例子:
void CListPrintView::OnFill()
{
CWaitCursor wait;
CListCtrl &refCtrl = GetListCtrl();//此处犹为重要
int i,
j,
nCol=0,
colId,
iActualItem;
CString str;
if( m_bFilled )
{
AfxMessageBox(IDS_STUPID);
return;
}
m_bFilled = TRUE;
// speed up !
SetRedraw(FALSE);
//
// create Columns ...
//
for( i="0" ; i
{
// create columns
str.Format(IDS_COLUMN, i+1);
colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);
nCol++;
}
m_ColSortOrder.SetSize(nCol);
// ... and fill in text
for( j="0"; j
{
str.Format(IDS_CELL, i+1, j+1);
iActualItem = refCtrl.InsertItem(j, str);
for( i="0" ; i
{
str.Format(IDS_CELL, i+1, j+1);
refCtrl.SetItemText(iActualItem, i, str);
}
}
DWORD dwStyle = refCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
dwStyle |= LVS_EX_HEADERDRAGDROP| LVS_EX_GRIDLINES;
dwStyle |= LVS_EX_FULLROWSELECT;
refCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle);
SetRedraw(TRUE);
}
Reference: http://zhidao.baidu.com/question/3937015.html
我在对话框中添加了一个combo box,请问如何在程序里动态增加,删除列表(item),以及如何获取用户当前选择的是哪个列表,请说明的详细一点,请用非MFC的方法。
谢谢!!
可以调用SendMessage函数来实现这些功能
增加一个列表项 CB_ADDSTRING
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_ADDSTRING, // message ID
(WPARAM) wParam, // = 0; not used, must be zero
(LPARAM) lParam // = (LPARAM) (LPCTSTR) lParam;
);
lParam指向一个以null结束的字符串,将被加入的列表项
删除一个列表项 CB_DELETESTRING
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_DELETESTRING, // message ID
(WPARAM) wParam, // = (WPARAM) () wParam;
(LPARAM) lParam // = 0; not used, must be zero
);
wParam指定将被删除列表项的下标(从0开始)
取得选定的项 CB_GETCURSEL
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_GETCURSEL, // message ID
(WPARAM) wParam, // = 0; not used, must be zero
(LPARAM) lParam // = 0; not used, must be zero
);
返回值了lResult包含了当前被选择的列表项的下标(从0开始)
参考资料:microsoft msdn
1. 你在编辑状态下点那个控件的向下的三角形,就出冒出来一个可以调高度的东东。将高度调高,否则在执行时会不能显示下拉选项。
2. 2.为combo box添加选项,在编辑状态下选combo box控件的属性,选Data标签,在编辑框中添加选项,按Ctrl-Enter来添加下一个选项。
3. 3.为combo box添加变量
combo box有两个变量,CComboBox类变量和CString变量。
CComboBox变量用来设置combo box的属性,一般在cdialog类中的oninitdialog()函数中使用。添加方法是在classwizard中添加变量,添加时Category中选Control。例如:CComboBox.SetCurSel(0)用来设置下拉菜单初始值,具体看MSDN。
CString变量用来存储下拉菜单所选的选项值。同样,当选项发生变化时要使用UpdateData(TRUE)函数更新该变量的值。
我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其
实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象
下面的语句:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制
)
ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到
了吗?不,还有办法:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a;//呵呵,这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYP
E*)的意思是把无符号整数a的值当作一个地址来看待。
上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候
,就会出现非法操作错误。
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完
全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个
整数当作一个地址赋给一个指针:
例十六:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。
好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以
把一个整数值当作地址赋给一个指针。
Data types unique to the Microsoft Foundation Class Library include the following:
CString str="uhsajflkj";
BYTE king[20];
king = (BYTE )str.GetBuffer(Str.GetLength());
文章评论(0条评论)
登录后参与讨论