EDN首页   博客首页

2

关于投票
VC 从文本中读取数据

 CStdioFile fp;
 CString strFileName,cmdRecord;
 byte cmd,addr,data0,data1,data2,data3;

 CFileDialog MyDialog(true,"","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text Files (*.txt)|*.txt|"); // open file menu (construct CFileDialog object)
 

 if (MyDialog.DoModal()==IDOK)
 {
  strFileName = MyDialog.GetPathName();
  if(!fp.Open(strFileName,CFile::modeRead |CFile::typeText))
  {
   MessageBox("Cannot open command file","Multi-Ucodes",MB_ICONERROR|MB_OK); // file cannot be opened (not existing)
   return;
  }
  else
  {
   USHORT numRecord="0";
   while(fp.ReadString(cmdRecord))
   {
    if (cmdRecord.Left(1) != '#')
    {
     sscanf(cmdRecord,"%x%x%x%x%x",&addr,&cmd,&data1,&data2,&data3);
     numRecord++;
     if (numRecord >= 100)
     {
      MessageBox("Warning: command list is too large,only 100 cmd can be executed!", "Multi-Ucode", MB_ICONWARNING|MB_OK);
      break;
     }
    }
   }
   fp.Close();
  }
 }
  

系统分类: 软件开发
用户分类: 软件设计
标签: vc 文本 hex 读取数据
来源: 原创
发表评论 阅读全文(235) | 回复(0)

1

关于投票
浅谈GCC预编译头技术

文/jorge 节选

所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。GCC编译头文件后的中间文件是*.gch。

如何将头文件编译为.gch文件呢?用g++编译,格式:

g++ xxx.h

把.h文件当成.cpp文件一样来编译。如果需要控制编译细节,比如常量定义之类,可加上其它选项。运行之后,会在同个目录里生成一个名叫xxx.h.gch的文件。

注意在编译.gch的过程中,GCC并没有使用环境变量或 -I 选项来查找被编译的头文件,被编译的头文件必须在当前目录下。然而,被编译的头文件所进一步包含的其它头文件,却可以通过以上途径找到。简言之,就是把直接编译的那个头文件以类似对待.cpp文件的方式处理了。

比如该如何编译iostream呢?方法是在当前目录里建立一个头文件,把它放到用户定义的头文件里,比如foo.h,在其里面写上:#include <iostream>,然后编译它:g++ foo.h。生成的foo.h.gch,就是我们要的了。其它文件需要用到iostream的,不要包含iostream,要包含foo.h。切记,不是去包含foo.h.gch!

使用过程中,照搬一些stdafx.h相关的注意事项,它们同样适用于.gch文件:应该把那些不常修改的(首当其冲,当然是系统的)头文件放在预编译头里,而那些属于你的程序的一部分的头文件,一般并不放在预编译头里,因为它们可能随时要被修改的。每修改一次就要重新生成预编译头,并没有速度优势可言,失去预编译头的意义了。另外重要的注意事项是:如果你生成预编译头的时候用了一些选项,比如宏定义,那么使用这个预编译头的其它源代码文件,被编译的时候也要使用这些选项,否则会因为不匹配而编译失败。

使用预编译后的文件时,只要包含其所对应的.h文件即可!比如头文件叫foo.h,另外有一大堆其它文件都包含了这个foo.h,原来没有使用预编译头技术,现在忽然想使用了,于是把foo.h编译成了foo.h.gch。那其它文件要做怎样的修改?——什么都不用,一切照旧!聪明的GCC编译器在查找一个.h文件之前,会自动查找其目录里有没有对应的.gch文件,如有,且可用,则用之;没有,才用到真正的.h头文件。——慢着,“如有,且可用”,什么叫“可用”?——就是指这个.gch格式要正确,版本要兼容,而且如上所述,编译两者要用同样的选项。如果.gch不可用,编译器会给出一条警告,告诉我们:这个预编译头不能用!我只好用原有的.h头文件啦!什么?你说看不到这个警告?——当然,要先打开 -Winvalid-pch 选项才行,其默认是关闭的。

用 -H 选项感受一下预编译头的清爽吧!再没有滚不完的头文件了,明显提高的速度,绝对会让你有种翻身解放的感觉,原来MinGW也可以和蜗牛般的速度说再见的。

本文出自jorge的博客:blog.csdn.net/jorge,进行了删减和部分修改。

系统分类: 软件开发
用户分类: 软件设计
标签: gcc 预编译 头文件 g++
来源: 整理
发表评论 阅读全文(387) | 回复(0)

1

关于投票
如何添加用户自定义的类

VC中有时需要加入用户自定义的类。一般选择CObject类。但是在Class Wisard中没有该类,据说是因为Class Wisard - >new class的下拉列表中提供的都是MFC的类,这些类都是从CObject中派生出来,所以没有该类。

其实一个比较简单的做法是,从下拉菜单Insert中选择New class就可以实现建立用户自定义的类。

系统分类: 软件开发
用户分类: 软件设计
标签: vc 用户自定义类
来源: 整理
发表评论 阅读全文(401) | 回复(0)

1

关于投票
VC中radio的用法

先为对话框加上2个radio button,分别是Radio1和Radio2。

问题1:如何让Radio1或者Radio2默认选上?如何知道哪个被选上了?

关键是选上,“默认”只要放在OnInitDialog()即可。三种方法可以让它选上,
第一种:
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上
((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上
第二种:
关联一个congtrol型变量(子类化),好ctrl+W(即打开classwizard),点开 Member Variables,咦?怎么没有IDC_RADIO1这个ID?原来是没有分组。因为radio button通常都是成组使用的,在一组里面是互斥的。取消,回到对话框资源面板,右键Radio1查看属性把Group选上,那么,Radio1和 Radio2就是一组了(怎么知道他们是一组的?后面说)。此时,就可以为Radio1增加一congtrol型变量m_ctrlRadio1了。如下:
m_ctrlRadio1.SetCheck(TRUE);
同样可以使用GetCheck()获取状态。
第三种:
关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:
m_nRadio1 = -1;m_nRadio1别赋值-1表示哪个都没有选上。如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1 就是第二个被选上了(这里同样有问题,哪个是第一个?哪个是第二个?)。获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值 即可。

问题2:如何使用多组?

多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了。再为对话框添加Radio3和Radio4。很简单,先为这些Radio Button排个顺序(这 个必须要做,比如你的一组控件有Radio1,Radio2,Radio3,就把它们的TAB顺序分别设为1,2,3,并将Radio1的Group属性 设为True,这样,当选中Radio1的时候和它关联的变量就是0,当选中Radio2的时候和它关联的变量就是1,依此类推),就是排 列他们的TAB ORDER。在对话框资源面板上Ctrl+D,然后按你自己的理想顺序用鼠标逐个点击就可以了。不妨假设Radio1、Radio2、Radio3、 Radio4分别是1、2、3、4。Radio1和Radio3都选上Group属性,那么,1、2是一组,3、4是另外一组,因为分组的原则是在选上 Group属性的这一个开始直到碰到下一个选上Group属性的。你不妨再Ctrl+D,令Radio1、Radio2、Radio3、Radio4分别 是1、3、2、4,那么Radio1和Radio3是一组,如果m_nRadio1=1,此时是Radio3被选上而不是Radio2被选上。分好了组就 分别使用它们吧。

嗯,也许你还要为它们添加鼠标单击事件,非常简单。


单选按钮控件(Radio Button)的使用

关键词: 单选按钮控件     使用方法                                           



一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。如:
Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组

设定Radio1属性:Group,Tabstop,Auto
设定Radio2属性:Tabstop,Auto
设定Radio3属性:Tabstop,Auto

设定Radio4属性:Group,Tabstop,Auto
设定Radio5属性:Tabstop,Auto

二、用ClassWizard为单选控件定义变量,每组只能定义一个。如:m_Radio1、m_Radio4。

三、用ClassWizard生成各单选按钮的单击消息函数,并加入内容:

void CWEditView::OnRadio1()
{
     m_Radio1 = 0;     //第一个单选按钮被选中
}

void CWEditView::OnRadio2()
{
     m_Radio1 = 1;     //第二个单选按钮被选中
}

void CWEditView::OnRadio3()
{
     m_Radio1 = 2;     //第三个单选按钮被选中
}

void CWEditView::OnRadio4()
{
     m_Radio4 = 0;     //第四个单选按钮被选中
}

void CWEditView::OnRadio5()
{
     m_Radio4 = 1;     //第五个单选按钮被选中
}

四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CUnitBlockTypeFlankPublicAdd)
m_Radio1 = 0;     //初始时第一个单选按钮被选中
m_Radio4 = 0;     //初始时第四个单选按钮被选中
//}}

//Radio   Button   使用  
  使用方法一:  
  在工程中添加控件后,直接在控件的Click事件中写入需要的代码即可  
   
  使用方法二:  
  1.建立一个基于对话框的用用程序,在其中加入三个Radio   Button,ID分别为:  
  IDC_RADIO1,IDC_RADIO2,IDC_RADIO3  
   
  2.控件的初始化:  
  在对话框类的OnInitDialog中加入代码:  
  CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO3);     //第一个参数为该组的第一个单选按钮的ID  
                                                                                                            //第二个参数为该组的最后一个单选按钮的ID  
                                                                                                            //第三个参数为该组中被选中的单选按钮的ID  
   
   
  3.在加入一个Button控件,并为其写入Click事件代码:  
  int   iRadioButton;  
   
  iRadioButton="GetCheckedRadioButton"(IDC_RADIO1,IDC_RADIO3);  
  if(iRadioButton==IDC_RADIO1)  
  MessageBox("Click   Button1");  
  if(iRadioButton==IDC_RADIO2)  
  MessageBox("Click   Button2");  
  if(iRadioButton==IDC_RADIO3)  
  MessageBox("Click   Button3");  
   
  其他说明:  
  Radio   Button成组使用时,只需保证在添加控件时资源号连续,并且第一个Radio   Button的属性中Group被选中即可.  
  这样就可以给这一组控件添加成员变量使用  
  例:  
  1.建立一个基于对话框的应用程序,添加三个Radio   Button,和一个Button  
  选中第一个Radio   Button属性中的Group  
   
  2.在Button的Click事件中添加代码:  
  UpdateData(TRUE);  
  if(m_radio==0)  
  MessageBox("0");  
  if(m_radio==1)  
  MessageBox("1");  
  if   (m_radio==2)  
  MessageBox("2");  
  UpdateData(false);

 

系统分类: 软件开发
用户分类: 软件设计
标签: vc radio用法
来源: 转贴
发表评论 阅读全文(1569) | 回复(0)

1

关于投票
剖析VC中的文件操作
作者:燕山大学    聂栋栋
发表日期:2001年12月 日
转自:
内容提要      

关键字     文章正文        各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的。本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析。
  1.文件的查找
  当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。

  CString strFileTitle;
  CFileFind finder;
  BOOL bWorking = finder.FindFile(C:\\windows\\sysbkup\\*.cab);
  while(bWorking)
  {
  bWorking=finder.FindNextFile();
  strFileTitle=finder.GetFileTitle();
  }
  2.文件的打开/保存对话框
  让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。
  在构造CFileDialog对象时,如果在参数中指定了OFN_ALLOWMULTISELECT风格,则在此对话框中可以进行多选操作。此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。

  CFileDialog mFileDlg(TRUE,NULL,NULL,
  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
  All Files (*.*)|*.*||,AfxGetMainWnd());
  CString str( ,10000);
  mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000);
  str.ReleaseBuffer();
  POSITION mPos="mFileDlg".GetStartPosition();
  CString pathName( ,128);
  CFileStatus status;
  while(mPos!=NULL)
  {
  pathName=mFileDlg.GetNextPathName(mPos);
  CFile::GetStatus( pathName, status );
  }

  3.文件的读写
  文件的读写非常重要,下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行,如文件的读写可以使用下面的方法:

     //对文件进行读操作
     char sRead[2];
     CFile mFile(_T(user.txt),CFile::modeRead);
     if(mFile.GetLength()<2)
     return;
     mFile.Read(sRead,2);
     mFile.Close();
     //对文件进行写操作
     CFile mFile(_T(user.txt ), CFile::modeWrite|CFile::modeCreate);
     mFile.Write(sRead,2);
     mFile.Flush();
     mFile.Close();

     虽然这种方法最为基本,但是它的使用繁琐,而且功能非常简单。我向你推荐的是使用CArchive,它的使用方法简单且功能十分强大。首先还是用CFile声明一个对象,然后用这个对象的指针做参数声明一个CArchive对象,你就可以非常方便地存储各种复杂的数据类型了。它的使用方法见下例。

     //对文件进行写操作
     CString strTemp;
     CFile mFile;
     mFile.Open(d:\\dd\\try.TRY,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
     CArchive ar(&mFile,CArchive::store);
     ar<<  ar.Close();
     mFile.Close();
     //对文件进行读操作
     CFile mFile;
     if(mFile.Open(d:\\dd\\try.TRY,CFile::modeRead)==0)
     return;
     CArchive ar(&mFile,CArchive::load);
     ar>>strTemp;
        ar.Close();
     mFile.Close();

     CArchive的 << 和>> 操作符用于简单数据类型的读写,对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写,如:
     //存储CAboutDlg类
     ar.WriteClass(RUNTIME_CLASS(CAboutDlg));
     //读取CAboutDlg类
     CRuntimeClass* mRunClass="ar".ReadClass();
     //使用CAboutDlg类
  CObject* pObject="mRunClass-">CreateObject();
      ((CDialog* )pObject)->DoModal();
     虽然VC提供的文档/视结构中的文档也可进行这些操作,但是不容易理解、使用和管理,因此虽然很多VC入门的书上花费大量篇幅讲述文档/视结构,但我建议你最好不要使用它的文档。关于如何进行文档/视的分离有很多书介绍,包括非常著名的《Visual C++ 技术内幕》。
     如果你要进行的文件操作只是简单的读写整行的字符串,我建议你使用CStdioFile,用它来进行此类操作非常方便,如下例。

     CStdioFile mFile;
     CFileException mExcept;
     mFile.Open( d:\\temp\\aa.bat, CFile::modeWrite, &mExcept);
     CString string="I" am a string.;
     mFile.WriteString(string);
  mFile.Close();

    4.临时文件的使用
  
  正规软件经常用到临时文件,你经常可以会看到C:\Windows\Temp目录下有大量的扩展名为tmp的文件,这些就是程序运行是建立的临时文件。临时文件的使用方法基本与常规文件一样,只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径,第二个参数是建立临时文件名的前缀,第四个参数用于得到建立的临时文件名。得到此临时文件名以后,你就可以用它来建立并操作文件了,如:

     char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
     GetTempPath(_MAX_PATH, szTempPath);
     GetTempFileName(szTempPath,_T (my_),0,szTempfile);
     CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite);
     char m_char=a;
     m_tempFile.Write(&m_char,2);
     m_tempFile.Close();

     5.文件的复制、删除等
     MFC中没有提供直接进行这些操作的功能,因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它们的用法很简单,可参考MSDN。
importForm(CString FileName, CStringArray *pData)
{
CStdioFile MyFile(_T(FileName),CFile::modeRead);
if(MyFile.GetLength()<2) return -1;
int i,m;
CString TempStr;
pData->RemoveAll();
while(MyFile.ReadString(TempStr))
pData->Add(TempStr);
return 1;
}
系统分类: 软件开发
用户分类: 软件设计
标签: vc file 文件操作
来源: 转贴
发表评论 阅读全文(491) | 回复(0)

1

关于投票
CFileDialog的使用方法

一般来讲你不需要派生新的类,因为基类已经提供了常用的功能。而且在创建并等待对话框结束后你可以通过成员函数得到用户在对话框中的选择。

CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:

bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

例子:
CString FileName;
CFileDialog MyDlg(TRUE, NULL,"*.CSV",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "*.CSV", NULL );
if (MyDlg.DoModal()==IDOK){
FileName=MyDlg.GetFileName();
}
系统分类: 软件开发
用户分类: 软件设计
标签: 无标签
来源: 转贴
发表评论 阅读全文(774) | 回复(0)
总共 , 当前 /