MFC常用控件-CEdit ,CTreeCtrl,CComboBox等控件

 

1.最近几天自己写了一个日志管理软件(为自己使用的),主要的记录每天个人的一些情况,如作息时间,做了些什么事,和一些总结,心得体会等. 但在实现的过程中,由于有好几个月没有用VC++编了,有些控件的使用都不太熟悉了,所以在这里使用到的通用控件的使用方法在这里总结一下.
 
(a) CEdit控件
          这个控件主要是文本输入,如用户名,密码;
          CEdit常用属性使用说明:
          Multiline:   选中这个这属性,表示可以支持多行输入;
          Want return:     表示支持换行;
          Read-only: 选择中,表示只能读,不能修改,文本框为灰色;
          Password: 表示接受的是密码.但显示是***;
          Vertical scroll:表示支持垂直滚动条;
 
          常用函数说明:
          BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
          dwStyle: 表示控件style 常用常使用这几个WS_CHILD , WS_VISIBLE,WS_TABSTOP
          Rect:是一个矩形结构,表示文本框的大小;
          pParentWnd: 父窗口指针;
          nID: 给这个Edit分配的ID号;
 
          BOOL SetReadOnly( BOOL bReadOnly = TRUE ); 设置是否只读;
 
          其他就不介绍了,根据你要实现的功能看看msdn就行了;
 
(b) CComboBox控件
 
又称作组合框控件,其有三种形态可供选择,
1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).
       CComboBox控件的常用设置属性说明:
type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist为静态控件.
       Data属性: 当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,
       Sort属性: 对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.
       控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数
 
 1.GetCount() 函数:
 用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面)下面的例子是程序中各个按钮里面的代码
              int i;
              CString str;
              i=m_cbox.GetCount();
              str.Format ("%d",i);
              m_end="一共有"+str+"个数据";
               UpdateData(FALSE);
 
 2.GetCurSel() 函数:
 用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1   
       Int GetCurSel() const
       int i;
       CString str;
       i=m_cbox.GetCurSel ();
       str.Format ("%d",i+1);
       if (i==-1) m_end="你什么都没有选";
       else m_end="你选的是第"+str+"项";
       UpdateData(FALSE);
 
 3.SetCurSel函数:
 选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;
       if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量 用以计数
       else
       {
            m_cbox.SetCurSel (-1);
            m_i=0;
        }
 
4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar );                    
nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.
       m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果
                        //其作用就是选中第3到第5个字符作为热点
 
5.LimitText()函数.
其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节
 
6.GetLBText()函数.
其原型为void GetLBText( int nIndex, CString&rString ).
nIndex为列表框中数据的索引值,
rString 为字符串,其作用就是把索引号为
nIndex的数据放到
rString变量中.
与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为
nIndex中数据的长度
          m_cbox.GetLBText (2,m_end); // GetLBText按钮
          UpdateData(0);
          CString str; //GetLBTextLen按钮
          int i=m_cbox.GetLBTextLen (2);
          str.Format ("%d",i);
          m_end=str;
          UpdateData(FALSE);
 
 7.AddString() DeleteString() InsertString() ResetContent()
       四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.
 
 8.SetDroppedWidth(UINT nWidth)
       函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.
 
 
 (c) radio button
 
       常用属性介绍:
       经常使用到的属性就是group 和 tab stop了
       这两个属性是一起使用的,可以把几个radio button归为一组.方法是根据tab-order,把要归为一起的那几个radio button的tab order连续,把第一个设为group属性,取消掉tab stop属性,然后把最后一个radio button取消掉group ,勾上tab stop属性就成功了.这样弄的功能是把它们都关联起来,当选择其中一个,其它的会取消选中.
一般的radio button 都是默认的为 auto,在同为一组的时候点另一个会取消先前选中的那个。
       若要实现你所说的过程,需要取消 auto 属性。
       再为你的这个radio button 添加一个 CButton 类的变量,假设ID为ID_RADIO1,变量名为m_radio1。
      
       不过通过类向导好像无法添加,这时可以手动添加:
       //头文件
       DDX_Control(pDX, IDC_RADIO1,m_radio1);//手动添加的部分
      
       //.cpp文件
       在CPP文件中的DoDataExchange函数中添加如下代码:
       void CTestDlg::DoDataExchange(CDataExchange* pDX)
       {
              CDialog::DoDataExchange(pDX);
              //{{AFX_DATA_MAP(CTestDlg)
              DDX_Control(pDX, IDC_RADIO1,m_radio1);//手动添加的部分
              //}}AFX_DATA_MAP
       }
      
       这样可以完成了变量和radio button关联;
 
       设置radio button 状态可以使用这个函数SetCheck(int n);
       n = 0;表示不选
       n = 1;表示选择
       n = 2;没有用过,不知道.
 
 (d) CTreeCtrl树控件:
 
       我使用这个控件主要是列出自己过去些好了的日志,自己可以通过树控件快速访问以前写的日志;
       这里主要介绍一些常用的函数:
      
       InsertItem()函数,功能是插入一个数节点.它的原型如下:
       HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
 
       HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter );
 
       HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );
 
       HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
 
       这里以:
       HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
       这个为例:
 
       lpsezItem: 表示该节点显示时的名称;
       nImage    : 表示结点没被选中时所使用图片序号
       nSelectedImage :为结点被选中时所使用图片序号。
       hParent :代表父结点的句柄
       hInsertAfter: 当前添加的结点会排在hInsertAfter表示的结点的后面, 默认值是最后面;
 
       使用小图标时,要使用CTreeCtrl类的成员函数CImageList* SetImageList( CImageList * pImageList, int nImageListType ),指明当前控件所使用的图像列表(ImageList),nImageListType为TVSIL_NORMAL。
 
       此外CTreeCtrl还提供了一些函数用于得到/修改控件的状态:
 
         ·HTREEITEM GetSelectedItem( )将返回当前选中的结点的句柄;
 
         ·BOOL SelectItem( HTREEITEM hItem )将选中指明结点;
 
         ·BOOL GetItemImage( HTREEITEM hItem, int& nImage, int& nSelectedImage )
       BOOL SetItemImage( HTREEITEM hItem, int nImage, int nSelectedImage )
       用于得到/修改某结点所使用图标索引;
 
         ·CString GetItemText( HTREEITEM hItem ) /BOOL SetItemText( HTREEITEM hItem, LPCTSTR lpszItem )
       用于得到/修改某一结点的显示字符;
 
         ·BOOL DeleteItem( HTREEITEM hItem )用于删除某一结点,BOOL DeleteAllItems( )将删除所有结点。
      
     此外如果想遍历树可以使用下面的函数:
 
         ·HTREEITEM GetRootItem( )得到根结点;
 
         ·HTREEITEM GetChildItem( HTREEITEM hItem )得到子结点;
 
      ·HTREEITEM GetPrevSiblingItem/GetNextSiblingItem( HTREEITEM hItem )
       得到指明结点的上/下一个兄弟结点;
 
         ·HTREEITEM GetParentItem( HTREEITEM hItem )得到父结点。
 
  树形控件的消息映射使用ON_NOTIFY宏,形式如同:
       ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,
       memberFxn为处理函数,函数的原型如同void OnXXXTree(NMHDR* pNMHDR,LRESULT* pResult),
       其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于树形控件可能取值和对应的数据结构为:
 
         ·TVN_SELCHANGED 在所选中的结点发生改变后发送,所用结构:NMTREEVIEW;
 
         ·TVN_ITEMEXPANDED 在某结点被展开后发送,所用结构:NMTREEVIEW;
 
         ·TVN_BEGINLABELEDIT 在开始编辑结点字符时发送,所用结构:NMTVDISPINFO;
 
         ·TVN_ENDLABELEDIT 在结束编辑结点字符时发送,所用结构:NMTVDISPINFO;
 
         ·TVN_GETDISPINFO 在需要得到某结点信息时发送,(如得到结点的显示字符)所用结构:NMTVDISPINFO;
 
 (e) 日期控件:COleDateTime,
       GetCurrentTime( );
       获得当前时间;
 
       int SetDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec );
       设置日期和时间
 
       int SetDate( int nYear, int nMonth, int nDay );
       设置日期
 
       int SetTime( int nHour, int nMin, int nSec );
       设置时间
 
       CString Format( LPCTSTR lpszFormat ) const;
       把日期时间格式化到字符串中
       形式有:
       %H: 小时
       %M: 分钟
       %S: 秒
       %Y: 年
       %m: 月
       %d: 日
      
       Get之类的函数就不介绍了.比较简单,看看msdn就行了.
 
       msdn:上的完整说明:
       %a
       Abbreviated weekday name
 
       %A
       Full weekday name
 
       %b
       Abbreviated month name
 
       %B
       Full month name
 
       %c
       Date and time representation appropriate for locale
 
       %d
       Day of month as decimal number (01 – 31)
 
       %H
       Hour in 24-hour format (00 – 23)
 
       %I
       Hour in 12-hour format (01 – 12)
 
       %j
       Day of year as decimal number (001 – 366)
 
       %m
       Month as decimal number (01 – 12)
 
       %M
       Minute as decimal number (00 – 59)
 
       %p
       Current locale’s A.M./P.M. indicator for 12-hour clock
 
       %S
       Second as decimal number (00 – 59)
 
       %U
       Week of year as decimal number, with Sunday as first day of week (00 – 53)
 
       %w
       Weekday as decimal number (0 – 6; Sunday is 0)
 
       %W
       Week of year as decimal number, with Monday as first day of week (00 – 53)
 
       %x
       Date representation for current locale
 
       %X
       Time representation for current locale
 
       %y
       Year without century, as decimal number (00 – 99)
 
       %Y
 
       Year with century, as decimal number
 
       %z, %Z
       Time-zone name or abbreviation; no characters if time zone is unknown
 
       %%
       Percent sign
 
       在这里还会涉及把字符串转换成时间格式,可以这样做:
 
       CTime m_StartTime1 = CTime::GetCurrentTime();
       CString csStartTime = m_StartTime1.Format( "%Y%m%d%H%M%S" );
 
       使用sprintf及sscanf函数进行CString与CTime之间的转换
 
       一.将CString转为CTime的几种方法
 
       CString    timestr    =    "2000年04月05日";  
       int    a,b,c    ;  
       sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);  
       CTime    time(a,b,c,0,0,0);    
 
       CString    s("2001-8-29    19:06:23");  
       int nYear,nMonth, nDate, nHour,nMin,nSec;  
       sscanf(s,"%d-%d-%d   %d:%d:%d", &nYear, &nMonth, &nDate, &nHour, &nMin,&nSec);  
       CTime   t(nYear, nMonth ,nDate, nHour, nMin, nSec);
 
       二.将CTIme转换为CString的方法:
       CTime   tmSCan = CTime::GetCurrentTime();
 
       CString szTime = tmScan.Format("''%Y-%m-%d %H:%M:%S''");
 
       这样得到的日期时间字符串就是以"2006-11-27 23:30:59"的格式.这是不是很方便呢?
 
       //取得CTime中的日期
       CString cstrDate = tmScan.Format("%Y-%m-%d");
 
       //取得CTime中的时间
       CString cstrTime = tmScan.Format("%H:%M-%S");

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/c++/cppsl/20071128/87957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值