VC小技巧汇总之5则实用小技巧

本文搜集汇总VC的5则小技巧,非常实用,对于VC程序设计有很好的参考借鉴价值,详情如下:

1.如何获取程序所在的路径

也就是获取你这个程序本身所在的路径。
在应用程序类CxxApp的头文件中定义一个变量CString m_exePath;用来放置程序的路径名,在应用程序类CxxApp的InitInstance()函数中加入如下语句:

TCHAR m_Path[MAX_PATH];
GetModuleFileName( NULL, m_Path, MAX_PATH ); //获取程序路径(包括程序名)
int i = 0, j;
while( m_Path[i]!=0 )
{
  if( m_Path[i]=='\' )
    j = i;
  i++;
}
m_Path[j+1] = '';
m_exePath.Format( "%s", m_Path );  //分离路径名(去掉程序名)

这段程序执行后,字符串变量m_exePath中放置的就是程序所在路径,其中不包括程序名。
获取程序的位置有什么用呢?

(1)打开与应用程序在一起放置的数据文件:
如果你运行程序过程中使用过打开文件对话框打开过其它路径下的文件,这时系统的默认路径就发生了改变,有可能使你原定的数据文件打不开了,如果采用以下方法就可以没问题了:

CFile file;
file.Open( m_exePath+"数据文件名", CFile::modeRead );

(2)放置程序运行中的临时文件:
同样,当系统的默认路径发生改变后,程序中生成的临时文件就会放得到处都是,成了一个个垃圾文件,采用以下方法可使临时文件只放在程序所在路径下:

CFile file;
file.Open( m_exePath+"临时文件名", CFile::modeCreate | CFile::modeWrite );
……

程序结束时,用下面的方法删除临时文件:

CFile::Remove( m_exePath+"临时文件名" );

2.如何在你的程序中执行其它程序

在自己的程序中调用其它程序的方法有好几种,这里我介绍我用过的两种:
(1)WinExec()函数:
一般用法:

WinExec(m_PathName,SW_SHOWNORMAL);

m_PathName为执行程序的路径名,必须为可执行文件。
如:

WinExec("C:\Program Files\Internet Explorer\iexplore.exe",SW_SHOWNORMAL);//为打开IE浏览器

(2)ShellExecute()函数:
一般用法:

ShellExecute(NULL,NULL,m_PathName,NULL,_T("c:\temp"),SW_SHOWNORMAL);

m_PathName为打开的程序路径名;
_T("c:\temp")为工作目录;
与WinExec()不同的是ShellExecute()函数也可以打开非可执行文件,比如你指定的文件为.txt,结果会打开记事本装入该文件。我用这种方法调用自己制作的帮助文件(.chm)效果很好。

3.如果不使用串行化,如何在程序结束时保存文件?

在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。
用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。
例:

//退出程序
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame)
{
  CFile file;
  if(b_Flag)  //b_Flag为文档修改标志,在修改文档时将其置为True
  {
    int t;
    t=::MessageBox(NULL,"文字已经改变,要存盘吗?","警告",
      MB_YESNOCANCEL | MB_ICONWARNING);  //弹出提示对话框
    if(t==0 || t==IDCANCEL)
      return false;
    if(t==IDYES)
    {
      CString sFilter="Text File(*.txt)|*.txt||";
      CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY |         OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL); //定制文件对话框
      int k=m_Dlg.DoModal(); //弹出文件对话框
      if(k==IDCANCEL || k==0)
        return false;
      m_PathName=m_Dlg.GetPathName(); //获取选择的文件路径名

      file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);
      file.Write(m_Text,m_TextLen); //数据写入文件
      file.Close();
    }
  }
  return CDocument::CanCloseFrame(pFrame);
}

这样当你单击窗口上的关闭按钮时,如果数据已修改了,就会弹出一个提示保存数据的对话框,提示你保存数据。
程序中的b_Flag是数据修改标志,应该在修改数据时进行设置,m_Text是准备保存的数据,放在文档内。

4.POSITION怎么用?

POSITION类型数据用于表征各种列表中元素的位置,它类似于数组的下标,但又有所不同。主要区别是:
我们不能访问POSITION型数据的值,也不能对POSITION数据型数据进行加减、比较等运算。
用POSITION型数据访问列表时,都是采用迭代法,一般格式为:

POSITION pos;    //定义pos型变量
pos = GetHeadPosition();  //获取列表起始元素位置
while( pos )
{
  x = GetNext(pos);  //获取pos处的列表值,同时修改pos为下一个元素位置
}

GetNext()就是一种迭代,其格式为:

TYPE GetNext(POSITION& rPosition);

首先,它返回当前pos位置处的元素;再就是把pos值修改为下一个元素位置。这样循环时,可依次取得列表中各元素的值;当到达列表尾时,pos为NULL,循环结束。
所以使用POSITION型数据时,你不要试图用加减等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反复迭代来修改它的值。
如果你想直接到达指定值,还可以用Find()函数或FindIndex()函数获得指定值的POSITION值。

POSITION Find(TYPE Value);//用于在列表中查找值为Value的元素的POSITION值;
POSITION FindIndex(int nIndex);//用于获取列表中第nIndex个元素的POSITION值,nIndex从0开始。

如:

pos = FindIndex(5);  //求列表中第5个元素的位置
x = GetNext(pos);   //读取元素的值

总之,POSITION类型在多种涉及列表的类中提供,不同的类提供的函数有所不同,但用法都是类似的。

5.如何从完整的文件路径中分离文件名和路径名?

从路径中分离文件名:

CString GetFileName(CString pathname)
{
  for( int i=pathname.GetLength()-1; i>=0; i-- )
  {
    if( pathname[i]=='\' )
      break;
  }
  return pathname.Mid( i+1 );
}

从路径中分离路径名(去除文件名):

CString GetPath(CString pathname)
{
  int i = 0, j;
  while( i<pathname.GetLength() )
  {
    if( pathname[i]=='\' )
      j = i;
    i++;
  }
  return pathname.Left( j+1 );
}
(0)

相关推荐

  • VC小技巧汇总之控件技巧

    本文搜集汇总了VC小技巧的控件技巧,对于进行VC开发来说有一定的借鉴价值,具体如下: 1.如何隐藏和显示控件 用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件. 例1: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号 pWnd->ShowWindow( SW_HIDE ); //隐藏控件 例2: CWnd *pWnd; pWnd = GetDlgItem( I

  • VC小技巧汇总之窗口技巧

    本文搜集汇总了VC小技巧的窗口技巧,对于VC程序开发的窗口设计而言有一定的借鉴价值,详情如下: 1.让窗口一启动就最大化 把应用程序类(CxxxApp)的 InitInstance() 函数中的 m_pMainWnd->ShowWindow(SW_SHOW); 改为 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); 则窗口一启动就最大化显示. 2.如何设置窗口的初始尺寸 在将应用程序类(CxxAPP)的 InitInstance() 函数中加入: m_pMai

  • VC动态生成菜单项的实现方法

    本例所述为使用VC编写的一个可以动态生成菜单项的类文件,这里展示的是其核心代码,代码备有比较详细的注释,相对而言理解起来并不复杂. 主要功能代码如下: #include "stdafx.h" #include "Test.h" #include "TestDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序"关于"菜单项的 CAboutDlg 对话框 class

  • VC实现ODBC数据库操作实例解析

    本文以VC实例介绍了实现数据库操作的各种方法,包括打开数据库.关联记录集.读取Excel数据.执行SQL查询.创建存取字符串等,相信对于初学VC的朋友有一定的参考价值,主要功能代码如下: //打开数据库 CDatabase database; database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue为数据源名称 //关联记录集 CRecordset recset(&database); //查询记

  • VC实现让关闭按钮成灰色不可用的方法

    对于有些情况下运行的VC项目程序来说,会有禁止用户通过标题栏上的关闭按钮关闭窗口的情况,你会发现,这时候程序的关闭按钮变成灰色不可用,从任务栏处也无法关闭窗口,菜单同样是灰色的,很好的禁止了窗口关闭功能,如果想关闭,可以按键盘上的快捷键"ALT+F4",或者通过任务管理器结束任务.下面就来说明一下这个功能的核心代码文件. 禁用关闭按钮的具体功能代码如下: #include "stdafx.h" #include "Test.h" #include

  • VC6.0实现读取Excel数据的方法

    Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法.具体步骤如下:   1.首先要将excel类添加到工程中. 在ClassWizard中,[Add Class],在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe:2007应该又独立的lib库,这个没有验证),添加必要的几个类: // Excel应用对象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oW

  • VC实现批量删除指定文件的方法

    本文所述实例主要实现了删除某个盘符下指定位置的文件,可以是TXT.doc.jpeg等格式,只要选定格式后,再定义好盘符,即可一键删除所有指定类型的文件.再次提示删除前请确认,且删除后不可恢复. 以下是最主要的核心代码,其它代码读者可以自己添加. SHFILEINFO shInfo; memset(&shInfo,0,sizeof(SHFILEINFO)); HIMAGELIST hImage = (HIMAGELIST)SHGetFileInfo("C:\\",0,&s

  • 基于VC实现的网络监听功能程序实例

    本文所述VC++网络监听器代码,可以实现监听网络连接所使用的协议.源IP地址.目标IP地址等信息的功能,并且能把数据内容绑定到网格控件中显示.具体功能代码部分如下所示: //线程函数 UINT ThreadFun( LPVOID pParam ) { CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam); MSG msg; char buffer[1000],sourceip[32] ,*tempbuf; char *ptemp; BY

  • VC程序设计中CreateProcess用法注意事项

    对于windows程序设计来说,启动一个进程有三种方法:WinExec,ShellExecute,CreateProcess.这里仅对CreateProcess的用法加以说明. 对于CreateProcess的详细参数读者可以查MSDN和<Windows API参考手册>,这里不具体说明.下面给出常用的方法: STARTUPINFO startup; ZeroMemory( &startup, sizeof(startup) ); startup.cb = sizeof(startup

  • VC++操作SQLite简单实例

    对于很多程序员来说,SQLite并不陌生.SQLite 是一款主要用于嵌入式的开源数据库,可集成在自己的桌面程序中,也可替代Access作为后台数据库.SQLite 支持多数SQL92标准,例如:索引.限制.触发和查看支持,支持 NULL.INTEGER.REAL.TEXT 和 BLOB 数据类型,支持事务.以下是一些SQLite的简单使用. //建立数据库 C:\sqlite-3_6_11> sqlite3.exe dbname.db 建立数据库的时候sqlite3.exe后面跟数据库文件名

随机推荐