|
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:oDataExchange(CDataExchange* pDX)
{
CDialog:oDataExchange(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"); |
|