MFC控件

控件的通知消息

 

控件的消息映射宏的格式大致是:

ON_通知消息码(nID, memberFun)

//nID参数是控件的ID,memberFun参数是消息处理函数名。例如,ON_BN_CLICKED(IDC_BUTTON1, &CDlg::OnBnClickedButton1)。此消息映射宏应添加到BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间。

消息处理函数声明的语法形式为: 
afx_msg void memberFun(); 

 

静态文本框:CStatic类

CStatic是CWnd的派生类。

Create函数的原型如下:



virtual BOOL Create(

   LPCTSTR lpszText,

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID = 0xffff 

);



       参数说明:



       lpszText:指定要在控件中显示的文字。如果为NULL则不会显示任何文字。



       dwStyle:指定静态控件的风格。静态文本框一般都是对话框或其他窗口的子窗口,而且是可见的,所以应该包含WS_CHILD 和WS_VISIBLE风格,另外,MSDN中说明,还可以为其设置“static control styles”中风格的任意组合。下面大概为大家说明几个风格:



SS_BITMAP	一个位图将显示在静态控件中,Create函数的lpszText参数字符串是资源文件中定义的位图名。此风格忽略宽度和高度参数,静态控件自动调整它的尺寸来适应位图

SS_BLACKFRAME	指定一个具有与窗口边界同色的框,默认为黑色

SS_BLACKRECT	指定一个具有与窗口边界同色的实矩形,默认为黑色

SS_CENTER	使显示的正文居中对齐,正文可以换行

SS_GRAYFRAME	指定一个具有与屏幕背景同色的边框

SS_GRAYRECT	指定一个具有与屏幕背景同色的实矩形

SS_ICON	使控件显示一个在资源中定义的图标,图标的名字由Create 函数的lpszText 参数指定,图标自动调整它的尺寸

SS_LEFT	左对齐正文,正文能回绕

SS_LEFTNOWORDWRAP	左对齐正文,正文不能回绕

SS_NOTIFY	使控件能向父窗口发送鼠标事件消息

SS_RIGHT	右对齐正文,可以回绕

SS_SIMPLE	使静态正文在运行时不能被改变并使正文显示在单行中

SS_WHITEFRAME	指定一个具有与窗口背景同色的框,默认为白色

SS_WHITERECT	指定一个具有与窗口背景同色的实心矩形,默认为白色

       

       rect:指定静态控件的位置和大小,它可以是RECT结构体类型,也可以是CRect类的对象。



       pParentWnd:指定静态控件的父窗口,通常是一个CDialog对象,不能是NULL。



       nID:指定静态控件的ID。
 
CStatic类的主要成员函数,下面是成员函数列表。



GetBitmap	获取由SetBitmap函数设置的位图的句柄

GetCursor 	获取由SetCurSor设置的光标的句柄

GetEnhMetaFile	获取由SetEnhMetaFile设置的增强图元文件的句柄

GetIcon	获取由SetIcon设置的图标的句柄

SetBitmap	设置要在静态控件中显示的位图

SetCursor	设置要在静态控件中显示的光标图片

SetEnhMetaFile	设置要在静态控件中显示的增强图元文件

SetIcon	设置要在静态控件中显示的图标
 

编辑框:CEdit类

编辑框的部分通知消息。



       EN_CHANGE:编辑框的内容被用户改变了,与EN_UPDATE 不同,该消息是在编辑框显示的正文被刷新后才发出的

       EN_ERRSPACE: 编辑框控件无法申请足够的动态内存来满足需要

       EN_HSCROLL: 用户在水平滚动条上单击鼠标

       EN_KILLFOCUS: 编辑框失去输入焦点

       EN_MAXTEXT:输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL 或

       ES_AUTOVSCROLL: 的编辑框中,当正文超出了编辑框的边框时也会发出该消息

       EN_SETFOCUS: 编辑框获得输入焦点

       EN_UPDATE: 在编辑框准备显示改变了的正文时发送该消息

       EN_VSCROLL: 用户在垂直滚动条上单击鼠标
 
Create成员函数的原型如下:



virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       参数说明:



       dwStyle:指定编辑框的风格。可以是MSDN中“edit styles”包含风格的任意组合。下面是“edit styles”的所有风格说明。



       ES_AUTOHSCROLL:当用户在行尾键入一个字符时,正文将自动向右滚动10 个字符,当用户按回车键时,正文总是滚向左边

       ES_AUTOVSCROLL: 当用户在最后一个可见行按回车键时,正文向上滚动一页

       ES_CENTER: 在多行编辑框中使正文居中

       ES_LEFT :左对齐正文

       ES_LOWERCASE: 把用户输入的字母统统转换成小写字母

       ES_MULTILINE:指定一个多行编辑器。若多行编辑器不指定ES_AUTOHSCROLL 风格,则会自动换行,若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时

发出警告声响

       ES_NOHIDESEL:默认时,当编辑框失去输入焦点后会隐藏所选的正文,当获得输入焦点时又显示出来。设置该风格可禁止这种默认行为

       ES_NUMBER :编辑框中只允许输入数字

       ES_OEMCONVERT:使编辑框中的正文可以在ANSI 字符集和OEM 字符集之间相互转换。这在编辑框中包含文件名时是很有用的

       ES_PASSWORD: 使所有键入的字符都用“*”来显示

       ES_READONLY: 将编辑框设置成只读的

       ES_RIGHT :右对齐正文

       ES_UPPERCASE: 把用户输入的字母统统转换成大写字母

       ES_WANTRETURN:使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择默认的命令按钮,这往往会导致对话框的关闭



       除了上面的风格外,编辑款一般还会设置WS_CHILD、WS_VISIBLE、WS_BORDER等窗口风格。另外,编辑框可以是多行的,也就是在编辑框中显示多行文字,这就需要设置ES_MULTILINE风格,如果想要多行编辑框支持回车键,则还要设置ES_WANTRETURN。
CEdit类的主要的成员函数:

       获取和设置编辑框中的正文,它们对应的成员函数分别是GetWindowText和SetWindowText,这两个函数都是继承自CWnd类的成员函数,另外,还可以使用CWnd类的GetWindowTextLength函数获取编辑框中正文的长度。



       int LineFromChar(int nIndex = –1) const;



       返回多行编辑框中指定索引的字符所在行的行号(从零开始),只适用于多行编辑框。nIndex等于-1则返回所选择正文的第一个字符所在行的索引。如果没有选择正文,则返回当前行的行号。



       int LineIndex(int nLine = –1) const;



       返回由nLine指定行的起始字符在编辑框的整个字符串中的索引,只适用于多行编辑框。如果指定行超过编辑框的最大行数,则返回-1,而如果nLine为-1,则返回当前插入符所在行的起始字符的索引。



       void GetSel(int& nStartChar,int& nEndChar) const;



       获取选择正文的索引范围。nStartChar返回被选择正文的起始索引,nEndChar返回被选择正文的终止索引(不包括在选择范围内)。如果没有选择正文,则两者均为当前插入符的索引。



       void SetSel(int nStartChar,int nEndChar,BOOL bNoScroll=FALSE);



       选择编辑框中的正文。nStartChar为选择开始处的索引,nEndChar为选择结束处的索引。如果nStartChar为0并且nEndChar为-1,则选择所有正文,而如果nStartChar为-1则取消所有选择。bNoScroll为FALSE时滚动插入符并使之可见,为TRUE时不滚动。



       void ReplaceSel(LPCTSTR lpszNewText,BOOL bCanUndo = FALSE);



       用lpszNewText指向的字符串来替换选择的正文。如果bCanUndo为TRUE则替换可以被撤销。



       int GetLineCount() const;



       获取正文的行数,只适用于多行编辑框。如果编辑框没有正文则返回1。



       int LineLength( int nLine = –1 ) const;



       获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内),参数nLine 说明了为字符索引。如果nLine 的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。



       int GetLine( int nIndex, LPTSTR lpszBuffer ) const;

       int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;



       用来获得指定行的正文(不包括行尾的回车和换行符),只适用于多行编辑框。参数nIndex 是行号,lpszBuffer 指向存放正文的缓冲区,nMaxLength 规定了拷贝的最大字节数。若指定的行号小于编辑框的实际行数,函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine 函数不会在缓冲区中字符串的末尾添加字符串结束符(NULL)。    



       UINT GetLimitText( ) const;



       获取编辑框能够接受的正文的最大字节数。



       void LimitText(int nChars = 0);



       设置用户在编辑框中可以输入的正文的最大长度(字节数)。如果nChars为0,则最大长度为UINT_MAX个字节。

 

按钮:CButton类

按钮控件包括命令按钮(Button)、单选按钮(Radio Button)和复选框(Check Box)等
Create函数的原型:



virtual BOOL Create(

   LPCTSTR lpszCaption,

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       参数说明:



       lpszCaption:指定按钮控件显示的文本。



       dwStyle:指定按钮控件的风格,可以设置为以下按钮风格的任意组合。



       BS_AUTOCHECKBOX :同BS_CHECKBOX,不过单击鼠标时按钮会自动反转

       BS_AUTORADIOBUTTON: 同BS_RADIOBUTTON,不过单击鼠标时按钮会自动反转

       BS_AUTO3STATE :同BS_3STATE,不过单击按钮时会改变状态

       BS_CHECKBOX:指定在矩形按钮右侧带有标题的选择框

       BS_DEFPUSHBUTTON:指定默认的命令按钮,这种按钮的周围有一个黑框,用户可以按回车键来快速选择该按钮

       BS_GROUPBOX:指定一个组框

       BS_LEFTTEXT:使控件的标题显示在按钮的左边

       BS_OWNERDRAW:指定一个自绘式按钮

       BS_PUSHBUTTON:指定一个命令按钮

       BS_RADIOBUTTON:指定一个单选按钮,在圆按钮的右边显示正文

       BS_3STATE:同BS_CHECKBOX,不过控件有3 种状态—选择、未选择和变灰



       当然,除了以上列出的风格,一般还会为按钮设置WS_CHILD、WS_VISIBLE和WS_TABSTOP等风格,WS_TABSTOP风格使按钮控件具有tab停止属性,即按tab键切换焦点控件时能够将焦点停在按钮控件上。创建一组单选按钮时,第一个按钮的风格应设置为WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_AUTORADIOBUTTON,其他单选按钮的风格应为WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,不包含WS_TABSTOP和WS_GROUP。

 

CButton类的主要成员函数:



       HBITMAP SetBitmap(HBITMAP hBitmap);



       设置要在按钮中显示的位图。参数hBitmap为位图的句柄。返回值为按钮原来位图的句柄。



       HBITMAP GetBitmap( ) const;



       获取之前由SetBitmap函数设置的按钮位图的句柄。



       void SetButtonStyle(UINT nStyle,BOOL bRedraw = TRUE);



       设置按钮的风格。参数nStyle指定按钮的风格,bRedraw指定按钮是否重绘,为TRUE则重绘,否则不重绘,默认为重绘。 



       UINT GetButtonStyle( ) const;



       获取按钮控件的风格。



       void SetCheck(int nCheck);



       设置按钮的选择状态。参数nCheck为0表示未选中状态,1表示选中状态,2表示不确定状态(仅用于复选框)。



       int GetCheck( ) const;



       获取按钮的选择状态。返回值的意义同SetCheck函数的nCheck参数。



       HCURSOR SetCursor(HCURSOR hCursor);



       设置要显示到按钮上的光标图。参数hCursor指定了光标的句柄。返回值为按钮原来光标的句柄。



       HCURSOR GetCursor( );



       获取之前由SetCursor设置的光标的句柄。



       HICON SetIcon(HICON hIcon);



       设置要在按钮上显示的图标。参数hIcon指定了图标的句柄。返回值为按钮原来图标的句柄。



       HICON GetIcon( ) const;



       获取之前由SetIcon设置的图标的句柄。



       void SetState(BOOL bHighlight);



       设置按钮的高亮状态。参数bHighlight指定按钮是否高亮显示,非0则高亮显示,否则取消高亮显示状态。



       UINT GetState( ) const;



       获取按钮控件的选择状态、高亮状态和焦点状态。我们可以通过将返回值与各个掩码相与来获得各种状态值,掩码与对应的相与结果说明如下:



       掩码0x0003:用来获取单选按钮或复选框的状态。相与结果为0表示未选中,1表示被选中,2表示不确定状态(仅用于复选框)。

       掩码0x0004:用来判断按钮是否是高亮显示。相与结果为非0值表示按钮是高亮显示的。当单击按钮并按住鼠标左键时,按钮会呈高亮显示。

       掩码0x0008:相与结果为非零值表示按钮拥有输入焦点。



       下面再列出几个继承自CWnd类的成员函数,通过它们获取或设置按钮控件的状态非常方便,只需要知道按钮的ID。



       void CheckDlgButton(int nIDButton,UINT nCheck);



       用来设置按钮的选择状态。参数nIDButton指定了按钮的ID。nCheck的值为0表示按钮未被选择,为1表示按钮被选择,为2表示按钮处于不确定状态(仅用于复选框)。



       UINT IsDlgButtonChecked(int nIDButton) const;



       返回复选框或单选按钮的选择状态。返回值为0表示按钮未被选择,为1表示按钮被选择,为2表示按钮处于不确定状态(仅用于复选框)。



       void CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nIDCheckButton);



       用来选择组中的一个单选按钮。参数nIDFirstButton指定了组中第一个按钮的ID,nIDLastButton指定了组中最后一个按钮的ID,nIDCheckButton指定了要选择的按钮的ID。



       int GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton);



       用来获得一组单选按钮中被选中按钮的ID。参数nIDFirstButton 说明了组中第一个按钮的ID,nIDLastButton 说明了组中最后一个按钮的ID。



       另外,CWnd类的成员函数GetWindowText()、SetWindowText()等也可以用来获取或设置按钮中显示的文本。
 

列表框控件:CListBox类

 
列表框的通知消息:



       LBN_DBLCLK :用户用鼠标双击了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息

       LBN_ERRSPACE :列表框不能申请足够的动态内存来满足需要

       LBN_KILLFOCUS :列表框失去输入焦点

       LBN_SELCANCEL: 当前的选择被取消,只有具有LBS_NOTIFY 的列表框才能发送该消息

       LBN_SELCHANGE:单击鼠标选择了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息

       LBN_SETFOCUS:列表框获得输入焦点

       WM_CHARTOITEM:当列表框收到WM_CHAR 消息后, 向父窗口发送该消息, 只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息

       WM_VKEYTOITEM:当列表框收到WM_KEYDOWN 消息后,向父窗口发送该消息,只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息
 
Create成员函数的原型如下:



virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       参数rect指定了列表框的位置和尺寸,pParentWnd为父窗口的指针,nID用于指定列表框控件的ID。最后重点讲讲参数dwStyle,它指定了列表框控件的风格,以下是各种风格说明:



       LBS_EXTENDEDSEL:支持多重选择,在点击列表项时按住Shift 键或Ctrl 键即可选择多个项

       LBS_HASSTRINGS:指定一个含有字符串的自绘式列表框

       LBS_MULTICOLUMN:指定一个水平滚动的多列列表框, 通过调用CListBox::SetColumnWidth 来设置每列的宽度

       LBS_MULTIPLESEL:支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转

       LBS_NOINTEGRALHEIGHT:列表框的尺寸由应用程序而不是Windows 指定。通常,Windows指定尺寸会使列表项的某些部分隐藏起来

       LBS_NOREDRAW:当选择发生变化时防止列表框被更新,可发送消息改变该风格

       LBS_NOTIFY:当用户单击或双击鼠标时通知父窗口

       LBS_OWNERDRAWFIXED:指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度

       LBS_OWNERDRAWVARIABLE:指定自绘式列表框,并且列表项有不同的高度

       LBS_SORT:使插入列表框中的项按升序排列

       LBS_STANDARD:相当于指定了WS_BORDER|WS_VSCROLL|LBS_SORT

       LBS_USETABSTOPS:使列表框在显示列表项时识别并扩展制表符(‘\t’),默认的制表宽度是32 个对话框单位

       LBS_WANTKEYBOARDINPUT:允许列表框的父窗口接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以响应键盘输入

       LBS_DISABLENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条



       dwStyle可以是以上所列风格的组合。与其他控件一样,除了这些风格一般还要为列表框控件设置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等风格。一般创建单选列表框时,风格要设置为:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,如果不希望列表框项排序显示则应去掉LBS_STANDARD。创建多选列表框时,只需要在单选列表框风格后添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。
 CListBox类的主要成员函数



       int GetCount( ) const;

       返回值:返回列表框中列表项的数目,如果发生错误则返回LB_ERR。



       int GetSel(int nIndex) const;

       参数:nIndex指定某个列表项的索引。

       返回值:返回nIndex指定列表项的状态。如果此列表项被选择了则返回一个正值,否则返回0,若发生错误则返回LB_ERR。



       int SetSel(int nIndex,BOOL bSelect = TRUE);

       此函数只用于多选列表框,使用它可以选择或取消选择指定的列表项。

       参数:nIndex指定某个列表项的索引,若为-1则相当于指定了所有列表项。bSelect为TRUE时选择指定列表项,否则取消选择指定列表项。

       返回值:如果发生错误则返回LB_ERR。



       int AddString(LPCTSTR lpszItem);

       此函数用来向列表框中添加字符串。如果列表框指定了LBS_SORT风格,字符串就被以排序顺序插入到列表框中,如果没有指定LBS_SORT风格,字符串就被添加到列表框的结尾。

       参数:lpszItem指定了要添加的字符串。

       返回值:返回字符串在列表框中添加的位置。如果发生错误则返回LB_ERR,内存不够则返回LB_ERRSPACE。



       int InsertString(int nIndex, LPCTSTR lpszItem);

       该函数用来在列表框中的指定位置插入字符串。与AddString函数不同的是,InsertString函数不会导致LBS_SORT风格的列表框重新排序。不要在具有LBS_SORT风格的列表框中使用InsertString函数,以免破坏列表项的次序。

       参数:。参数nIndex 给出了插入位置(索引),如果值为-1,则字符串将被添加到列表的末尾。参数lpszItem 指定了要插入的字符串。

       返回值:返回实际的插入位置,若发生错误,会返回LB_ERR 或LB_ERRSPACE。



       int DeleteString(UINT nIndex);

       该函数用于删除指定的列表项。

       参数:nIndex 指定了要删除项的索引。

       返回值:函数的返回值为剩下的列表项数目,如果nIndex 超过了实际的表项总数,则返回LB_ERR。



       void ResetContent();

       该函数用于清除所有列表项。



       int GetText(int nIndex,LPTSTR lpszBuffer) const;

       void GetText(int nIndex,CString& rString) const;

       这两个成员函数用于获取指定列表项的字符串。参数nIndex 指定了列表项的索引。参数lpszBuffer 指向一个接收字符串的缓冲区。引用参数rString 则指定了接收字符串的CString对象。第一个版本的函数会返回获得的字符串的长度,若出错,则返回LB_ERR;第二个版本的函数则不会。



       int GetTextLen(int nIndex) const;

       该函数返回指定列表项的字符串的字节长度。

       参数:nIndex 指定了列表项的索引。

       返回值:若出错则返回LB_ERR。



       int GetCurSel() const;

       该函数仅适用于单选列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则函数返回LB_ERR。



       int SetCurSel(int nSelect);

       该函数仅适用于单选列表框,用来选择指定的列表项。该函数会滚动列表框以使选择项可见。参数nIndex 指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。



       int GetSelCount() const;

       该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR。



       int FindString(int nStartAfter,LPCTSTR lpszItem) const;

       该函数用于对列表项进行与大小写无关的搜索。参数nStartAfter 指定了开始搜索的位置,合理指定nStartAfter 可以加快搜索速度,若nStartAfter 为-1,则从头开始搜索整个列表。参数lpszItem 指定了要搜索的字符串。函数返回与lpszItem 指定的字符串相匹配的列表项的索引,若没有找到匹配项或发生了错误,则会返回LB_ERR。FindString 函数先从nStartAfter指定的位置开始搜索,若没有找到匹配项,则会从头开始搜索列表。只有找到匹配项,或对整个列表搜索完一遍后,搜索过程才会停止,所以不必担心会漏掉要搜索的列表项。



       int SelectString(int nStartAfter,LPCTSTR lpszItem);

       该函数仅适用于单选列表框,用来选择与指定字符串相匹配的列表项。该函数会滚动列表框以使选择项可见。参数的意义及搜索的方法与函数FindString 类似。如果找到了匹配的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR 并且当前的选择不被改变。
 

组合框控件:CComboBox类

组合框分为三种:简易(Simple)组合框、下拉式(Dropdown)组合框和下拉列表式(Drop List)组合框。
  组合框的通知消息:



       CBN_CLOSEUP:组合框的列表框组件被关闭,简易组合框不会发送该通知消息

       CBN_DBLCLK:用户在某列表项上双击鼠标,只有简易组合框才会发送该通知消息

       CBN_DROPDOWN:组合框的列表框组件下拉,简易式组合框不会发送该通知消息

       CBN_EDITUPDATE:在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不会发送该消息

       CBN_EDITCHANGE:编辑框的内容被用户改变了,与CBN_EDITUPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发送该消息

       CBN_ERRSPACE:组合框无法申请足够的内存来容纳列表项

       CBN_SELENDCANCEL:表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在组合框控件外单击鼠标时就会导致该消息的发送

       CBN_SELENDOK:用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用户确认了自己所作的选择

       CBN_KILLFOCUS:组合框失去了输入焦点

       CBN_SELCHANGE:用户通过单击或移动箭头键改变了列表的选择

       CBN_SETFOCUS:组合框获得了输入焦点
Create函数的原型如下:



virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       大家可以看出,CComboBox类的Create成员函数同前面几个控件类的Create成员函数非常类似,dwStyle指定组合框控件的风格,rect为列表框弹出后组合框的位置和尺寸,pParentWnd是指向父窗口的指针,不能为NULL,nID指定组合框控件的ID。最后还是重点讲讲dwStyle参数。组合框控件的风格包括以下几种,并给出了相应说明:



       CBS_AUTOHSCROLL:使编辑框组件具有水平滚动的风格

       CBS_DISABLENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条

       CBS_DROPDOWN:指定一个下拉式组合框

       CBS_DROPDOWNLIST:指定一个下拉列表式组合框

       CBS_HASSTRINGS:指定一个含有字符串的自绘式组合框

       CBS_LOWERCASE:将编辑框和列表框中的所有文本都自动转换为小写字符

       CBS_NOINTEGRALHEIGHT:组合框的尺寸由应用程序而不是Windows 指定,通常,由Windows指定尺寸会使列表项的某些部分隐藏起来

       CBS_OEMCONVERT:使编辑框组件中的正文可以在ANSI 字符集和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的

       CBS_OWNERDRAWFIXED:指定自绘式组合框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度

       CBS_OWNERDRAWVARIABLE:指定自绘式组合框,并且列表项有不同的高度

       CBS_SIIMPLE:指定一个简易组合框

       CBS_SORT:自动对列表框组件中的项进行排序

       CBS_UPPERCASE:将编辑框和列表框中的所有文本都自动转换为大写字符



       dwStyle参数可以是以上风格的组合。跟其他控件一样,创建时一般也还要指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_VSCROLL等风格。
 CComboBox类的主要成员函数



       int GetCount( ) const;

       获取组合框控件的列表框中列表项的数量。



       int GetCurSel( ) const;

       获取组合框控件的列表框中选中项的索引,如果没有选中任何项,该函数返回CB_ERR。



       int SetCurSel(int nSelect);

       在组合框控件的列表框中选择某项。nSelect参数指定了要选择的列表项的索引,如果为-1则列表框中当前选择项被取消选中,编辑框也被清空。



       DWORD GetEditSel( ) const;

       获取组合框控件的编辑框中当前选择范围的起始和终止字符的位置。该函数返回一个32位数,低16位存放起始位置,高16位存放选择范围后第一个非选择字符的位置。如果该函数用于下拉列表式组合框时,会返回CB_ERR。



       BOOL SetEditSel(int nStartChar,int nEndChar);

       用于在组合框控件的编辑框中选择字符。nStartChar参数指定起始位置,nEndChar参数指定终止位置。



       DWORD_PTR GetItemData(int nIndex) const;

       获取组合框中指定项所关联的32位数据。nIndex参数指定组合框控件的列表框某项的索引(从0开始)。



       int SetItemData(int nIndex,DWORD_PTR dwItemData);

       为某个指定的组合框列表项设置一个关联的32位数。nIndex参数指定要进行设置的列表项索引。dwItemData参数指定要关联的新值。



       void GetLBText(int nIndex,CString& rString) const;

       从组合框控件的列表框中获取某项的字符串。nIndex参数指定要获取字符串的列表项的索引,CString参数用于接收取到的字符串。



       int GetLBTextLen(int nIndex) const;

       获取组合框控件的列表框中某项的字符串长度。nIndex参数指定要获取字符串长度的列表项的索引。  



       int GetTopIndex( ) const;

       获取组合框控件的列表框中第一个可见项的索引。



       int SetTopIndex(int nIndex);

       将组合框控件的列表框中某个指定项设置为可见的。nIndex参数指定了该列表项的索引。该函数成功则返回0,有错误发生则返回CB_ERR。



       BOOL LimitText(int nMaxChars);

       用于限制用户在组合框控件的编辑框中能够输入的最大字节长度。nMaxChars参数指定了用户能够输入文字的最大字节长度,如果为0则长度被限制为65535个字节。



       int AddString(LPCTSTR lpszString);

       为组合框控件中的列表框添加新的列表项。lpszString参数是指向要添加的字符串的指针。该函数的返回值如果大于等于0,那么它就是新列表项的索引,而如果有错误发生则会返回CB_ERR,如果没有足够的内存存放新字符串则返回CB_ERRSPACE。



       int DeleteString(UINT nIndex);

       删除组合框中某指定位置的列表项。nIndex参数指定了要删除的列表项的索引。该函数的返回值如果大于等于0,那么它就是组合框中剩余列表项的数量。如果nIndex指定的索引超出了列表项的数量则返回CB_ERR。



       int FindString(int nStartAfter,LPCTSTR lpszString) const;

       在组合框控件的列表框中查找但不选中第一个包含指定前缀的列表项。nStartAfter参数指定了第一个要查找的列表项之前的那个列表项的索引。lpszString指向包含要查找的前缀的字符串。该函数的返回值如果大于等于0,那么它是匹配列表项的索引,如果查找失败则返回CB_ERR。



       int InsertString(int nIndex,LPCTSTR lpszString);

       向组合框控件的列表框中插入一个列表项。nIndex参数指定了要插入列表项的位置,lpszString参数则指定了要插入的字符串。该函数返回字符串被插入的位置,如果有错误发生则会返回CB_ERR,如果没有足够的内存存放新字符串则返回CB_ERRSPACE。



       int SelectString(int nStartAfter,LPCTSTR lpszString);

       在组合框控件的列表框中查找一个字符串,如果查找到则选中它,并将其显示到编辑框中。参数同FindString。如果字符串被查找到则返回此列表项的索引,如果查找失败则返回CB_ERR,并且当前选择项不改变。



       此外,CComboBox类还继承了CWnd类的成员函数GetWindowText、SetWindowText等。

 

滚动条控件:CScrollBar类

滚动条分为水平滚动条(Horizontal Scroll Bar)和垂直滚动条(Vertical Scroll Bar)两种。

从滚动条的创建形式来分,有标准滚动条和滚动条控件两种。像列表框和组合框设置了WS_HSCROLL 或WS_VSCROLL风格以后出现的滚动条,不是一个独立的窗口,而是这些窗口的一部分,这就是标准滚动条。而滚动条控件是一个独立的窗口,它可以获得焦点,响应某些操作。

  CScrollBar类的成员函数Create的函数原型如下:



virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       此函数与其他控件类的Create函数原型基本相同。参数dwStyle指定滚动条控件的风格,rect指定滚动条控件的位置和尺寸,pParentWnd为指向滚动条控件父窗口的指针,nID指定滚动条控件的ID。下面鸡啄米简单介绍几个主要的滚动条控件风格,更加具体的可以查阅MSDN。



       SBS_HORZ:指定滚动条为水平滚动条。如果没有指定SBS_BOTTOMALIGN或SBS_TOPALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。

       SBS_VERT:指定滚动条为垂直滚动条。如果没有指定SBS_RIGHTALIGN或SBS_LEFTALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。

       SBS_TOPALIGN:与SBS_HORZ配合使用。滚动条的上边缘与Create函数的rect参数指定矩形的上边缘对齐。滚动条高度为系统滚动条的默认高度。

       SBS_BOTTOMALIGN:与SBS_HORZ配合使用。滚动条的下边缘与Create函数的rect参数指定矩形的下边缘对齐。滚动条高度为系统滚动条的默认高度。

       SBS_LEFTALIGN:与SBS_VERT配合使用。滚动条的左边缘与Create函数的rect参数指定矩形的左边缘对齐。滚动条宽度为系统滚动条的默认宽度。

       SBS_RIGHTALIGN:与SBS_VERT配合使用。滚动条的右边缘与Create函数的rect参数指定矩形的右边缘对齐。滚动条宽度为系统滚动条的默认宽度。



       dwStyle参数可以是以上风格中某几个的组合,另外一般也会用到WS_CHILD、WS_VISIBLE风格。例如,创建一个水平滚动条控件,dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_HORZ,创建垂直滚动条控件时dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_VERT。
CScrollBar类的主要成员函数



       BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);



       获取的滚动条的参数信息,该信息为SCROLLINFO结构体的形式。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针。SCROLLINFO结构体的定义如下:



typedef struct tagSCROLLINFO {    

    UINT cbSize;         // 结构的尺寸(字节为单位)   

    UINT fMask;          // 说明结构中的哪些参数是有效的,可以是屏蔽值的组合,如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效   

    int  nMin;           // 滚动范围最小值,当fMask 中包含SIF_RANGE 时有效   

    int  nMax;           // 滚动范围最大值,当fMask 中包含SIF_RANGE 时有效   

    UINT nPage;          // 页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效   

    int  nPos;           // 滚动框的位置,当fMask 中包含SIF_POS 有效   

    int  nTrackPos;      // 滚动时滚动框的位置,当fMask 中包含SIF_TRACKPOS 时有效,该参数只能查询,不能设置,最好不要用该参数来查询拖动时滚动框的位置   

}   SCROLLINFO, *LPSCROLLINFO;    

typedef SCROLLINFO CONST *LPCSCROLLINFO;  

       参数nMask 的含义与SCROLLINFO 结构体中的fMask一样。该函数在获取信息成功则返回TRUE,否则返回FALSE。



       BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);



       用于设置滚动条的各种参数信息。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘。该函数操作成功则返回TRUE,否则返回FALSE。



       int GetScrollPos( ) const;



       获取滚动块的当前位置。如果失败则返回0。



       int SetScrollPos(int nPos, BOOL bRedraw = TRUE);



       将滚动块移动到指定位置。参数nPos指定了滚动块的新位置,参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。函数返回滚动框原来的位置,若操作失败则返回0。



       void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;



       获取滚动条的滚动范围。参数lpMinPos指向滚动条滚动范围的最小值,参数lpMaxPos指向滚动条滚动范围的最大值。



       void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);



       用于指定滚动条的滚动范围。参数nMinPos 和nMaxPos 分别指定了滚动范围的最小值和最大值,两者的差不得超过32767。当两者都为0 时,滚动条将被隐藏。参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。



       OnHScroll()与OnVScroll()函数



       无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息发送出去的。对这两个消息的默认处理函数是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生类中对这两个函数进行重载,以实现滚动功能。也就是说,假设在一个对话框中放入了一个水平滚动条,我们可以在对话框类中重载OnHScroll函数,并在OnHScroll函数中实现滚动功能。



       这两个函数的声明如下:



       afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);

       afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);



       参数nSBCode是通知消息码,主要通知码及含义的介绍下面已列出。nPos 是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义。如果通知消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar 为NULL。



       SB_BOTTOM/SB_RIGHT:滚动到底端(右端)

       SB_TOP/SB_LEFT:滚动到顶端(左端)

       SB_LINEDOWN/SB_LINERIGHT:向下(向右)滚动一行(列)

       SB_LINEUP/SB_LINELEFT:向上(向左)滚动一行(列)

       SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滚动一页

       SB_PAGEUP/SB_PAGELEFT:向上(向左)滚动一页

       SB_THUMBPOSITION:滚动到指定位置

       SB_THUMBTRACK:滚动框被拖动。可利用该消息来跟踪对滚动框的拖动

       SB_ENDSCROLL:滚动结束

 

图片控件:CStatic类

静态加载图片与动态加载图片

 

列表视图控件:ClistCtrl类

列表视图控件的列表项一般有图标(Icon)和标签(Label)两部分。图标是对列表项的图形描述,标签是文字描述。当然列表项可以只包含图标也可以只包含标签。
列表视图控件有4种风格:Icon、Small Icon、List和Report。下面简单说下4种风格各自的特点:



       Icon大图标风格:列表项的图标通常为32×32像素,在图标的下面显示标签。



       Small Icon小图标风格:列表项的图标通常为16×16像素,在图标的右面显示标签。



       List列表风格:与小图标风格类似,图标和文字的对齐方式不同。



       Report报表风格:列表视图控件可以包含一个列表头来描述各列的含义。每行显示一个列表项,通常可以包含多个列表子项。最左边的列表子项的标签左边可以添加一个图标,而它右边的所有子项则只能显示文字。这种风格的列表视图控件很适合做各种报表。
 
列表视图控件的通知消息:



       LVN_ITEMCHANGING 和LVN_ITEMCHANGED:当列表视图的状态发生变化时,会发送这两个通知消息。例如,当用户选择了新的列表项时,程序就会收到这两个消息。消息会附带一个指向NMLISTVIEW 结构的指针,消息处理函数可从该结构中获得状态信息。两个消息的不同之处在于,前者的消息处理函数如果返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变。



       LVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMLVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。



       LVN_BEGINLABELEDIT 和LVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑标题时发送。消息会附带一个指向NMLVDISPINFO结构的指针。在前者的消息处理函数中,可以调用GetEditControl成员函数返回一个指向用于编辑标题的编辑框的指针,如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMLVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText 为NULL,那么说明用户放弃了编辑,否则,程序应负责更新表项的标题,这可以由SetItem或SetItemText函数来完成。
列表视图控件的相关结构体:



1. NMHDR 结构体

typedef struct tagNMHDR {   

    HWND hwndFrom;     // 控件窗口的句柄   

     UINT_PTR idFrom;   // 控件ID   

    UINT code;         // 控件的通知消息码   

} NMHDR;  



2. LVITEM 结构体

该结构体包含了列表视图控件中列表项或列表子项的各种属性。

typedef struct _LVITEM {    

    UINT mask;           // 掩码位的组合(下面有对应掩码的元素都已在括号中标出掩码),表明哪些元素是有效的   

    int iItem;           // 列表项的索引   

    int iSubItem;        // 列表子项的索引   

    UINT state;          // 状态,下面会列出。(LVIF_STATE)   

    UINT stateMask;      // 状态掩码,用来说明要获取或设置哪些状态。下面会列出   

    LPTSTR pszText;      // 指向列表项或列表子项的标签字符串。(LVIF_TEXT)   

    int cchTextMax;      // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVIF_TEXT)   

    int iImage;          // 图标的索引。(LVIF_IMAGE)   

    LPARAM lParam;       // 32位的附加数据。(LVIF_PARAM)   

#if (_WIN32_IE >= 0x0300)   

    int iIndent;   

#endif   

#if (_WIN32_WINNT >= 0x501)   

    int iGroupId;   

    UINT cColumns; // tile view columns   

    PUINT puColumns;   

#endif   

#if (_WIN32_WINNT >= 0x0600)   

    int* piColFmt;   

    int iGroup;   

#endif   

} LVITEM, *LPLVITEM;  

 下面是state和stateMask的取值及含义:



        状态                     对应的状态掩码                   含义

        LVIS_CUT                     同左                 列表项或列表子项被选择用来进行剪切和粘贴操作

        LVIS_DROPHILITED      同左                 列表项或列表子项成为拖动操作的目标

        LVIS_FOCUSED            同左                 列表项或列表子项具有输入焦点

        LVIS_SELECTED           同左                 列表项或列表子项被选中



 3. LVCOLUMN 结构体

该结构体仅适用于Report报表式列表视图控件。在向列表控件中插入一列时需要用到此结构体。它包含了列表控件某列的各种属性。

typedef struct _LVCOLUMN {    

    UINT mask;              // 掩码位的组合(下面有对应掩码的元素都已在括号中标出掩码),表明哪些元素是有效的   

    int fmt;                    // 该列的表头和列表子项的标签正文显示格式,可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT。(LVCF_FMT)   

    int cx;                     // 以像素为单位的列的宽度。(LVCF_FMT)   

    LPTSTR pszText;    // 指向列表头标题正文的字符串。(LVCF_TEXT)   

    int cchTextMax;     // pszText指向缓冲区的字符的个数,包括字符串结束符。(LVCF_TEXT)   

    int iSubItem;          // 该列的索引。(LVCF_SUBITEM)   

#if (_WIN32_IE >= 0x0300)   

    int iImage;   

    int iOrder;   

#endif   

#if (_WIN32_WINNT >= 0x0600)   

    int cxMin;   

    int cxDefault;   

    int cxIdeal;   

#endif   

} LVCOLUMN, *LPLVCOLUMN;  



4. NMLISTVIEW 结构体

该结构体存放了列表视图控件通知消息的相关信息。列表视图控件的大部分通知消息都会附带指向该结构体的指针。



typedef struct tagNMLISTVIEW {   

    NMHDR hdr;       // 标准的NMHDR 结构   

     int iItem;       // 列表项的索引   

     int iSubItem;    // 列表子项的索引   

     UINT uNewState;  // 列表项或列表子项的新状态   

     UINT uOldState;  // 列表项或列表子项原来的状态   

     UINT uChanged;   // 取值与LVITEM的mask成员相同,用来表明哪些状态发生了变化   

     POINT ptAction;  // 事件发生时鼠标的客户区坐标   

     LPARAM lParam;   //32位的附加数据   

} NMLISTVIEW, *LPNMLISTVIEW;  





Create函数原型如下:



virtual BOOL Create(

   DWORD dwStyle,

   const RECT& rect,

   CWnd* pParentWnd,

   UINT nID 

);



       参数rect为列表视图控件的位置和尺寸,pParentWnd为指向父窗口的指针,nID指定列表视图控件的ID,最复杂的一个参数同样还是dwStyle,它用于设定列表视图控件的风格,可以是以下风格的组合:



               风格                                                含义

       LVS_ALIGNLEFT                        显示格式是大图标或小图标时,标签放在图标的左边

       LVS_ALIGNTOP                         显示格式是大图标或小图标时,标题放在图标的上边

       LVS_AUTOARRANGE                 显示格式是大图标或小图标时,自动排列控件中的列表项

       LVS_EDITLABELS                      用户可以修改标签文本

       LVS_ICON                                 指定大图标显示格式

       LVS_LIST                                  指定列表显示格式

       LVS_NOCOLUMNHEADER         在报表格式中不显示列的表头

       LVS_NOLABELWRAP                显示格式是大图标时,使标签文本单行显示。默认是多行显示

       LVS_NOSCROLL                       列表视图控件无滚动条,此风格不能与LVS_LIST或LVS_REPORT组合使用

       LVS_NOSORTHEADER              报表格式的列表视图控件的表头不能作为排序按钮使用

       LVS_OWNERDRAWFIXED        由控件的拥有者负责绘制表项

       LVS_REPORT                           指定报表显示格式

       LVS_SHAREIMAGELISTS           使列表视图共享图像序列

       LVS_SHOWSELALWAYS           即使控件失去输入焦点,仍显示出项的选择状态

       LVS_SINGLESEL                       指定只能有一个列表项被选中。默认时可以多项选择

       LVS_SMALLICON                      指定小图标显示格式

       LVS_SORTASCENDING             按升序排列列表项

       LVS_SORTDESCENDING          按降序排列列表项
CListCtrl类的主要成员函数



       UINT GetSelectedCount( ) const;



       该函数返回列表视图控件中被选择列表项的数量。



       POSITION GetFirstSelectedItemPosition( ) const;



       获取列表视图控件中第一个被选择项的位置。返回的POSITION值可以用来迭代来获取其他选择项,可以当作参数传入下面的GetNextSelectedItem函数来获得选择项的索引。如果没有被选择项则返回NULL。



       int GetNextSelectedItem(POSITION& pos) const;



       该函数获取由pos指定的列表项的索引,然后将pos设置为下一个位置的POSITION值。参数pos为之前调用GetNextSelectedItem或GetFirstSelectedItemPosition得到的POSITION值的引用。返回值就是pos指定列表项的索引。



       int GetItemCount( ) const;



       获取列表视图控件中列表项的数量。



       int InsertColumn(int nCol,const LVCOLUMN* pColumn );

       int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT,int nWidth = -1,int nSubItem = -1 );



       这两个函数用于在报表式列表视图控件中插入列。第一个函数中,nCol参数为插入列的索引,pColumn参数指向LVCOLUMN结构,其中包含了插入列的属性。第二个函数中,nCol参数也是插入列的索引,lpszColumnHeading参数为列标题字符串,nFormat参数为列中文本的对齐方式,可以是LVCFMT_LEFT、LVCFMT_RIGHT或LVCFMT_CENTER,nWidth参数为列宽,nSubItem为插入列对应列表子项的索引。两个函数在成功时都返回新列的索引,失败都返回-1。



       BOOL DeleteColumn(int nCol);



       该函数用于删除列表视图控件中的某列。参数nCol为删除列的索引。删除成功则返回TRUE,失败返回FALSE。



       int InsertItem(int nItem,LPCTSTR lpszItem);



       向列表视图控件中插入新的列表项。参数nItem为要插入项的索引,参数lpszItem为要插入项的标签字符串。如果插入成功则返回新列表项的索引,否则返回-1。



       BOOL DeleteItem(int nItem);



       从列表视图控件中删除某个列表项。参数nItem指定了要删除的列表项的索引。删除成功则返回TRUE,否则返回FALSE。



       CString GetItemText(int nItem,int nSubItem) const;



       获取指定列表项或列表子项的显示文本。参数nItem指定了列表项的索引,参数nSubItem指定了列表子项的索引。 



       BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText);



       设置指定列表项或列表子项的显示文本。参数nItem和nSubItem同GetItemText。参数lpszText为要设置的显示文本字符串。如果设置成功则返回TRUE,否则返回FALSE。



       DWORD_PTR GetItemData(int nItem) const;



       该函数用于获取指定列表项的附加32位数据。参数nItem为列表项的索引。返回值就是由nItem指定列表项的附加32位数据。



       BOOL SetItemData(int nItem,DWORD_PTR dwData);



       该函数用于为指定列表项设置附加32位是数据。参数nItem为列表项的索引,参数dwData为列表项的附加32位数据。

 

树形控件:CTreeCtrl类

树形控件的通知消息:



       TVN_SELCHANGING和TVN_SELCHANGED:在用户改变了对树节点的选择时,控件会发送这两个消息。消息会附带一个指向NMTREEVIEW结构的指针,程序可从该结构中获得必要的信息。两个消息都会在该结构的itemOld成员中包含原来的选择项信息,在itemNew成员中包含新选择项的信息,在action成员中表明是用户的什么行为触发了该通知消息(若是TVC_BYKEYBOARD则表明是键盘,若是TVC_BYMOUSE则表明是鼠标,若是TVC_UNKNOWN则表示未知)。两个消息的不同之处在于,如果TVN_SELCHANGING的消息处理函数返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变。



       TVN_KEYDOWN:该消息表明了一个键盘事件。消息会附带一个指向NMTVKEYDOWN结构的指针,通过该结构程序可以获得按键的信息。



       TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT:分别在用户开始编辑和结束编辑节点的标签时发送。消息会附带一个指向NMTVDISPINFO结构的指针,程序可从该结构中获得必要的信息。在前者的消息处理函数中,可以调用GetEditControl()成员函数返回一个指向用于编辑标题的编辑框的指针。如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑。在后者的消息处理函数中,NMTVDISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText为NULL,那么说明用户放弃了编辑,否则,程序应负责更新节点的标签,这可以由SetItem()或SetItemText()函数来完成。
树形控件的相关数据结构



 1. HTREEITEM句柄



       树形控件中的每个节点都可以由一个HTREEITEM类型的句柄表示。我们通过CTreeCtrl类的成员函数对树进行访问和操作时,很多时候都要用到HTREEITEM句柄。



2. TVITEM结构体



       TVITEM结构体描述了树形控件节点的属性,定义如下:



typedef struct tagTVITEM {   

    UINT mask;       // 包含一些掩码位(下面的括号中列出)的组合,用来表明结构的哪些成员是有效的   

    HTREEITEM hItem; // 树节点的句柄(TVIF_HANDLE)   

    UINT state;      // 树节点的状态(TVIF_STATE)   

    UINT stateMask;  // 状态的掩码组合(TVIF_STATE)   

    LPTSTR pszText;  // 树节点的标签文本(TVIF_TEXT)   

    int cchTextMax;  // 标签文本缓冲区的大小(TVIF_TEXT)   

    int iImage;      // 树节点的图像索引(TVIF_IMAGE)   

    int iSelectedImage;  // 选中项的图像索引(TVIF_SELECTEDIMAGE)   

    int cChildren;   // 表明节点是否有子节点,为1则有,为0则没有(TVIF_CHILDREN)   

    LPARAM lParam;   // 一个32 位的附加数据(TVIF_PARAM)   

} TVITEM, *LPTVITEM;  

       此结构体中多个元素涉及到了图像和状态等,有必要具体解释下。



       树形控件节点需要显示图标时,就要为树形控件关联一个图像序列,上面的iImage成员就代表了该结构体对应的树节点的图标在图像序列中的索引,iSelectedImage则代表该树节点被选中时显示的图标在图像序列中的索引。对于如何为树形控件关联图像序列,鸡啄米将在后面的实例中讲到。



       stateMask用来说明要获取或设置树节点的哪些状态。下面是state和stateMask的一些常用值及含义:



          state                            对应的stateMask                       含义         

       TVIS_CUT                          TVIS_CUT                        节点被选择用来进行剪切和粘贴操作

       TVIS_DROPHILITED           TVIS_DROPHILITED         节点成为拖动操作的目标

       TVIS_EXPANDED               TVIS_EXPANDED              节点的子节点被展开

       TVIS_EXPANDEDONCE      TVIS_EXPANDEDONCE     节点的子节点曾经被展开过

       TVIS_SELECTED                TVIS_SELECTED               节点被选中



       lParam在实际开发中常用来存放与树节点有关的附加数据。



 3. NMTREEVIEW结构体



       NMTREEVIEW结构体中包含了树形控件通知消息的相关信息。树形控件的大多数通知消息都会带有指向该结构体的指针。NMTREEVIEW结构体的定义如下:



typedef struct tagNMTREEVIEW {   

    NMHDR hdr;      // 标准的NMHDR结构   

    UINT action;    // 表明是用户的什么行为触发了该通知消息   

    TVITEM itemOld; // 原节点的属性   

    TVITEM itemNew; // 新节点的属性   

    POINT ptDrag;   // 事件发生时鼠标的客户区坐标   

} NMTREEVIEW, *LPNMTREEVIEW; 

 

 4. TVINSERTSTRUCT结构体



       向树形控件中插入新节点时需要用到TVINSERTSTRUCT结构体,它常与TVM_INSERTITEM消息一起使用。定义如下:

typedef struct tagTVINSERTSTRUCT {   

    HTREEITEM hParent;      // 父节点的句柄   

    HTREEITEM hInsertAfter; // 指明插入到同层中哪一项的后面   

#if (_WIN32_IE >= 0x0400)   

    union  

    {   

        TVITEMEX itemex;   

        TVITEM item;   

    } DUMMYUNIONNAME;   

#else   

    TVITEM item;            // 要添加的新节点的属性   

#endif   

} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;  

       若hParent成员为TVI_ROOT或NULL,那么新节点将被作为树的根节点插入。hInsertAfter除了可以是某个节点的句柄,还可以有四种取值:TVI_FIRST(插入到树形控件的最前面)、TVI_LAST(插入到树形控件的最后面)、TVI_ROOT(作为根节点插入)和TVI_SORT(按字母顺序插入)。



5. NMTVDISPINFO结构体



       NMTVDISPINFO结构体中包含了与树节点的显示有关的信息。定义如下:

typedef struct tagNMTVDISPINFO {   

    NMHDR hdr;   

    TVITEM item;   

} NMTVDISPINFO, *LPNMTVDISPINFO;  

 

Create成员函数的原型如下:



       virtual BOOL Create(

              DWORD dwStyle,

              const RECT& rect,

              CWnd* pParentWnd,

              UINT nID 

       );



       此函数的原型与前面讲到的所有控件类的Create函数都类似。dwStyle指定树形控件风格的组合,rect指定树形控件窗口的位置和大小,pParentWnd为指向树形控件父窗口的指针,nID指定树形控件的ID。下面还是主要讲讲树形控件的主要风格以及含义。



       TVS_DISABLEDRAGDROP:禁止树形控件发送TVN_BEGINDRAG通知消息,即不支持拖动操作

       TVS_EDITLABELS:用户可以编辑节点的标签文本

       TVS_HASBUTTONS:显示带有"+"或"-"的小方框来表示某项能否被展开或已展开

       TVS_HASLINES:在父节点与子节点间连线以更清晰地显示树的结构

       TVS_LINESATROOT:在根节点处连线

       TVS_SHOWSELALWAYS:即使控件失去输入焦点,仍显示出项的选择状态



       同样,动态创建树形控件时,除了能够指定上述风格的组合外,一般还要指定WS_CHILD和WS_VISIBLE风格。
CTreeCtrl类的主要成员函数



       CImageList* SetImageList(CImageList * pImageList,int nImageListType);



       如果树节点需要显示图标时,则必须先创建一个CImageList类的对象,并为其添加多个图像组成一个图像序列,然后调用SetImageList函数为树形控件设置图像序列,在用InsertItem插入节点时传入所需图像在图像序列中的索引即可。后面的例子中会演示。参数pImageList为指向图像序列类CImageList的对象的指针,若为NULL则删除树形控件的所有图像。参数nImageListType指定图像序列的类型,可以是TVSIL_NORMAL(普通图像序列)或TVSIL_STATE(状态图像序列,用图像表示节点的状态)。



       UINT GetCount( ) const;



       获取树形控件中节点的数量。



       DWORD_PTR GetItemData(HTREEITEM hItem) const;



       获取树形控件中某个指定节点的附加32位数据。参数hItem为指定的树节点的句柄。



       BOOL SetItemData(HTREEITEM hItem,DWORD_PTR dwData);



       为树形控件中某个指定节点设置附加的32位数据。参数hItem同上,dwData为要设置的32位数据。



       CString GetItemText(HTREEITEM hItem) const;



       获取树形控件中某个指定节点的标签文本。参数hItem同上。返回值是包含标签文本的字符串。



       BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);



       为树形控件中某个指定节点设置标签文本。参数hItem同上,lpszItem为包含标签文本的字符串的指针。



       HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;



       获取树形控件中某个指定节点的下一个兄弟节点。参数hItem同上。返回值是下一个兄弟节点的句柄。



       HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;



       获取树形控件中某个指定节点的上一个兄弟节点。参数hItem同上。返回值是上一个兄弟节点的句柄。



       HTREEITEM GetParentItem(HTREEITEM hItem) const;



       获取树形控件中某个指定节点的父节点。参数hItem同上。返回值是父节点的句柄。



       HTREEITEM GetRootItem( ) const;



       获取树形控件根节点的句柄。



       HTREEITEM GetSelectedItem( ) const;



       获取树形控件当前选中节点的句柄。



       BOOL DeleteAllItems( );



       删除树形控件中的所有节点。删除成功则返回TRUE,否则返回FALSE。



       BOOL DeleteItem(HTREEITEM hItem);



       删除树形控件中的某个节点。参数hItem为要删除的节点的句柄。删除成功则返回TRUE,否则返回FALSE。



       HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);



       在树形控件中插入一个新节点。参数lpszItem为新节点的标签文本字符串的指针,参数nImage为新节点的图标在树形控件图像序列中的索引,参数nSelectedImage为新节点被选中时的图标在图像序列中的索引,参数hParent为插入节点的父节点的句柄,参数hInsertAfter为新节点的前一个节点的句柄,即新节点将被插入到hInsertAfter节点之后。



       BOOL SelectItem(HTREEITEM hItem);



       选中指定的树节点。参数hItem为要选择的节点的句柄。若成功则返回TRUE,否则返回FALSE。

 

标签控件:CTabCtrl类

标签控件相当于是一个页面的容器,可以容纳多个对话框,而且一般也只容纳对话框,所以我们不能直接在标签控件上添加其他控件,必须先将其他控件放到对话框中,再将对话框添加到标签控件中。最终我们点击标签切换页面时,切换的不是控件的组合,而是对话框。

标签控件的通知消息



       在对标签控件进行一些操作,比如点击标签时,标签控件也会向父窗口发送一些通知消息。我们可以为这些通知消息添加处理函数,实现各种功能。标签控件的主要通知消息及含义如下所示:



       TCN_SELCHANGE:通知父窗口控件的标签选择项已经改变

       TCN_SELCHANGING 通知父窗口控件的标签选择项正在改变

       TCN_KEYDOWN:通知父窗口在控件范围内键盘被按下

       TCN_GETOBJECT:具有TCS_EX_REGISTERDROP扩展特性并且对象被拖动时的通知消息

       TCN_FOCUSCHANGE:通知父窗口控件的按钮聚焦已经改变

       NM_CLICK:通知父窗口用户在控件区域范围内点击了鼠标左键

       NM_RCLICK:通知父窗口用户在控件区域范围内点击了鼠标右键

       NM_RELEASEDCAPTURE:通知父窗口在控件区域范围内释放鼠标捕获消息



       标签控件的相关结构体



       标签控件在使用中也有一些相关的结构体经常用到,主要以下几个:



       1. TCITEMHEADER结构体



       该结构体用来指定或获取标签控件本身的属性。用在TCM_INSERTITEM、TCM_GETITEM和TCM_SETITEM消息中。



typedef struct tagTCITEMHEADER {      

    UINT mask;   // 掩码,可以为TCIF_IMAGE(iImage成员有效)、TCIF_RTLREADING、TCIF_TEXT(pszText成员有效)   

    UINT lpReserved1;   // 预留   

    UINT lpReserved2;   // 预留   

    LPTSTR pszText;     // 标签文本字符串   

    int cchTextMax;      

    int iImage;         // 图标在标签控件图像序列中的索引   

} TCITEMHEADER, *LPTCITEMHEADER;   

       2. TCITEM结构体



       该结构体用来指定或获取标签页的属性。用在TCM_INSERTITEM、TCM_GETITEM和TCM_SETITEM消息中。



typedef struct tagTCITEM {     

    UINT mask;  // 掩码,可以是TCIF_IMAGE(iImage成员有效)、TCIF_PARAM(lParam成员有效)、TCIF_RTLREADING、TCIF_STATE、TCIF_TEXT(pszText成员有效)   

#if (_WIN32_IE >= 0x0300)   

    DWORD dwState;   

    DWORD dwStateMask;   

#else   

    UINT lpReserved1;   

    UINT lpReserved2;   

#endif   

    LPTSTR pszText;   

    int cchTextMax;   

    int iImage;   

    LPARAM lParam;     // 与标签页关联的32位数据   

} TCITEM, *LPTCITEM;  

       3. TCHITTESTINFO结构体



       该结构体包含了鼠标单击测试的信息。



typedef struct tagTCHITTESTINFO {   

    POINT pt;  // 鼠标点击测试的客户区坐标   

    UINT flags; // 接收点击测试的结果。有以下几种:TCHT_NOWHERE(坐标点不在标签上)、TCHT_ONITEM(坐标点在标签上但不在标签文本或图标上)、TCHT_ONITEMICON(坐标点在标签图标上)、TCHT_ONITEMLABEL(坐标点在标签文本上)   

} TCHITTESTINFO, *LPTCHITTESTINFO;  

       4. NMTCKEYDOWN结构体



       该结构体包含了标签控件中键盘按下的相关信息。主要用在TCN_KEYDOWN通知消息中。



typedef struct tagNMTCKEYDOWN {   

    NMHDR hdr;   

    WORD wVKey;   

    UINT flags;   

} NMTCKEYDOWN;  
Create函数的原型如下:



virtual BOOL Create(

  DWORD dwStyle,

  const RECT& rect,

  CWnd* pParentWnd,

  UINT nID 

);



       参数dwStyle为标签控件的风格,rect为标签控件的位置和大小,pParentWnd为指向标签控件父窗口的指针,nID指定标签控件的ID。这里还是要具体说下dwStyle,下面列出了几种主要的控件风格:



       TCS_BUTTONS:标签(控件上部用来选择标签页的位置)外观为按钮风格,且整个控件周围没有边框。



       TCS_FIXEDWIDTH :所有标签具有相同的宽度。



       TCS_MULTILINE:标签以多行显示,如果需要,可以显示所有标签。



       TCS_SINGLELINE:只显示一行标签,用户可以滚动着看其他标签。



       TCS_TABS:标签以普通标签样式显示,且整个控件周围有边框。



       如果想了解标签控件的所有风格,可以查阅MSDN。



       CTabCtrl类的主要成员函数



       int GetCurSel( ) const;



       获取标签控件中当前选择标签的索引。如果成功则返回选择标签的索引,否则返回-1。



       BOOL GetItem(int nItem,TCITEM* pTabCtrlItem) const;



       获取标签控件中某个标签的信息。参数nItem为标签索引,pTabCtrlItem为指向TCITEM结构体的指针,用来接收标签信息。若获取成功返回TRUE,否则返回FALSE。



       int GetItemCount( ) const;



       获取标签控件中标签的数量。



       int SetCurSel(int nItem);



       在标签控件中选择某标签。参数nItem为要选择的标签的索引。如果成功则返回之前选择标签的索引,否则返回-1。



       BOOL SetItem(int nItem,TCITEM* pTabCtrlItem);



       设置某标签的所有或部分属性。参数nItem为标签的索引,pTabCtrlItem为指向TCITEM结构体的指针,包含了新的标签属性。成功则返回TRUE,否则返回FALSE。



       BOOL DeleteAllItems( );



       删除标签控件中所有标签。



       BOOL DeleteItem(int nItem);



       删除标签控件中的某个标签。参数nItem为要删除标签的索引。



       LONG InsertItem(int nItem,LPCTSTR lpszItem);



       在标签控件中插入新的标签。参数nItem为新标签的索引,lpszItem为标签文本字符串。如果插入成功则返回新标签的索引,否则返回-1。

你可能感兴趣的:(mfc)