VC小技巧匯總之5則實(shí)用小技巧
本文搜集匯總VC的5則小技巧,非常實(shí)用,對(duì)于VC程序設(shè)計(jì)有很好的參考借鑒價(jià)值,詳情如下:
1.如何獲取程序所在的路徑
也就是獲取你這個(gè)程序本身所在的路徑。
在應(yīng)用程序類CxxApp的頭文件中定義一個(gè)變量CString m_exePath;用來放置程序的路徑名,在應(yīng)用程序類CxxApp的InitInstance()函數(shù)中加入如下語句:
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 ); //分離路徑名(去掉程序名)
這段程序執(zhí)行后,字符串變量m_exePath中放置的就是程序所在路徑,其中不包括程序名。
獲取程序的位置有什么用呢?
(1)打開與應(yīng)用程序在一起放置的數(shù)據(jù)文件:
如果你運(yùn)行程序過程中使用過打開文件對(duì)話框打開過其它路徑下的文件,這時(shí)系統(tǒng)的默認(rèn)路徑就發(fā)生了改變,有可能使你原定的數(shù)據(jù)文件打不開了,如果采用以下方法就可以沒問題了:
CFile file; file.Open( m_exePath+"數(shù)據(jù)文件名", CFile::modeRead );
(2)放置程序運(yùn)行中的臨時(shí)文件:
同樣,當(dāng)系統(tǒng)的默認(rèn)路徑發(fā)生改變后,程序中生成的臨時(shí)文件就會(huì)放得到處都是,成了一個(gè)個(gè)垃圾文件,采用以下方法可使臨時(shí)文件只放在程序所在路徑下:
CFile file; file.Open( m_exePath+"臨時(shí)文件名", CFile::modeCreate | CFile::modeWrite ); ……
程序結(jié)束時(shí),用下面的方法刪除臨時(shí)文件:
CFile::Remove( m_exePath+"臨時(shí)文件名" );
2.如何在你的程序中執(zhí)行其它程序
在自己的程序中調(diào)用其它程序的方法有好幾種,這里我介紹我用過的兩種:
(1)WinExec()函數(shù):
一般用法:
WinExec(m_PathName,SW_SHOWNORMAL);
m_PathName為執(zhí)行程序的路徑名,必須為可執(zhí)行文件。
如:
WinExec("C:\Program Files\Internet Explorer\iexplore.exe",SW_SHOWNORMAL);//為打開IE瀏覽器
(2)ShellExecute()函數(shù):
一般用法:
ShellExecute(NULL,NULL,m_PathName,NULL,_T("c:\temp"),SW_SHOWNORMAL);
m_PathName為打開的程序路徑名;
_T("c:\temp")為工作目錄;
與WinExec()不同的是ShellExecute()函數(shù)也可以打開非可執(zhí)行文件,比如你指定的文件為.txt,結(jié)果會(huì)打開記事本裝入該文件。我用這種方法調(diào)用自己制作的幫助文件(.chm)效果很好。
3.如果不使用串行化,如何在程序結(jié)束時(shí)保存文件?
在文檔-視圖結(jié)構(gòu)中,用串行化自動(dòng)保存文件在各種VC書上都有介紹?,F(xiàn)在的問題是我不使用串行化,而是自己動(dòng)手保存,當(dāng)點(diǎn)擊窗口的關(guān)閉按鈕時(shí),如何提示并保存文檔。
用ClassWizard在文檔類(CxxDoc)中添加函數(shù)CanCloseFrame(),再在其中加入保存文件的語句就可以了。
例:
//退出程序 BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) { CFile file; if(b_Flag) //b_Flag為文檔修改標(biāo)志,在修改文檔時(shí)將其置為True { int t; t=::MessageBox(NULL,"文字已經(jīng)改變,要存盤嗎?","警告", MB_YESNOCANCEL | MB_ICONWARNING); //彈出提示對(duì)話框 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); //定制文件對(duì)話框 int k=m_Dlg.DoModal(); //彈出文件對(duì)話框 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); //數(shù)據(jù)寫入文件 file.Close(); } } return CDocument::CanCloseFrame(pFrame); }
這樣當(dāng)你單擊窗口上的關(guān)閉按鈕時(shí),如果數(shù)據(jù)已修改了,就會(huì)彈出一個(gè)提示保存數(shù)據(jù)的對(duì)話框,提示你保存數(shù)據(jù)。
程序中的b_Flag是數(shù)據(jù)修改標(biāo)志,應(yīng)該在修改數(shù)據(jù)時(shí)進(jìn)行設(shè)置,m_Text是準(zhǔn)備保存的數(shù)據(jù),放在文檔內(nèi)。
4.POSITION怎么用?
POSITION類型數(shù)據(jù)用于表征各種列表中元素的位置,它類似于數(shù)組的下標(biāo),但又有所不同。主要區(qū)別是:
我們不能訪問POSITION型數(shù)據(jù)的值,也不能對(duì)POSITION數(shù)據(jù)型數(shù)據(jù)進(jìn)行加減、比較等運(yùn)算。
用POSITION型數(shù)據(jù)訪問列表時(shí),都是采用迭代法,一般格式為:
POSITION pos; //定義pos型變量 pos = GetHeadPosition(); //獲取列表起始元素位置 while( pos ) { x = GetNext(pos); //獲取pos處的列表值,同時(shí)修改pos為下一個(gè)元素位置 }
GetNext()就是一種迭代,其格式為:
TYPE GetNext(POSITION& rPosition);
首先,它返回當(dāng)前pos位置處的元素;再就是把pos值修改為下一個(gè)元素位置。這樣循環(huán)時(shí),可依次取得列表中各元素的值;當(dāng)?shù)竭_(dá)列表尾時(shí),pos為NULL,循環(huán)結(jié)束。
所以使用POSITION型數(shù)據(jù)時(shí),你不要試圖用加減等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反復(fù)迭代來修改它的值。
如果你想直接到達(dá)指定值,還可以用Find()函數(shù)或FindIndex()函數(shù)獲得指定值的POSITION值。
POSITION Find(TYPE Value);//用于在列表中查找值為Value的元素的POSITION值; POSITION FindIndex(int nIndex);//用于獲取列表中第nIndex個(gè)元素的POSITION值,nIndex從0開始。
如:
pos = FindIndex(5); //求列表中第5個(gè)元素的位置 x = GetNext(pos); //讀取元素的值
總之,POSITION類型在多種涉及列表的類中提供,不同的類提供的函數(shù)有所不同,但用法都是類似的。
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 ); }
上一篇:C++實(shí)現(xiàn)讀取特定路徑下文件夾及文件名的方法
欄 目:C語言
本文標(biāo)題:VC小技巧匯總之5則實(shí)用小技巧
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3602.html
您可能感興趣的文章
- 01-10異步http listener 完全并發(fā)處理懲罰http懇求的小例子
- 01-10節(jié)序問題:解析大小的端判定
- 01-10基于大端法、小端法以及網(wǎng)絡(luò)字節(jié)序的深入理解
- 01-10探討:用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(我作為面試官的小結(jié))
- 01-10解決不用sizeof求出int大小的方法
- 01-10C語言數(shù)組指針的小例子
- 01-10c語言在控制臺(tái)判定鼠標(biāo)左鍵的小例子
- 01-10解析四則表達(dá)式的編譯過程及生成匯編代碼
- 01-10C語言運(yùn)算符及其優(yōu)先級(jí)匯總表口訣
- 01-10C語言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法