VC小技巧的功能是很實用的,這對于程序員在開發的時候有一定的參考價值,本文是武林技術頻道小編為大家介紹的VC小技巧匯總之5則實用小技巧,希望對你學習這個方面知識有幫助!
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 ); }
?以上就是VC小技巧匯總之5則實用小技巧的相關介紹,更多的實用小技巧盡在武林技術頻道,相信我們的信息對你是有用的。
新聞熱點
疑難解答
圖片精選