posts - 62,  comments - 19,  trackbacks - 0
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 乔栋 阅读(347) | 评论 (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 乔栋 阅读(1223) | 评论 (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 乔栋 阅读(381) | 评论 (0)编辑 收藏
荣耀:C程序设计之四书五经
来自:bookread
此书架对287人里的208人有用
对你 有用 无用
 
C程序设计教程 
(美)H.M.Deitel等著 薛万鹏等译 / 2000年7月 / 机械工业出版社 / 33元 / 787*1092 1/16 /

 
C陷阱与缺陷 
Andrew Koenig著 高巍译 / 2002年11月 / 人民邮电出版社 / 30元 / 720*980 1/16 /

 
C语言接口与实现——创建可重用软件的技术 
[美]汉森 著,傅蓉等 译 / 01 1 2004 12:00AM / 机械工业出版社 / 35元 / 787*1092 1/16 /

 
C语言参考手册(原书第5版) 
(美)Samuel P.Harbison III/Guy L.Steele Jr.著 邱仲潘等译 / 2003年8月 / 机械工业出版社 / 39元 / 787*1092 1/16 /

 
C语言参考手册(第五版)(英文版) 
哈比森,斯蒂尔 著 / 06 1 2003 12:00AM / 人民邮电出版社 / 45元 / 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程序设计语言第二版习题解答(第二版)(英文影印版) 
Clovis L.Tondo,Scott E.Gimpel / 2000-3-1 / 清华大学出版社 / 12元 /

 
C程序设计语言 
Brian W.Kernighan / 1997年3月 / 清华大学出版社 / 0元 / 850*1168 1/32 /




















































































































posted @ 2007-06-07 09:56 乔栋 阅读(646) | 评论 (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 乔栋 阅读(507) | 评论 (0)编辑 收藏
 

在Windwos Xp下,要安装Sql或sp补丁以及其他软件,尤其是微软自己的软件的时候,系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:

到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

删除PendingFileRenameOperations
再重新安装就可以了.

posted @ 2007-05-28 12:26 乔栋 阅读(467) | 评论 (0)编辑 收藏
最近看完了《千年一叹》,重新买了两本余秋雨老师的书:《行者无疆》《霜冷长河》
正在看霜冷长河,觉得很好看。
posted @ 2007-05-23 10:45 乔栋 阅读(229) | 评论 (0)编辑 收藏
     摘要: 1   1 //   UseResourceDllView.cpp   :   implementation   of   the   CUseResourceDllView &...  阅读全文
posted @ 2007-04-24 12:00 乔栋 阅读(579) | 评论 (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型变量作为控制变量即可,如:

int m_SelRadio;

  在构造函数中设置其初值为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 乔栋 阅读(1132) | 评论 (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 乔栋 阅读(1558) | 评论 (2)编辑 收藏
仅列出标题  下一页
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


My blog is worth $0.00.
How much is your blog worth?