vc++组件,vc++高级编程
滑块控件,也称为轨迹栏控件,主要使用一个带有轨迹和滑块的小窗口以及窗口上的刻度来允许用户选择一个离散的数据或一个连续的数值区间。可以通过鼠标或键盘选择数据,在WIN98/95的很多应用程序中都可以看到,比如控制面板中的鼠标。滑块可以是水平的也可以是垂直的。滑动控制的样式如下:
TBS_HORZ滑块是水平的,TBS_VERT滑块是垂直的。
TBS_LEFT滑块在窗口的左侧。TBS_RIGHT滑块位于窗口的右侧。
TBS_TOP滑块位于窗口的顶部,TBS_BOTTOM滑块位于窗口的底部。
TBS _两个滑块都位于窗口的两侧。TBS_AUTOTICKS滑块是分级的,这是默认设置。
TBS_NOTICKS滑块没有刻度。
滑动条的比例尺在每个数字位置显示一个刻度标记。如果某个数字选择间隔显示在滑动条上,应该使用TBS_ENABLESELRANGE样式。此时,两个选择区间不再是刻度标记,而是一个小三角符号。此外,使用TBS_NOTHUMB样式会使滑块消失。
slide控件在MFC类库中封装为CSliderCtrl控件,其主要操作是设置刻度范围、绘制刻度标记、设置选择范围和当前滑动标记位置等。当用户交互时,滑块控制消息WM_HSCROLL将被发送到他们的父窗口。因此,应该在应用程序中重载父窗口的OnHScroll()成员函数,以便正确处理消息,例如系统发送的通知代码、滑块位置和指向CSliderCtrl对象的指针。考虑到它与水平滚动条共享同一个成员函数,所以OnHScroll()函数参数表中的指针变量定义为CScrollBar* type。由于消息实际上是由滑动条生成的,所以这个指针变量必须在程序中强制转换为CSliderCtrl*类型。滑动条和滚动条的消息编码和含义非常相似,比如TB_BOTTOM,所以这种方法是合理的。SetRange()函数用于设置范围,SetPos()函数用于设置当前位置。
(2)由滑动条控制的对象结构
建立滑动控制的方法
CsliderCtrl SliderCtrl建立滑块控件对象的结构;创建滑块控件对象并绑定该对象。
幻灯片控件类CSliderCtrl:Create的调用格式如下:
BOOL Create( DWORD dwStyle,const RECT rect,CWnd* pParentWnd,UINT nID);
参数dwStyle用于确定滑块的控制样式;Rect参数用于确定滑块控件的大小和位置;参数pParentWnd用于确定slider控件的父窗口指针;参数nID用于确定滑块控件的控制器ID值。
2.由滑动条控制的类属性
滑块控件对象的类属性包括获取滑块大小GetLineSize、设置滑块大小SetLineSize、获取滑块页面大小GetPageSize、设置滑块页面大小SetPageSize、获取滑块最大位置GetRangeMax、滑块最小位置GetRangeMin、滑块范围GetRange、设置最小滑块位置SetRangeMin、最大滑块位置SetRangeMax、滑块范围SetRange、获取滑块当前位置GetSelection、设置滑块当前位置SetSelection、获取滑块当前位置GetPos和设置滑块当前位置SetPos等。
3.滑杆控制的操作方法
滑块控制的操作方法包括清除滑块当前选择清除、验证滑块当前位置是否在最大和最小位置之间、验证位置、清除当前刻度清除。
滑动控制应用技巧举例
1.使用应用程序向导AppWizard生成应用程序CSlidDlg基于对象框架;
2.设置对话框中的滑块控件,ID为IDC _ SLIDER;
3.在对话框的初始代码中添加控件范围和位置:
(1)设置SlidDlg.h中的数据成员来表示滑块的当前值:
//SlidDlg.h
类CSlidDlg:公共Cdialog
{.//其他代码
公共:
int m _ nCur
.//其他代码
}
(2)在SlidDlg.cpp中设置初始状态
BOOL CSlidDlg:OnInitDialog()
{ Cdialog:OnInitDialog();
.//其他代码
//TODO:在此添加额外的初始化
CSliderCtrl * pSlidCtrl=(CSliderCtrl *)GetDlgItem(IDC _ sl lider);
pSlidCtrl- SetRange(1,5,TRUE);//设置滑块范围
pSlidCtrl-SetPos(2);//设置滑块位置。
.//其他代码
返回TRUE
}
(3)改进滑块的消息处理,利用ClassWizard ClassWizard增加对话框窗口的WM_HSCROLL消息处理功能,获取滑块指示的位置值:
void CSlidDlg:on scroll(UINT nsb code,UINT nPos,CScrollBar *pScrollBar)
{ //TODO:添加您的消息处理程序?
cdialog:on scroll(nsb code,nPos,pScrollBar);
CSliderCtrl * pSlidCtrl=(CSliderCtrl *)GetDlgItem(IDC _ sl lider);
m _ nCur=pSlidCtrl-get pos();//获取当前位置值
}
VC通用控件编程中的状态栏控制
(一)状态栏控件的主要功能
状态栏控件易于理解和使用简单。状态栏是一个位于父窗口底部的水平子窗口,它可以分成几个小区域来显示信息。MFC中封装的CstatusBarCtrl控件类提供了基本的应用方法。
(2)状态栏控制的对象结构
1.状态栏控件的创建方法
CStatusBarCtrl StatusBarCtrl建立状态栏控件对象的结构;创建一个状态栏控件对象,并绑定状态栏控件类CstatusBarCtrl:Create。调用格式如下:
BOOL Create( DWORD dwStyle,const RECT rect,CWnd* pParentWnd,UINT nID);
参数dwStyle用于确定状态栏的控件样式;Rect参数用于确定状态栏窗口的大小和位置;参数pParentWnd用于确定状态栏父窗口的指针;nID用来确定状态栏控件的标识符。
条形控件样式可以是以下值的组合:CCS_BOTTOM、CCS_NODIVIDER、CCS_NOHILITE、CCS_NOMOVEY、CCS_NOPARENTALIGN、CCS_NORESIZE和CCS_TOP等。具体内容和含义请参考工具栏控件的相关部分。
2.由状态栏控制的类属性
status control类的属性包括设置给定部分的显示文本SetText,获取给定部分的文本GetText,设置状态栏区域划分的数量和每个部分的右坐标,获取状态栏区域划分的数量SetParts,获取状态栏的水平和垂直宽度GetBorders,获取状态栏的矩形区域GetRect。
(三)状态栏控件的应用技巧
状态控件除了显示一定的帮助和提示信息外,还可以实现响应鼠标输入等功能。这里以鼠标移动坐标在状态栏上的显示为例,详细讲解其应用技巧。
在应用程序向导生成的程序代码中,状态栏是主窗口的子窗口,它有一个AFX _ IDW _状态栏标识符。通过调用函数GetDescendantWindow()和AfxGetMainWnd(),可以获得状态栏窗口的指针。由于基于文档的应用程序在建立时就有状态栏区域,所以只需使用类向导添加鼠标移动消息处理函数和以下函数代码就可以实现该功能:
void ctest view:OnMouseMove(UINT nFlags,Cpoint)
{
CclientDC dc(这个);//建立设备文本
OnPrepareDC( dc,NULL);//设备映射处理
华盛顿。DPtoLP(点);//鼠标指针转换
char text[128];
cstatus bar * p status=(cstatus bar *)AfxGetApp()-m _ pMainWnd-
getdescendananwindow(AFX _ IDW _状态_栏);//获取窗口指针
If(pStatus){//如果有显示鼠标坐标
Sprintf (text," x坐标=M,Y坐标=m ",point.x,point . Y);
pStatus- SetPaneText(0,text);}
CscrollView:OnMouseMove(nFlags,point);
}
VC通用控件编程中的程序控制
(一)进度条的主要功能
进度控制主要用于提示数据读写、文件复制、磁盘格式化等操作的进度,比如安装程序。随着工作的进行,进度条的矩形区域由左至右被当前活动窗口标题栏的颜色填充。
MFC类库中进度条控件的包类是CProgressCtrl,通常只作为输出类来控制,所以它的操作主要是设置进度条的范围和当前位置,并不断更新当前位置。进度条的范围用来表示整个操作过程的时间长度,当前位置表示当前完成的时刻。range()函数用于设置范围,初始范围为0-100,SetPos()函数用于设置当前位置,初始值为0,SetStep()函数用于设置步长,初始步长为10,Step()函数用于根据当前步长更新位置,OffsetPos()函数用于直接将当前位置移动一段距离。如果范围或位置发生变化,进度条会自动重绘进度区域,及时反映当前工作的进度。
进度条的对象结构
进度条控件的建立方法
CProgressCtrl ProgressCtrl建立进度条的控件对象结构。
创建进度条控件对象并绑定该对象。
进度条控件类CprogressCtrl:Create的调用格式如下:
BOOL Create( DWORD dwStyle,const RECT rect,CWnd* pParentWnd,UINT nID);
参数dwStyle用于确定进度条控件的控件样式;Rect参数用于确定进度条控件的大小和位置;参数pParentWnd用于确定进度条父窗口的指针;参数nID用于确定进度条控件的控制器ID值。
2.由进度条控制的类属性
进度条控件的类属性包括设置进度条SetRange的最大和最小控制范围,设置进度条SetPos的当前位置,设置进度条OffsetPos的当前位置的偏移值,设置进度条控件SetStep的增量值。
3.进度条控件的操作方法
进度条控件的操作方法是制作进度条控件,重绘进度条的StepIt函数。
进度条控件的应用技巧举例
1.使用应用程序向导AppWizard生成应用程序CProgDlg基于对象框架;
2.在对话框中设置进度条和静态文本控件,其id为IDC_PROG和IDCPERCENT分别是;
在对话框的初始代码中添加控件的范围和位置:
在ProgDlg.h中设置两个数据成员来表示进度条的最大值和步长:
//ProgDlg.h
类CProgDlg:公共Cdialog
{.//其他代码
公共:
int m_nMax,m _ nStep
.//其他代码
}
(2)在ProgDlg.cpp中设置初始状态
BOOL CProgDlg:OnInitDialog()
(3)改进WM_TIMER消息处理,使进度条根据当前步长更新,完成进度条的百分比显示:
void CProgDlg:on timer(UINT nIDEvent)
{ //TODO:添加您的消息处理程序?
CProgressCtrl * pProgCtrl=(CProgressCtrl *)GetDlgItem(IDC _ PROG);
int NP repos=pProgCtrl-StepIt();//获取更新前的位置
char测试[10];
int n percent=(int)(((nPrePos m _ nStep)/m _ nMax * 100 0.5);
wsprintf(测试,%d%%?n percent);
GetDlgItem(IDC _ PERCENT)-SetWindowText(text);
cdialog:on timer(nIDEvent);
}
VC通用控件编程中的CList控件
(一)列表控件的主要功能
列表控件视图主要用于以各种方式显示一组数据记录,供用户执行各种操作。Windows98/95中资源管理器中“查看”选项卡下的“大图标小图标列表详细资源”就是一个非常好的典型应用。列表中的记录可以包括多个数据项或代表数据内容的大小图标。用于表示数据记录的列表控件提供了操作Windows列表功能的基本方法,而列表视图可以通过使用列表视图的视图功能来操作。通过调用视图成员GetListCtrl获取列表视图中嵌入的列表控件的引用(GetListCtrl List=GetListCtrl()),可以像列表控件一样执行各种操作。操作列表控件和视图的基本方法是:创建一个列表控件;创建列表控件所需的图像列表;向列表控件添加表格列和项目;控制列表,包括搜索、排序、删除、显示、排列和各种消息处理功能。最后,撤销列表控件。
对于一个列表控件,最典型、最常用的显示控件模式有:大图标模式(LVS _图标)、小图标模式(LVS _小图标)、列表显示模式(LVS _列表)和详细信息(即报表LVS _报表)显示模式。这可以通过设置其显示模式属性来实现。要控制列表所在窗口的样式,可以使用函数GetWindowLong和SetWindowLong。为了控制列表图标的对齐,可以设置列表窗口的样式LVS_ALIGNTOP或LVS_ALIGNLEFT。
(2)列表控件的对象结构
1、列表控件的建立方法
定义列表对象的结构。
创建列表控件并绑定对象
控制列表CListCtrl:Create的调用格式如下:
BOOL Create( DWORD dwStyle,const RECT rect,CWnd* pParentWnd,UINT nID);
参数dwStyle用于确定列表控件的样式;Rect用于确定列表控件的大小和位置;PParentWnd用于确定列表控件的父窗口,通常是对话框;nID用于确定列表控制的标识。列表控件的样式可以是下列值的组合:
LVS_ALIGNLEFT用于确定表格项目的大小。图标以左对齐方式显示。
LVS_ALIGNTOP用于确定表格项目的大小。图标以顶部对齐方式显示。
LVS _自动排列用于确定表格项目的大小。图标以自动排列方式显示。
LVS _编辑标签设置表项文本可编辑,父窗口必须具有LVN_ENDLABELEDIT样式;
LVS _图标用于确定大图标的显示方式;
LVS _列表用于确定列表显示;
LVS_NOCOLUMNHEADER用于确定列表标题不在详细模式下显示;
LVS _诺拉贝尔WRAP用于确定在单行中显示图标的文本项;
LVS_NOSCROLL用来屏蔽滚动条;
LVS _诺瑟德用于确定列表头不能作为按钮功能使用;
LVS _ ownerdrawfird允许在详细列表模式下自绘窗口;
LVS _报表用于确定详细信息的显示,即报表;
LVS _共享图像列表用于确定共享图像列表的方式;
LVS_SHOWSELALWAYS用于确定总是显示所选条目的方式;
LVS_SINGLESEL用于确定某一时刻只能选择一个项目;
LVS_SMALLICON用于确定小图标的显示方式;
LVS_SORTASCENDING用于确定条目的排序是基于条目文本的升序方式;
LVS_SORTDESCENDING用于确定条目的排序是基于条目文本的降序方式;
2.由列表控制的属性类
列表控件的属性类包括获取列表控件的背景色GetBkColor,设置列表控件的背景色SetBkColor,获取列表控件的图像列表GetImageList,设置列表控件的图像列表SetImageList,获取列表项的数量GetItemCount,获取列表控件的属性GetItem,获取与条目相关的数据GetItemData,设置条目的属性SetItem,设置与条目相关的值SetItemData, 获取下一个关联条目GetNextItem,设置列表控件的文本颜色,获取列表控件文本的背景颜色GetTextBkColor,设置最大条目数SetItemCount和获取选中条目数GetSelectedCount等。
3.列表控件的操作方法
列表控件的操作方法包括插入新表项InsertItem、删除表项DeleteItem、排序表项SortItems、测试列表命中位置、重绘表项RedrawItems、插入表列InsertColumn、删除表列DeleteColumn、编辑表项text EditLabel和重绘表项DrawItem等。
(C)列表控件的数据结构
该列表包含两个非常重要的数据结构LV_ITEM和LV_COLUMN。LV_ITEM用于定义列表控件的表项,LV_COLUMN用于定义列表控件的表列。定义格式如下:
typedef struct _LV_ITEM {
UINT掩码;//结构成员掩码位
项目间;//条目的索引号
int iSubItem//子表项索引号
UINT状态;//条目状态
UINT状态掩码;//状态有效性屏蔽位
LPTSTR pszText//条目名称的文本
int cchTextMax//条目名称的最大长度
int iImage//表格项目图标的索引号
LPARAM lParam//与条目相关的32位数字
}吕_项;
typedef结构_ LV _列{
UINT掩码;//结构成员有效性掩码位
int fmt//表格列对齐
int cx//表格列的像素宽度
LPTSTR pszText//表格列的标题名
int cchTextMax//表格列名的文本长度
int iSubItem//与表列关联的子表项的索引号
} LV _列;
fmt可以采用以下值:
LVCFMT_CENTER表格列居中对齐。
LVCFMT_LEFT表列左对齐。
(4)列表控件应用技巧举例
本文通过一个具体的例子来演示列表控件和以前的表头控件、图片列表的应用技巧。步骤如下:
1.通过“文件-新建-项目-MFC appwizard (exe)”建立一个名为VCLIST的项目,在建立过程中根据对话框选择应用程序;删除对话框中的默认控件,将所有对话框属性中的语言字段设置为中文(P.R.C ),使应用程序可以支持中文;
2.建立两个图标IDI_GJ和IDI_XS,用来表示图标的选中和未选中状态。每个图标要建立32X32和16X16两种尺寸,保证节目需要;
3.在对话框中设计一个组合框。组合框中设置了“大图标小图标列表数据”四个单选按钮。同时设置了排序、删除、关闭三个控制按钮(按键)。在对话框中,设置一个大小合适的列表控件(List Ctrl)。相应的徽标如下:
-
控制名称标题名称标识符
-
控制列表IDC_LISTCTRL
组合框模式IDC_STATIC
无线按钮图标IDC_STDICON
图标IDC_SMLICON
列IDC_LIST
材料IDC _报告
按钮排序IDC_SORT
删除IDC_DEL
关闭IDOK
-
4.在设置无线按钮时,需要注意的是,只有大图标的Group属性被选中,其他无线按钮的状态都是默认值。
5.选择列表控件,选择“视图-class wizard-内存变量”,使用IDC_ LISTCTRL引入成员变量,成员变量的类型有:
变量名称类型变量类型
m_ListCtrl控件ClistCtrl
同时,“消息映射”用于为每个无线按钮和命令按钮添加控制功能。
6.然后,将以下代码分别添加到包含文件和代码的文件中:
(1)在VCLISTDlg.h中添加数据结构和定义
Typefstruct标记PS {//定义结构
char szPm[10];//产品名称
int Lx//0-GJ 1-XS
char szSl[10];//数量
char szDj[10];//单价
char szJe[10];//金额
} SPS
int回调CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);
(2)在VCLISTDlg开头添加初始化数据和程序定义。卡片打印处理机(Card Print Processor的缩写)
//在文件开头添加数据结构初始化
SPS[]={//信息
{ 红梅,0, 1000, 30 , 30000},
{ 黄梅,0, 1000 , 29 , 29000},
{ 青梅,0, 1000, 28 , 28000},
{ 梅清,0, 1000 , 27 , 27000},
{ 白眉,0, 1000 , 31 , 31000},
{ 红梅,1,一千,三十,三万 },
{ 黄梅,1, 1000 , 29 , 29000},
{ 青梅,1, 1000 , 28 , 28000},
{ 梅清,1, 1000 , 27 , 27000},
{ 白妹,1, 1000 , 31 , 31000 } };
CImageList Cil1、Cil2//大小图像列表
(3)在程序初始化时添加标题、图像和列表控件建立代码。
BOOL CVCLISTDlg:OnInitDialog()
{ CDialog:OnInitDialog();
//.//其他代码
//todo:在此添加额外的初始化以添加代码。
LV _ ITEM lvitem
LV _ COLUMN lvcol
int i,iPos,iItemNum
CVCLISTApp * pApp=(CVCLISTApp *)AfxGetApp();//创建图像列表
Cil1Create(32,32,TRUE,2,2);
Cil1add(pApp-LoadIcon(IDI _ GJ));
Cil1add(pApp-LoadIcon(IDI _ XS));
Cil2Create(16,16,TRUE,2,2);
Cil2add(pApp-LoadIcon(IDI _ GJ));
Cil2add(pApp-LoadIcon(IDI _ XS));//设置图像列表
m_ListCtrl。SetImageList( Cil1,LVSIL _ NORMAL);
m_ListCtrl。SetImageList( Cil2,LVSIL _ SMALL);//将表格列添加到列表控件中
lvcol . mask=LVCF _ FMT LVCF _子项 LVCF _ TEXT LVCF _ WIDTH;
lvcol.fmt=LVCFMT _ CENTER//居中
I=0;
Col. psztext=产品名称;
lvcol . isubitem=I;
lvcol.cx=70
m_ListCtrl。InsertColumn(i,lvcol);
Lv.psztext= quantity
lvcol . isubitem=I;
lvcol.cx=70
m_ListCtrl。InsertColumn(i,lvcol);
lvcol。psztext=单价";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
lvcol。psztext=金额";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
//向列表控制中添加表项
iitm num=sizeof(PLC)/sizeof(PLC);
for(I=0);伊特米姆人;>
lvitem。mask=lvif _ text lvif _ image lvif _ param;
lvitem。iitem=i
lvitem。isubitem=0
lvitem。pszttext=PLC[I].szpm
LV项目。iii image=PLC[I].Lx标记;
lvitem。lparam=i
iPos=m_ListCtrl .insert item(lvitem);//返回表项插入后的索引号
lvitem.mask=LVIF_TEXT:
lvitem。iitem=首次公开募股
lvitem。isubitem=1
lvitem。pszttext=PLC[I].深圳电视台
S7-1200可编程控制器setitem(lvitem);
lvitem。isubitem=2
lvitem。pszttext=PLC[I].辉仔
S7-1200可编程控制器setitem(lvitem);
lvitem。isubitem=3
lvitem。pszttext=PLC[I].szJe先生;
S7-1200可编程控制器setitem(lvitem);
}
CheckRadioButton(IDC_STDICON、IDC_REPORT、IDC _ STDICON);
返回true//返回没错,除非您将焦点设定为控制项
}
(4)完善列表显示方式代码
在利用类向导类向导创建各功能按钮显示功能函数之后,必须依次完善这些功能函数的代码,这些功能函数如下:
请参见cvclistd LG:con dicon()//设置大图标显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ icon//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
参见cvclistd LG:on licon()//设置小图标显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ smallicon//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
请参阅cvclistd:onlist()//设置列表显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ list//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
请参阅CVCLISTDlg:OnReport() //详细资料显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ report//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
(5)删除功能的实现
要实现删除功能,必须取得选中表项的数和表项总数,并且需要从后向前进行依次删除,其原因是每个表项被删除后,其后各表项的索引号均会发生递减变化,如果采取从前向后删除的方法,就会造成无法正常删除选中的表项,其功能代码如下:
请参见cvclistd LG:wave()//删除按钮功能
{ //全部:在此处添加您的控制通知处理程序代码
int i,istate
int nitemselected=m _ listctrl .GetSelectedCount()://所选表项数
int nitemcount=m _ listctrl .getitem count();//表项总数
if(nitmselected 1)返回;
for(I=nitm count-1);[我-]
iState=m_ListCtrl .GetItemState(i,LVIS _选定):
如果(ist!=0) m_ListCtrl .删除第项;
}
}
(6)排序功能的实现
列表控件有一个特殊的功能。详细显示时,列表顶部的表头可以作为按钮使用,按钮可以由创建列表控件时的样式控制。当鼠标单击列表标题的名称时,列表控件将向其父窗口发送一条LNV _列单击消息。通过将类指南中列表控件IDC_LISTCTRL对应的LNV_COLUMNCLICK消息添加到对应的处理函数中,可以按照特定的顺序排列列表列。有关该函数的用法,请参见过程,其中,iSort是已排序的表列的索引号,而(PFNLVCOMPARE)CompareFunc是用于特定排序的回调函数。也就是说,用鼠标点击表头实现的排序过程,是通过第三方开发的特殊排序功能实现的。排序函数只实现表项的具体比较操作,整个排序过程是通过SortItemS属性不断调用该函数来实现的。正常的排序过程是按升序进行的。通过改变排序函数中的参数值,可以实现降序排列,即PARAM1和PARAM2可以改变位置。这个回调函数的前两个参数是表列中表项的索引号,第三个参数是排序后的表列索引号。
void CVCLISTDlg:OnColumnclickListctrl(NMHDR * pNMHDR,LRESULT* pResult)
{//用鼠标左键单击表头处理功能。
NM _ LISTVIEW * pNMListView=(NM _ LISTVIEW *)pnm HDR;
//TODO:在此添加控件通知处理程序代码
静态int iso rted=-1;//排列顺序号
if(pNMListView-iSubItem==is orted)返回;
is orted=pNMListView-iSubItem;
m_ListCtrl。sort items((PFNLVCOMPARE)compare func,is orted);
* pResult=0;
}//排序时比较表项的回调函数
int回调CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
char *text1,* text2
开关(lParamSort){
案例0L:text1=Sps[lParam1]。szPm
text2=Sps[lParam2]。szPm打破;
案例1L:text1=Sps[lParam1]。szSl
text2=Sps[lParam2]。szSl打破;
案例2L:text1=Sps[lParam1]。szDj
text2=Sps[lParam2]。szDj打破;
案例3L:text1=Sps[lParam1]。szJe
text2=Sps[lParam2]。szJe打破;
}
return (strcmp(text1,text 2));//结果是0=0 0
}
同样,排序功能也可以通过特殊按钮来实现。例如,本文中排序按钮对应的功能代码如下:
void CVCLISTDlg:OnSort()
{ //TODO:在此添加控件通知处理程序代码
m_ListCtrl。sort items((PFNLVCOMPARE)compare func,0);
}
7.列表查看的练习技巧
使用listview时,其方法与列表控件基本相同,只是listview在一个窗口中实现,listcontrol在一个对话框中实现,listview的各种功能通过菜单实现,list control通过按钮实现等。Listcontrol需要在对话框中创建列表控件控件,listview直接占据整个窗口。在设计过程中,只要把按钮和listcontrol的设计过程改成菜单设计就可以了。并且注意函数添加是通过类向导中的菜单命令来操作的,同时在每个函数前面添加了获取列表可视化引用的命令(CListCtrl ListCtrl=GetListCtrl()),而其余的数据结构和代码都不需要修改,所以很容易实现。
VC通用控件编程中的CImageList控件
CImageList是大小相同的图像集合,每个集合中图像的索引号以0为基数。图像列表通常由大图标或位图组成,包括透明位图模式。您可以使用WINDOWS32位API来绘制、创建和删除图像,并且可以添加、删除、替换和拖动图像。图像列表控件提供了控制图像列表的基本方法,只能在WINDOWS95及以后的版本中实现。
(一)图像控制的对象结构
1.图像控件的数据成员
M_hImageList连接图像对象的控制句柄。
2.图像控件的建立方法
CimageList&imageList建立图像控件对象结构
初始化创建图像列表并绑定对象。
图像控制建立如下:
BOOL Create( int cx,int cy,UINT nFlags,int nInitial,int nGrow);
BOOL Create( UINT nBitmapID,int cx,int nGrow,COLORREF Cr mask);
BOOL Create( LPCTSTR lpszBitmapID,int cx,int nGrow,COLORREF Cr mask);
BOOL Create(CImageList imagelist 1,int nImage1,CImageList imagelist2
,int nImage2,int dx,int dy);
每个参数的含义是:cx定义图像的宽度,单位为像素;定义cy图像的高度,以像素为单位。NFlags确定图像列表的类型,可以是以下值的组合:ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、ILC_COLORDDB和ILC _ MASK;NInitial用于确定图像列表中包含的图像数量;NGrow用于确定图像列表中可控图像的数量。NbitmapID用于确定与图像列表相关联的位图标志值;CrMask表示颜色掩码位;LpszBitmapID用于确定包含位图资源的标识字符串;
Imagelist1是指向图像列表控件对象的指针;包含在nImage1图像列表1中的图像的数量;Imagelist2是指向图像列表控件对象的指针;nImage2图像列表2中包含的图像数;Dx代表以像素为单位的图像宽度;Dy代表以像素为单位的图像高度。
同样,图像控件的建立也包括两个步骤:首先建立图像列表结构,然后建立图像列表控件。
3.图像控件的属性类
图像的受控属性类包括返回m_hImageList。控制句柄GetSafeHandle,获取图片列表中图片的个数GetImageCount,设置图片列表的背景色SetBkColor,获取图片列表的背景色SetBkColor,获取图片的相关信息。
4.图像控制的操作方法
图像控件的操作方法包括将图像列表附加到对象上,解除对象上图像列表的绑定并返回句柄Attach,删除图像列表,将图像添加到图像列表中,从图像列表中添加和删除图像等。
(二)图像控制的应用技巧
至于图像控件,也不能单独使用,必须和列表控件、树控件、标签控件结合使用。下面是具体的应用技巧。
1.图像控件在列表控件中的应用技巧
设置图像控件CListCtrl:SetImageList的调用格式如下:
CImageList * set imagelist(CImageList * pImageList,int nImageList);
它的返回值是指向前一个图像列表控件的指针,或者NULL如果没有以前的图像列表;其中,参数pImageList是指向图像列表的标识符,nImageList是图像列表的类型,可以是下列值:
LVSIL_NORMAL用大图标列出图片;
LVSIL_SMALL用小图标列出图片;
LVSIL_STATE以图像状态列出图像;
图像控件CListCtrl:GetImageList的调用格式如下:
CImageList * get imagelist(int nImageList)const;
返回值是指向图像列表控件的指针,其中nImageList用于确定获取返回值的图像列表的值,其值与设置图像列表函数的值相同。
图像控件在列表控件中的应用实例
CImageList Cil1、Cil2//定义图标列表的大小
CVCLISTApp * pApp=(CVCLISTApp *)AfxGetApp();//获取列表控制程序
Cil1Create(32,32,TRUE,2,2);//建立32位图像控件
Cil1add(pApp-LoadIcon(IDI _ GJ));//添加选定的图像。
Cil1add(pApp-LoadIcon(IDI _ XS));//添加未选中的图像。
Cil2Create(16,16,TRUE,2,2);//建立16位图像控件
Cil2add(pApp-LoadIcon(IDI _ GJ));//添加选定的图像。
Cil2add(pApp-LoadIcon(IDI _ XS));//添加未选中的图像。
m_ListCtrl。SetImageList( Cil1,LVSIL _ NORMAL);//设置大图标控件
m_ListCtrl。SetImageList( Cil2,LVSIL _ SMALL);//设置小图标控件
2.图像控件在树木控制中的应用技巧。
设置图像控件CTreeCtrl:SetImageList的调用格式如下:
CImageList * set imagelist(CImageList * pImageList,int nImageListType)
;
其返回值为指向前前一个图像列表的指针,否则为NULL;参数pImageList为指向图像列表的标识,如果pImageList为NULL则所有的图像都将从树控制中被清除;nImageListType为图像列表设置的类型,可以是如下值之一:
TVSIL_NORMAL 设置正常图像列表,其中包括选中和非选中两种图标;
TVSIL_STATE 设置图像列表状态,指用户自定义状态;
②取得图像控制CTreeCtrl::GetImageList的调用格式如下:
CImageList* GetImageList( UINT nImage );
如果调用成功则返回图像列表控制指针,否则为NULL;nImage为取得返回值的图像列表类型,其取值和取得图像列表控制完全相同。
③图像控制在树控制中的应用示例
CImageList Cil1,Cil2;//定义大小图标像列表
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//获取应用程序指针
Cil1.Create(16,16,ILC_COLOR,2,2);//建立图像控制
Cil1.Add(pApp- LoadIcon(IDI_PM));//增加选中状态图像
Cil1.Add(pApp- LoadIcon(IDI_CJ));//增加非选中状态图像
m_TreeCtrl.SetImageList( Cil1,TVSIL_NORMAL);//设置图像控制列表
然后在树控制的结构定义中进行如下设置:
TCItem.item.iImage=0; //设置未选中图像索引号
TCItem.item.iSelectedImage=1;//设置选中时图像引号
3、图像控制在标签控制中的应用技巧
①设置图像控制CTabCtrl::SetImageList的调用格式
CImageList * SetImageList( CImageList * pImageList );
其返回值为指向前一个图像列表的指针,如果不存在前一个图像列表则为NULL;pImageList为标识TAB控制的图像列表指针。
②取得图像控制CTabCtrl::GetImageList的调用格式
HIMAGELIST GetImageList() const;
其返回值为指向TAB控制的图像列表指针,如果调用不成功则为NULL。
VC通用控件编程之CHeadCtrl控件
表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。一般为数据列的标题,可以包括多个部分,用户可以拖动每个部分并可以控制每列的宽度。表头控制类提供了普通表头控制的基本方法,只有在WINDOWS95以后版本系统中才提供,其方法包含在afxcmn.h文件中,一般与标签控制(CTabCtrl)和列表控制(CListCtrl)组合使用。
(一)表头控制的对象结构
1、表头控制对象的建立方法
CHeaderCtrl cheaderCtrl 建立表头控制对象
Create 建立表头并绑定对象
CHeaderCtrl::Create的格式如下:
BOOL Create( DWORD dwStyle, const RECT rect, CWnd* pParentWnd, UINT nID );其返回值非零时初始化成功,否则失败。
参数dwStyle用来确定表头控制类型;rect用来确定表头控制的大小和位置;ParentWnd用来确定表头控制的父窗口;nID用来表示表头控制的标志。
表头控制风格包括:
HDS_BUTTONS 表示表头控制外观类似按钮;
HDS_HORZ 表示表头控制为水平排列;
HDS_VERT 表示表头控制为垂直排列;
HDS_HIDDEN 表示表头控制为隐藏模式。
它也可以使用普通类控制风格,包括:
CCS_BOTTOM 设置控制位置在父窗口的底部并与父窗口同样宽度;
CCS_NODIVIDER 在控制顶部形成两个像素的高亮区;
CCS_NOHILITE 在控制顶部形成一个像素的高亮区;
CCS_NOMOVEY 在响应WM_SIZE消息时重置大小并水平排列;
CCS_NOPARENTALIGN 使控制自动靠近父窗口的顶部或底部;
CCS_NORESIZE 设置初始大小或新值时使控制使用默认宽度和高度;
CCS_TOP 设置在父窗口客户区域的顶部并与父窗口同样宽度;
同样表头控制也可以使用窗口控制风格,包括:
WS_CHILD 建立一个子窗口,不能用于WS_POPUP窗口类型;
WS_VISIBLE 建立一个初始时不可见的窗口;
WS_DISABLED 建立一个初始时无效的窗口;
WS_GROUP 确定可用光标移动的控制群组;
WS_TABSTOP 确定可用TAB控制移动站点;
表头控制一般分为两个步骤,首先确定表头控制的数据结构,然后建立表头控制并绑定对象。
2、表头控制的属性
表头控制的属性包括取得表头控制中项目的数量GetItemCount、取得表头控制中某一项目的内容GetItem和设置表头控制中某一项目的内容SetItem。
3、表头控制的操作方法
表头控制的操作方法包括向表头控制中插入一个新项目InsertItem、从表头控制中删除一个项目DeleteItem和绘制表头中给定的项目DrawItem等。
(二)表头控制的数据结构
在使用表头控制时,首先必须建立一个数据结构HD_ITEM,其结构定义如下:
typedef struct _HD_ITEM
{ UINT mask; //结构成员有效控制位
int cxy; //表头项目的宽度
LPSTR pszText; //表头项目内容
HBITMAP hbm; //表头项目的位置句柄
int cchTextMax; //表头内容字符串长度
int fmt; //表头项目的格式
LPARAM lParam; //应用程序定义的32位数据
} HD_ITEM;
屏蔽控制位说明了数据结构成员中包含的有效数据,可以是下面标志的组合:
HDI_BITMAP hbm成员有效
HDI_FORMAT fmt 成员有效
HDI_LPARAM lParam成员有效
HDI_TEXT pszText 和cchTextMax 成员有效
HDI_WIDTH cxy 成员有效并确定项目宽度值
格式标志位fmt可以是以下标志的组合:
HDF_CENTER 表头项目居中
HDF_LEFT 表头项目左对齐
HDF_RIGHT 表头项目右对齐
HDF_BITMAP 表头显示一个位图
HDF_OWNERDRAW 由主窗口自绘表头项目
HDF_STRING 表头项目为一个字符串
(三)表头控制的应用技巧
由于表头控制无法单独使用,其主要是配合列表控制和标签控制,并多以文字表头应用多见,InsertItem、SetItem和GetItem是常用的方法,如在列表控制时利用InsertColumn属性就可以增加一个表列的文本标题,具体用法和技巧见列表控制和标签控制。下面以在列表控制中的增加表列的方法来具体说明:
lvcol.pszText="品 名";//设置第一列表头名
lvcol.iSubItem=i; //表列序号
lvcol.cx=70; //表列宽度
m_ListCtrl.InsertColumn(i++, lvcol);//插入一个表列
lvcol.pszText="数 量";//设置第二列表头名
lvcol.iSubItem=i;
lvcol.cx=70;
m_ListCtrl.InsertColumn(i++, lvcol);//插入一个表列
......//其它代码
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。