程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> VC小技能匯總之5則適用小技能

VC小技能匯總之5則適用小技能

編輯:關於C++

VC小技能匯總之5則適用小技能。本站提示廣大學習愛好者:(VC小技能匯總之5則適用小技能)文章只能為提供參考,不一定能成為您想要的結果。以下是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 ); 
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved