char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使用CString::format进行。例如:
char chArray[] = "This is a test";
char * p = "This is a test";
或
LPSTR p = "This is a test"; 或在已定义Unicode应的用程序中
TCHAR * p = _T("This is a test"); 或
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.format(_T("%s"), chArray);
theString = p;
2、CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一,使用强制转换。例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用strcpy。例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString); 需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
方法三,使用CString::GetBuffer。例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer(); // 使用完后及时释放,以便能使用其它的CString成员函数
posted @
2007-08-03 17:05 乔栋 阅读(350) |
评论 (0) |
编辑 收藏
1
WORD wVersionRequested = MAKEWORD(1, 1);
2
WSADATA wsaData;
3
int err = WSAStartup(wVersionRequested, &wsaData);
4
if (err != 0)
5
{
6
WSACleanup();
7
}
posted @
2007-07-22 20:56 乔栋 阅读(1231) |
评论 (0) |
编辑 收藏
MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。
由MySQL支持的列类型列在下面。下列代码字母用于描述中:
M
指出最大的显示尺寸。最大的合法的显示尺寸是 255 。
D
适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。
方括号(“[”和“]”)指出可选的类型修饰符的部分。
注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
这是INT的一个同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到
18446744073709551615。注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,因此你不应该使用大于9223372036854775807(63位)的有符号大整数,除了位函数!注意,当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数),如果结果大于9223372036854775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数,其精度可以是<=24,对一个双精度浮点数,是在25 和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数位数是未定义的。在MySQL3.23中,这是一个真正的浮点值。在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。
FLOAT[(M,D)] [ZEROFILL]
一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。
DOUBLE[(M,D)] [ZEROFILL]
一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
这些是DOUBLE同义词。
DECIMAL[(M[,D])] [ZEROFILL]
一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数点,并且对于负数,“-”符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。注意,在MySQL3.22里,M参数包括符号和小数点。
NUMERIC(M,D) [ZEROFILL]
这是DECIMAL的一个同义词。
DATE
一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。
DATETIME
一个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。
TIMESTAMP[(M)]
一个时间戳记。范围是'1970-01-01 00:00:00'到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。
TIME
一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。
YEAR[(2|4)]
一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。)
CHAR(M) [BINARY]
一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。
[NATIONAL] VARCHAR(M) [BINARY]
一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。 VARCHAR是CHARACTER VARYING一个缩写。
TINYBLOB
TINYTEXT
一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。
BLOB
TEXT
一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。
MEDIUMBLOB
MEDIUMTEXT
一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。
LONGBLOB
LONGTEXT
一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。
ENUM('value1','value2',...)
枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。
SET('value1','value2',...)
一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。
posted @
2007-07-19 14:42 乔栋 阅读(387) |
评论 (0) |
编辑 收藏
|
 |
C程序设计教程 |
(美)H.M.Deitel等著 薛万鹏等译 / 2000年7月 / 机械工业出版社 / 33元 / 787*1092 1/16 / |
|
|
|
 |
C陷阱与缺陷 |
Andrew Koenig著 高巍译 / 2002年11月 / 人民邮电出版社 / 30元 / 720*980 1/16 / |
|
|
|
 |
C语言参考手册(原书第5版) |
(美)Samuel P.Harbison III/Guy L.Steele Jr.著 邱仲潘等译 / 2003年8月 / 机械工业出版社 / 39元 / 787*1092 1/16 / |
|
|
|
 |
C专家编程 |
Peter Van Der Linden著 徐波译 / 2002年12月 / 人民邮电出版社 / 40元 / 800*1000 1/16 / |
|
|
|
 |
C程序设计语言(第2版·新版)习题解答 |
[美]汤朵,[美]吉米拜尔 著,杨涛等 译 / 01 1 2004 12:00AM / 机械工业出版社 / 15元 / 787*1092 1/16 / |
|
|
|
 |
C程序设计语言(第2版·新版) |
(美)克尼汉,(美)里奇 著,徐宝文,李志 译 / 01 1 2004 12:00AM / 机械工业出版社 / 30元 / 787*1092 1/16 / |
|
|
|
 |
C程序设计语言 |
Brian W.Kernighan / 1997年3月 / 清华大学出版社 / 0元 / 850*1168 1/32 / |
|
posted @
2007-06-07 09:56 乔栋 阅读(653) |
评论 (0) |
编辑 收藏
Edit<输入框>
1.(CWnd *)GetDlgItem(IDC_EDIT_1))->SetWindowText("0");
2.int n=GetDlgItemInt(IDC_EDIT_1, NULL,true);
3.(CWnd *)GetDlgItem(IDC_EDIT_1))->GetWindowText(cs);
Combox<下拉框>
1.((CComboBox *)GetDlgItem(IDC_COMB_1))->SetCurSel(1);
2. GetDlgItemText(IDC_COMB_1, cs, 50);
3.int i=m_COM.GetCurSel();
m_COM.GetLBText(i,cs);
4.m_COM.AddString(cs);m_COM.DeleteString(0);m_COM.SetCurSel(0);
Radio<单选按钮>
1.((CButton *)GetDlgItem(IDC_RADIO_1))->SetCheck(true);

2.if (((CButton *)GetDlgItem(IDC_RADIO_1))->GetCheck())
{}
3.((CButton *)GetDlgItem(IDC_RADIO_1))->SetCheck(true);
List Control<列表>
1.m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_list2.InsertColumn(0,"TagID",LVCFMT_LEFT,60);
m_list2.InsertColumn(1,"TagType",LVCFMT_CENTER,120);
m_list2.InsertItem(i,cs1);
m_list2.SetItemText(i,1,cs2);
2.if(m_list2.GetSelectedItem()!=-1)

{
int i=m_list2.GetSelectionMark();
cs=m_list2.GetItemText(i,0);
}
3.int i=m_List2.GetItemCount();
4.m_list2.DeleteItem(i);m_list2.DeleteAllItems();
ListBox<列表框>
1.((CListBox *)listBox)->InsertString(0, str);
Button<按钮>
1.((CWnd *)GetDlgItem(IDC_BUTTON_1))->ShowWindow(true);
2.((CWnd *)GetDlgItem(IDC_BUTTON_1))->EnableWindow(true);
posted @
2007-06-04 23:18 乔栋 阅读(513) |
评论 (0) |
编辑 收藏
在Windwos Xp下,要安装Sql或sp补丁以及其他软件,尤其是微软自己的软件的时候,系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:
到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
删除PendingFileRenameOperations
再重新安装就可以了.
posted @
2007-05-28 12:26 乔栋 阅读(474) |
评论 (0) |
编辑 收藏
最近看完了《千年一叹》,重新买了两本余秋雨老师的书:《行者无疆》《霜冷长河》
正在看霜冷长河,觉得很好看。
posted @
2007-05-23 10:45 乔栋 阅读(233) |
评论 (0) |
编辑 收藏
摘要: 1
1 // UseResourceDllView.cpp : implementation of the CUseResourceDllView &...
阅读全文
posted @
2007-04-24 12:00 乔栋 阅读(590) |
评论 (0) |
编辑 收藏
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。
一、创建动态控件:
为了对照,我们先来看一下静态控件的创建。
放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
静态控件不需要调用Create()函数来创建。
而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程:
1.建立控件ID号:
ID号是控件的标识,创建控件前必须先为它设置一个ID号。
打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
2.建立控件对象:
不同种类的控件应创建不同的类对象:
·按钮控件 CButton (包括普通按钮、单选按钮和复选按钮)
·编辑控件 CEdit
·静态文本控件 CStatic
·标签控件 CTabCtrl
·旋转控件 CSpinButtonCtrl
·滑标控件 CSliderCtrl
·多信息编辑控件 CRichEditCtrl
·进度条控件 CProgressCtrl
·滚动条控件 CSrcollBar
·组合框控件 CComboBox
·列表框控件 CListBox
·图像列表控件 CImageCtrl
·树状控件 CTreeCtrl
·动画控件 CAnimateCtrl
本例中我们创建一个CButton类的普通按钮。注意不能直接定义CButton对象,如:CButton m_MyBut;这种定义只能用来给静态控件定义控制变量,不能用于动态控件。
正确做法是用new调用CButton构造函数生成一个实例:
CButton *p_MyBut = new CButton(); |
然后用CButton类的Create()函数创建,该函数原型如下:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); |
lpszCaption是按钮上显示的文本;dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:
窗口风格:
·WS_CHILD 子窗口,必须有
·WS_VISIBLE 窗口可见,一般都有
·WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用
·WS_TABSTOP 可用Tab键选择
·WS_GROUP 成组,用于成组的单选按钮中的第一个按钮
按钮风格:
·BS_PUSHBUTTON 下压式按钮,也即普通按钮
·BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
·BS_RADIOBUTTON 单选按钮,不常用
·BS_AUTOCHECKBOX 含自动选中状态的复选按钮
·BS_CHECKBOX 复选按钮,不常用
·BS_AUTO3STATE 含自动选中状态的三态复选按钮
·BS_3STATE 三态复选按钮,不常用
以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。
·BS_BITMAP 按钮上将显示位图
·BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮
·rect指定按钮的大小和位置;
·pParentWnd指示拥有按钮的父窗口,不能为NULL;
·nID指定与按钮关联的ID号,用上一步创建的ID号。
不同控件类的Create()函数略有不同,可参考相关资料。
例:p_MyBut->Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );
这样,我们就在当前对话框中的(20,10)处创建了宽60,高30,按钮文字为“动态按钮”的下压式按钮。
为了使创建过程更方便易用,我定义了如下函数:
CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle) { CString m_Caption; m_Caption.LoadString( nID ); //取按钮标题 CButton *p_Button = new CButton(); ASSERT_VALID(p_Button); p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //创建按钮 return p_Button; } |
其中m_Caption.LoadString( nID )是从字符串表中读取按钮文本,这样在创建按钮ID时,应该把文本设置好,参数nStyle为除必须风格外的额外风格。
以下,我调用该函数创建三个按钮,并指定第一个按钮为默认按钮,按钮的ID已预先设置好了:
CButton *p_MyBut[3]; p_MyBut[0] = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON ); p_MyBut[1] = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 ); p_MyBut[2] = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 ); |
二、动态控件的响应:
动态控件的响应函数不能用ClassWizard添加,只能手动添加。仍以上面的按钮为例,我们制作按钮的单击响应函数。
1.在MESSAGE_MAP中添加响应函数:
MESSAGE_MAP表中定义了消息响应函数,其格式为:消息名(ID,函数名),当我们用ClassWizard添加函数时,会自动添加在AFX_MSG_MAP括起的区间内,如:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) //{{AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) //}}AFX_MSG_MAP END_MESSAGE_MAP() |
手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不能正常工作,如:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) //{{AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) //}}AFX_MSG_MAP ON_BN_CLICKED(ID_MYBUT1, OnMybut1) ON_BN_CLICKED(ID_MYBUT2, OnMybut2) ON_BN_CLICKED(ID_MYBUT3, OnMybut3) END_MESSAGE_MAP() |
其中ON_BN_CLICKED是按钮单击消息。
2.在头文件中添加函数定义:
用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如:
protected: //{{AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); //}}AFX_MSG DECLARE_MESSAGE_MAP() |
我们模仿这种形式,只是把函数定义添加到AFX_MSG区间外就行了:
protected: //{{AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); //}}AFX_MSG afx_msg void OnMybut1(); afx_msg void OnMybut2(); afx_msg void OnMybut3(); DECLARE_MESSAGE_MAP() |
3.编写消息响应函数:
以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成:
void CTextEditorView::OnMybut1() { MessageBox( "哈!你单击了动态按钮。" ); } void CTextEditorView::OnMybut2() { …… } void CTextEditorView::OnMybut3() { …… } |
除了按钮的响应函数外,你还可以用上面获得的指针访问按钮,如:
修改按钮的大小和位置:p_MyBut[0]->MoveWindow(……);
修改按钮文本:p_MyBut[0]->SetWindowText(……);
显示/隐藏按钮:p_MyBut[0]->ShowWindow(……);等等。
三、回收资源:
由于动态控件对象是由new生成的,它不会被程序自动释放,所以需手工释放。在控件不再使用时可以删除它:
if( p_MyBut[0] ) delete p_MyBut[0]; |
以上就是按钮控件动态生成的方法。下面,再看一下单选按钮的动态生成问题。 四、实例:单选按钮组的动态生成
单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别。
假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态。
我们先来看静态制作方法:在对话框中放置三个单选按钮,设置属性如下:
·Radio1属性:Visible、Group、Tab stop、Auto
·Radio2属性:Visible、Tab stop、Auto
·Radio3属性:Visible、Tab stop、Auto
这样的属性设置就把三个单选按钮分成了一组,它们一次只能有一个被选中,若对话框中还有其它成组的单选按钮,使用时也会互不干扰。但这时还没有使第一个按钮处于选中状态。
接着就用ClassWizard为这组单选按钮添加变量,这里只需为第一个单选按钮添加变量即可。设变量名为m_Radio,类型选为int型。在构造函数中ClassWizard把m_Radio的值设置为-1,我们把它改为0,这样在运行程序时可以看到第一个单选按钮处于选中状态了。之后,还应该用ClassWizard为三个单选按钮添加单击响应函数,在里面修改m_Radio的值对应三个单选按钮就可以了。
以上就是通常制作单选按钮组的办法,现我们欲改为动态生成,主要要解决按钮分组和单击控制问题。以下为制作步骤:
1.定义三个单选按钮的ID:
打开资源中的“String Table”,在其中添加三个ID值:
·第一个:ID为IDC_MYRADIO1,Caption为单选1
·第二个:ID为IDC_MYRADIO2,Caption为单选2
·第三个:ID为IDC_MYRADIO3,Caption为单选3
其中Caption为按钮上要显示的文字,可根据需要设置。
2.用CButton类的Create()函数生成三个单选按钮:
为方便起见,先定义一个函数生成单选按钮:
CButton* CTextEditorView::NewMyRadio(int nID,CRect rect,int nStyle) { CString m_Caption; m_Caption.LoadString( nID ); //取按钮标题 CButton *p_Radio = new CButton(); ASSERT_VALID(p_Radio); p_Radio->Create( m_Caption, WS_CHILD | WS_VISIBLE | nStyle | WS_TABSTOP | BS_AUTORADIOBUTTON, rect, this, nID ); //创建按钮 return p_Radio; } |
函数LoadString()用于从“String Table”中读取按钮文本,Create()函数中设定了单选按钮必须的属性,其中就包括了Visible、Tab stop、Auto属性。
参数nID为单选按钮ID号,rect为单选按钮尺寸,nStyle为除必要属性外的其它属性。返回值为指向新建按钮的指针。
有了这个函数后,创建单选按钮组时只要依次调用该函数即可,其中单选按钮组的第一个单选按钮必须指定WS_GROUP属性。
CButton *p_MyRadio[3]; p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP ); p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 ); p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 ); |
3.定义单选按钮组的控制变量,设置第一个单选按钮为选中状态:
这里不能用ClassWizard添加变量,也不要在DoDataExchange()中添加控制变量,因为动态控件一开始并不存在,在DoDataExchange()中添加控制变量会造成运行错误。这里我们只需在头文件中随意定义一个int型变量作为控制变量即可,如:
在构造函数中设置其初值为0:m_SelRadio = 0;
在上面的创建按钮的语句中,用SetCheck()函数设置初始选中的按钮:
CButton *p_MyRadio[3]; p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP ); p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 ); p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 ); p_MyRadio[m_SelRadio]->SetCheck(1); //设置第一个单选为选中状态 |
在SetCheck()函数中,参数为1表示设置为选中状态,为0表示未选中状态。
4.添加鼠标单击响应函数:
鼠标单击某单选按钮后,其状态已经能自动改变,这里我们还需修改控制变量m_SelRadio的值,以便跟踪选中的单选按钮。
首先在MESSAGE_MAP中把鼠标单击消息与响应函数联系起来:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView) //{{AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) //ClassWizard在此处添加 //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_MYRADIO1, OnMyRadio1) //单选按钮1 ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2) //单选按钮2 ON_BN_CLICKED(IDC_MYRADIO3, OnMyRadio3) //单选按钮3 END_MESSAGE_MAP() |
然后在头文件的MESSAGE_MAP中定义单击函数:
protected: //{{AFX_MSG(CTextEditorView) afx_msg void OnIconbut0(); //ClassWizard在此处添加 //}}AFX_MSG afx_msg void OnMyRadio1(); //单选按钮1 afx_msg void OnMyRadio2(); //单选按钮2 afx_msg void OnMyRadio3(); //单选按钮3 DECLARE_MESSAGE_MAP() |
这里注意不要把函数加在AFX_MSG区间内,以防影响ClassWizard的使用。
定义具体的响应函数(这里是用手工加入的,不是用ClassWizard加入的):
//单击单选按钮1 void CTextEditorView::OnMyRadio1() { m_SelRadio=0; }
//单击单选按钮2 void CTextEditorView::OnMyRadio2() { m_SelRadio=1; }
//单击单选按钮3 void CTextEditorView::OnMyRadio3() { m_SelRadio=2; } |
5.回收资源:
在析构函数中,回收创建的单选按钮(也可以在不使用单选按钮时立即回收):
CTextEditorView::~CTextEditorView() { int i; for( i=0; i<3; i++) { if(p_MyRadio[i]) delete p_MyRadio[i]; } } |
以上就是动态控件的生成和响应方法,各种不同的控件做法略有不同,但思路和步骤都是类似的,希望以上实例对你能够有所帮助。
posted @
2007-04-23 14:44 乔栋 阅读(1136) |
评论 (0) |
编辑 收藏
class CXDlg : public CDialog
{
......
public:
typedef ITaskbarList *LPITaskbarList;
LPITaskbarList pTaskbar;
......
};
Step 2: 初始化 任务栏COM 对象
BOOL CXDlg::OnInitDialog()
{
......
// Initializes the Component Object Model(COM)
CoInitialize(0);
// We call below function since we only need to create one object
CoCreateInstance(
CLSID_TaskbarList,
0,
CLSCTX_INPROC_SERVER,
IID_ITaskbarList,
(void**)&pTaskbar
);
// Below function will initialize the taskbar list object
pTaskbar->HrInit();
......
}
Step 3: 使用:删除/显示 任务栏程序按钮
void CXDlg::OnBnClickedButtonHide()
{
pTaskbar->DeleteTab(this->GetSafeHwnd());
}
void CXDlg::OnBnClickedButtonShow()
{
pTaskbar->AddTab(this->GetSafeHwnd());
}
posted @
2007-04-22 22:45 乔栋 阅读(1569) |
评论 (2) |
编辑 收藏