• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            VC常用小技巧

            窗口

            讓窗口一啟動就最大化
            把應(yīng)用程序類(CxxxApp)的 InitInstance() 函數(shù)中的
            m_pMainWnd->ShowWindow(SW_SHOW);
            改為
            m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
            則窗口一啟動就最大化顯示。

            如何設(shè)置窗口的初始尺寸
            在將應(yīng)用程序類(CxxAPP)的 InitInstance() 函數(shù)中加入:
            m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);
            Width
            為窗口寬度,Height為窗口高度
            SWP_NOMOVE
            表示忽略位置(x,y)
            如:

            讓窗口居中顯示
            以下兩種方法可任選其一:
            在應(yīng)用程序類(CxxxApp)的 InitInstance() 函數(shù)中加入:
            在主框架類(MainFrm.cpp)OnCreate()函數(shù)中加入:
            CenterWindow( GetDesktopWindow() );
            如:如何修改窗口標(biāo)題
            窗口標(biāo)題一般形式為:文檔標(biāo)題 - 程序標(biāo)題
            1
            、設(shè)置文檔標(biāo)題:
            在文檔類(CxxxDoc)OnNewDocument()函數(shù)中加入語句:SetTitle("文檔名");
            如:TextEditorDoc.cpp
            可刪除Debug文件夾和Release文件夾;
            原則上還可刪除主文件夾中所有圖標(biāo)為 的文件,包括.aps.ncb.opt.plg等文件,它們都能在編譯時重建。但一般.clw不要刪除,它可能導(dǎo)致ClassWizard不好用。



            控件
            如何隱藏和顯示控件
            CWnd類的函數(shù)BOOL ShowWindow(int nCmdShow)可以隱藏或顯示一個控件。
            1
            CWnd *pWnd;
            pWnd = GetDlgItem( IDC_EDIT1 ); //
            獲取控件指針,IDC_EDIT為控件ID
            pWnd->ShowWindow( SW_HIDE ); //
            隱藏控件
            2
            CWnd *pWnd;
            pWnd = GetDlgItem( IDC_EDIT1 ); //
            獲取控件指針,IDC_EDIT為控件ID
            pWnd->ShowWindow( SW_SHOW ); //
            顯示控件

            按鈕的使能與禁止
            ClassWizardMember Variables為按鈕定義變量,如:m_Button1

            m_Button1.EnableWindow(true);
            使按鈕處于允許狀態(tài)
            m_Button1.EnableWindow(false);
            使按鈕被禁止,并變灰顯示

            改變控件的大小和位置
            CWnd類的函數(shù)MoveWindow()SetWindowPos()可以改變控件的大小和位置。
            void MoveWindow(int x,int y,int nWidth,int nHeight);
            void MoveWindow(LPCRECT lpRect);
            第一種用法需給出控件新的坐標(biāo)和寬度、高度;
            第二種用法給出存放位置的CRect對象;
            例:
            CWnd *pWnd;
            pWnd = GetDlgItem( IDC_EDIT1 ); //
            獲取控件指針,IDC_EDIT1為控件ID
            pWnd->MoveWindow( CRect(0,0,100,100) ); //
            在窗口左上角顯示一個寬100、高100的編輯控件
            SetWindowPos()
            函數(shù)使用更靈活,多用于只修改控件位置而大小不變或只修改大小而位置不變的情況:
            BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
            第一個參數(shù)一般設(shè)為NULL;
            x
            y控件位置;cxcy控件寬度和高度;
            nFlags
            常用取值:
            SWP_NOZORDER
            :忽略第一個參數(shù);
            SWP_NOMOVE
            :忽略xy,維持位置不變;
            SWP_NOSIZE
            :忽略cxcy,維持大小不變;
            例:
            CWnd *pWnd;
            pWnd = GetDlgItem( IDC_BUTTON1 ); //
            獲取控件指針,IDC_BUTTON1為控件ID
            pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //
            把按鈕移到窗口的(50,80)
            pWnd = GetDlgItem( IDC_EDIT1 );
            pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //
            把編輯控件的大小設(shè)為(100,80),位置不變
            pWnd = GetDlgItem( IDC_EDIT1 );
            pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //
            編輯控件的大小和位置都改變
            以上方法也適用于各種窗口。

            單選按鈕控件(Radio Button)的使用
            一、對單選按鈕進(jìn)行分組:
            每組的第一個單選按鈕設(shè)置屬性:GroupTabstopAuto;其余按鈕設(shè)置屬性TabstopAuto
            如:
            Radio1
            Radio2Radio3為一組,Radio4Radio5為一組
            設(shè)定Radio1屬性:GroupTabstopAuto
            設(shè)定Radio2屬性:TabstopAuto
            設(shè)定Radio3屬性:TabstopAuto
            設(shè)定Radio4屬性:GroupTabstopAuto
            設(shè)定Radio5屬性:TabstopAuto
            二、用ClassWizard為單選控件定義變量,每組只能定義一個。如:m_Radio1m_Radio4
            三、用ClassWizard生成各單選按鈕的單擊消息函數(shù),并加入內(nèi)容:
            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; //
            第五個單選按鈕被選中
            }
            當(dāng)控件變量值為0時,它對應(yīng)組的第一個單選按鈕處于選中狀態(tài)。

            BOOL CDzyApp::InitInstance() 

            AfxEnableControlContainer(); 
            …… 

            // The one and only window has been initialized, so show and update it. 
            m_pMainWnd->SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//設(shè)置窗口的初始大小為750*555 
            m_pMainWnd->ShowWindow(SW_SHOW); 
            m_pMainWnd
            ->UpdateWindow(); 

            return TRUE; 
            }


            m_pMainWnd->CenterWindow( GetDesktopWindow() );

             

            int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
            if (CFrameWnd::OnCreate(lpCreateStruct) == -1
            return -1
            …… 

            // TODO: Delete these three lines if you don't want the toolbar to 
            // be dockable 
            m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
            EnableDocking(CBRS_ALIGN_ANY); 
            DockControlBar(
            &m_wndToolBar); 

            CenterWindow( GetDesktopWindow() ); 
            //使窗口打開時處于屏幕正中

            return 0
            }


            BOOL CTextEditorDoc::OnNewDocument() 
            if (!CDocument::OnNewDocument()) 
            return FALSE; 
            // TODO: add reinitialization code here 
            // (SDI documents will reuse this document) 
            SetTitle("未命名.txt"); //設(shè)置文檔標(biāo)題 
            return TRUE; 
            }


            2、設(shè)置程序標(biāo)題:
            在框架類(CMainFrame)PreCreateWindow()函數(shù)中加入語句:m_strTitle = _T("程序標(biāo)題");
            如:MainFrm.cpp

            BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
            if!CFrameWnd::PreCreateWindow(cs) ) 
            return FALSE; 
            // TODO: Modify the Window class or styles here by modifying 
            // the CREATESTRUCT cs 
            cs.style&=~FWS_ADDTOTITLE;//去除標(biāo)題欄文字前面的"無標(biāo)題"
            m_strTitle = _T("文本整理器"); //設(shè)置程序標(biāo)題 
            return TRUE; 
            }

            以上兩點比較適用于視圖-文檔結(jié)構(gòu)的程序,在新建文檔時,系統(tǒng)會自動運行OnNewDocument()函數(shù),在其中可以設(shè)置合適的標(biāo)題。對于未采用文檔的程序可以用下面的方法修改標(biāo)題:
            3
            、修改窗口標(biāo)題:
            修改窗口標(biāo)題一般在打開文件函數(shù)OnFileOpen()和另存為函數(shù)OnFileSaveAs()中進(jìn)行,可以使用下面的函數(shù):其中文檔標(biāo)題和程序標(biāo)題可使用定義過的串變量。



            項目
            如何干凈的刪除一個類?
            1、先刪除項目中對應(yīng)的.h.cpp文件,(選中后用Delete鍵刪除)
            2
            、保存后退出項目,到文件夾中刪除實際的.h.cpp文件;
            3
            、刪除.clw文件;
            4
            、重新進(jìn)入項目,進(jìn)行全部重建(rebuild all)。

            如何建立一個新類?
               
            插入”(Insert)菜單中選擇新建類”(New Class),在彈出的對話框中選擇基類(Base class),在Name中輸入新類的名字(一般都以C開頭)即可。
            如果想要建立一個沒有基類的自定義類,則在New Class對話框中把Class type設(shè)置為generic,再輸入類名即可。

            如何把外來文件添加到項目中?
               
            先把外來文件復(fù)制到當(dāng)前項目的目錄下,從項目”(Project)菜單下選擇添加項目”(Add to Project)下的“Files”菜單項,從彈出的打開文件對話框中把外來文件打開即可。

            如何在一個工作區(qū)中打開多個項目?
               
            一般編程者都有這樣的經(jīng)歷:做了一個項目,由于不滿意,想從頭重做,但又想把舊項目的一些可用內(nèi)容拷到新項目中來,以免做重復(fù)工作,這時就需要在新項目中打開舊項目。
               
            先打開新項目,從項目”(Project)菜單下選擇插入項目到工作區(qū)”(Insert Project into Workspace),從彈出的打開文件對話框中打開舊項目的.asp文件即可。
               
            之后,可以利用項目”(Project)菜單下的設(shè)置活動項目”(Select Active Project)的選項中切換各打開的項目。
            注意:在一個工作區(qū)中打開的各項目不能同名。

            如何把項目中的文件分類存放?
            當(dāng)我們往項目中添加新類時,它會把源文件放在Source Files下,頭文件放在Header Files下。當(dāng)項目中文件很多時,管理不便,最好添加新節(jié)點,把文件分類放置。
            右擊項目節(jié)點樹的根節(jié)點,選擇“New Folder...”,在彈出的對話框中填入新節(jié)點名,則新節(jié)點就建立了,用鼠標(biāo)節(jié)點樹中的文件拖入新節(jié)點,就可以把文件分類了。
            以上分類只是在項目的節(jié)點樹中分類,它不影響文件在磁盤上的位置,所有.cpp文件和.h文件仍在項目的根目錄下,最好文件本身也能分類存放在不同文件夾中。
            Windows下,用新建文件夾在項目的根目錄下建立子文件夾,如DialogClass,把所有對話框類的.cpp文件和.h文件拖入其中。
            回到VC下,右鍵單擊項目樹中更改了路徑的節(jié)點,選擇“Properties”,在彈出的對話框中修改文件路徑,如:把原路徑“.\Dialog1.cpp”改為“.\DialogClass\Dialog1.cpp”
            打開Dialog1.cpp文件,修改它包含的文件路徑。如:
            #include "stdafx.h"
            #include "PluckBox.h"
            #include "Dialog1.h"
            改為:
            #include "stdafx.h"
            #include "..\\PluckBox.h"
            #include "Dialog1.h"
            打開ClassWizard,它會提示你文件不存在,單擊確定后,從對話框中用“Browse...”選擇文件所在路徑,則ClassWizard也可正常使用了。



            編輯
            編輯代碼時,跟隨提示消失了怎么辦?
            單 擊工具”(Tools)菜單中的設(shè)置”(Options)菜單項,在彈出的Options對話框中選擇Editor制表頁,把它最下方的四個復(fù)選框都 選中(Auto list memberAuto type infoCode commentsAuto parameter info),這樣,當(dāng)用戶輸入“->”“.”時,會自動顯示跟隨提示,減少了輸入負(fù)擔(dān)。



            對話框
            如何修改對話框的背景色
            在對話框的OnPaint()函數(shù)中加入下面語句:
            CRect rect;
            GetClientRect(&rect); //
            計算對話框的尺寸
            dc.FillSolidRect(&rect,RGB(192,248,202)); //
            繪制對話框背景色

            如何讓彈出式對話框具有統(tǒng)一的背景色
            在應(yīng)用程序類CxxxAppInitInstance()函數(shù)中加入下面的語句:
            SetDialogBkColor( RGB(192,248,202) );
            則所有用戶定義的彈出式對話框都以RGB(192,248,202)為背景色,就不需要逐個進(jìn)行設(shè)置了。


            如何讓打開文件對話框能進(jìn)行多項選擇
            在定制打開文件對話框時,增加OFN_ALLOWMULTISELECT屬性,就可以使打開文件對話框進(jìn)行多選了。
            如:
            CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
            | OFN_ALLOWMULTISELECT, NULL, NULL );
            之后,用GetStartPosition()函數(shù)獲取選擇的起始文件位置,用GetNextPathName()函數(shù)獲取各位置上的文件名。
            如:
            if( m_Dlg.DoModal() == IDOK )
            {
            POSITION pos;
            pos = m_Dlg.GetStartPosition();
            while( pos )
            {
            m_Path = m_Dlg.GetNextPathName(pos);
            …………
            }
            }

            為什么用打開文件對話框選擇多個文件到一定數(shù)目時,文件沒有打開?
            CFileDialog
            為文件列表設(shè)置有緩沖區(qū),當(dāng)選擇文件過多時,會造成緩沖區(qū)溢出,造成一些文件沒有被打開。可以采用自定義大緩沖區(qū)代替系統(tǒng)緩沖區(qū)的方法解決。
            如:
            CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
            | OFN_ALLOWMULTISELECT, NULL, NULL );//
            定制打開文件對話框
            char* pBuf = new char[20480]; //
            申請緩沖區(qū)
            m_Dlg.m_ofn.nMaxFile = 20480; //
            pBuf代替CFileDialog緩沖區(qū)
            m_Dlg.m_ofn.lpstrFile = pBuf;
            m_Dlg.m_ofn.lpstrFile[0] = NULL;
            …………
            delete []pBuf; //
            回收緩沖區(qū)

            提示對話框(MessageBox
            在視類和對話框類中可使用MFC函數(shù)中用的MessageBox()函數(shù)彈出提示對話框。這個函數(shù)原型為:
            int MessageBox(LPCTSTR lpszText,LPCTSTR lpsCaption=NULL,UINT nType=MB_OK);
            參數(shù):lpszText 顯示的字符串
            lpsCaption
            對話框的標(biāo)題
            nType
            風(fēng)格,可為如下值的組合:
            指定下列標(biāo)志中的一個來顯示消息框中的按鈕,標(biāo)志的含義如下。
            MB_ABORTRETRYIGNORE
            :消息框含有三個按鈕:AbortRetryIgnore
            MB_OK
            :消息框含有一個按鈕:OK。這是缺省值。
            MB_OKCANCEL
            :消息框含有兩個按鈕:OKCancel
            MB_RETRYCANCEL
            :消息框含有兩個按鈕:RetryCancel
            MB_YESNO
            :消息框含有兩個按鈕:YesNo
            MB_YESNOCANCEL
            :消息框含有三個按鈕:YesNoCancel
            指定下列標(biāo)志中的一個來顯示消息框中的圖標(biāo):標(biāo)志的含義如下。
            MB_ICONEXCLAMATION:
            MB_ICONWARNING
            :一個驚嘆號出現(xiàn)在消息框。
            MB_ICONINFORMATION

            MB_ICONASTERISK
            :一個圓圈中小寫字母i組成的圖標(biāo)出現(xiàn)在消息框。
            MB_ICONOUESTION:
            一個問題標(biāo)記圖標(biāo)出現(xiàn)在消息框。
            MB_ICONSTOP:
            MB_ICONERROR

            MB_ICONHAND
            :一個停止消息圖標(biāo)出現(xiàn)在消息框。
            指定下列標(biāo)志中的一個來指定缺省的按鈕:標(biāo)志的含義如下。
            MB_DEFBUTTON1
            :第一個按鈕為缺省按鈕。如果MB_DEFBUTTON2MB_DEFBUTTON3MB_DEFBUTTON4沒有被指定,則MB_DEFBUTTON1為缺省值。
            MB_DEFBUTTON2
            ;第二個按鈕為缺省按鈕。
            MB_DEFBUTTON3
            :第三個按鈕為缺省按鈕。
            MB_DEFBUTTON4
            :第四個按鈕為缺省按鈕。
            例:提示文件是否存盤:
            int t;
            t=MessageBox(m_PathName+"
            的文字已經(jīng)改變,要存盤嗎?",
            "
            警告",MB_YESNOCANCEL | MB_ICONWARNING);
            if(t==0 || t==IDCANCEL)
            return;
            if(t==IDYES)
            OnFileSave();
            在文檔類等其它類中不能使用MFC中的MessageBox()函數(shù),只能使用API函數(shù)中的MessageBox()函數(shù):
            int MessageBox(HWND hWnd,LPCTSTR lpszText,LPCTSTR lpCaption,UINT UType);
            hWnd:
            標(biāo)識將被創(chuàng)建的消息框的擁有窗口。如果此參數(shù)為NULL,則消息框沒有擁有窗口。
            后三個參數(shù)與視類的MessageBox相同,但沒有缺省值,必須設(shè)置。
            例:::MessageBox(NULL,m_PathName+"的文字已經(jīng)改變,要存盤嗎?",
            "
            警告",MB_YESNOCANCEL | MB_ICONWARNING);



            調(diào)試
            error C2146: syntax error : missing ';' before identifier ……
            如果出現(xiàn)這個錯誤且錯誤數(shù)目很多,通常并不是缺失了分號引起的,而是忘記了添加某頭文件引起的。
            最常見的是新加入了對話框,然后用它的類定義了一個對象,再編譯出現(xiàn)上面的錯誤。
            解決方法是在引用新類的文件中加入#include "類名.h",再編譯,錯誤消失。

            fatal error C1010: unexpected end of file while looking for precompiled header directive
            在一個項目中,如果用“New”向工程中添加了一個.cpp文件,編譯,出錯。
            解決方法:
                              1)  在新建的.cpp文件的開頭加入#include "stdafx.h"
                              2)  可以使用右鍵點擊項目工程中的該cpp文件,選擇setting,在c/c++欄,選擇PreCompiled headers,然后設(shè)置第一選項,選擇不使用預(yù)編譯頭,解決這個問題。發(fā)布
            Debug
            模式和Release模式
            早就發(fā)現(xiàn)用VC編譯出來的.exe文件比用Turbo C編譯出來的文件大了許多,于是就認(rèn)為VC編譯時一定加了很多沒用的東西,記得當(dāng)時還做過把VC自動生成的項目中自認(rèn)為沒用的函數(shù)都刪掉的傻事。后來才從網(wǎng)上的文章中了解到還有編譯模式一說。
            Debug
            模式是用來調(diào)試用的,它生成的執(zhí)行文件中含有大量調(diào)試信息,所以很大;
            Release
            模式生成的執(zhí)行文件消除了這些調(diào)試信息,可用來作為成品發(fā)布。
            默 認(rèn)情況下是Debug模式,切換方法是在編譯”(Build)菜單中選設(shè)置項目配置”(Set Active Configure)。從彈出的對話框中選擇Win32 Release模式,然后再重新編譯。這時在工作目錄下會多出一個Release目錄,其中的exe文件比Debug目錄下的那個要小得多。

            動態(tài)鏈接庫和靜態(tài)鏈接庫
            VC 做好了一個程序,拿到別人那里卻不能運行,這也是很多編程者都經(jīng)歷過的,這樣的軟件只能在安裝有VC的機(jī)器上運行,也不應(yīng)拿出去發(fā)布。實際上如果你沒有使 用ActiveX控件和自定義的動態(tài)DLL技術(shù),只需把MFC的動態(tài)鏈接庫打包到你的程序里就可以了,也就是使用靜態(tài)鏈接庫。
            設(shè)置方法:從項目”(Project)菜單下選擇設(shè)置” (Settings),在彈出的對話框中的General選項卡下,把“User MFC in a Shared DLL”改為“User MFC in a Static Library”,關(guān)閉對話框后重新編譯即可。
            在靜態(tài)鏈接庫下編譯的文件比動態(tài)鏈接庫的要大很多,不過,如果使用Release模式編譯,一般也就幾百K,它就可以在沒有安裝VC的機(jī)器上運行了。

            發(fā)布VC源代碼時,哪些文件可以刪除?

            AfxGetMainWnd()->SetWindowText("文檔標(biāo)題"+" - "+"程序標(biāo)題");

             


            四、設(shè)置默認(rèn)按鈕:
            在定義控件變量時,ClassWizard在構(gòu)造函數(shù)中會把變量初值設(shè)為-1,只需把它改為其它值即可。
            如:
            //{{AFX_DATA_INIT(CWEditView)
            m_Ridio1 = 0; //
            初始時第一個單選按鈕被選中
            m_Ridio4 = 0; //
            初始時第四個單選按鈕被選中
            //}}AFX_DATA_INIT

            旋轉(zhuǎn)控件(Spin)的使用
            當(dāng)單擊旋轉(zhuǎn)控件上的按鈕時,相應(yīng)的編輯控件值會增大或減小。其設(shè)置的一般步驟為:
            一、在對話框中放入一個Spin控件和一個編輯控件作為Spin控件的伙伴窗口
            設(shè)置Spin控件屬性:Auto buddySet buddy integerArrow keys
            設(shè)置文本控件屬性:Number
            二、用ClassWizardSpin控件定義變量m_Spin,為編輯控件定義變量m_Edit,定義時注意要把m_Edit設(shè)置為int型。
            三、在對話框的OnInitDialog()函數(shù)中加入語句:
            BOOL CMyDlg::OnInitDialog()
            {
            CDialog::OnInitDialog();

            m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) ); //
            設(shè)置編輯控件為Spin控件的伙伴窗口
            m_Spin.SetRange( 0, 10 ); //
            設(shè)置數(shù)據(jù)范圍為0-10
            return TRUE;
            }
            四、用ClassWizard為編輯控件添加EN_CHANGE消息處理函數(shù),再加入語句:
            void CMyDlg::OnChangeEdit1()
            {
            m_Edit = m_Spin.GetPos(); //
            獲取Spin控件當(dāng)前值
            }

            UpdateData()
            對于可以接收數(shù)據(jù)的控件,如編輯控件來說,UpdateData()函數(shù)至關(guān)重要。當(dāng)控件內(nèi)容發(fā)生變化時,對應(yīng)的控件變量的值并沒有跟著變化,同樣,當(dāng)控件變量值變化時,控件內(nèi)容也不會跟著變。
            UpdateData()
            函數(shù)就是解決這個問題的。
            UpdateData(true);
            把控件內(nèi)容裝入控件變量
            UpdateData(false);
            用控件變量的值更新控件
            如:有編輯控件IDC_EDIT1,對應(yīng)的變量為字符串m_Edit1
            1
            、修改變量值并顯示在控件中:
            m_Edit1 = _T("結(jié)果為50");
            UpdateData(false);
            2
            、讀取控件的值到變量中:
            ClassWizardIDC_EDIT1添加EN_CHANGE消息處理函數(shù),這個函數(shù)在編輯控件內(nèi)容發(fā)生變化時執(zhí)行。
            void CEditView::OnChangeEdit1()
            {
            UpdateData(true); //
            更新變量值
            }



            其它
            如何獲取程序所在的路徑
            也就是獲取你這個程序本身所在的路徑。
            在應(yīng)用程序類CxxApp的頭文件中定義一個變量CString m_exePath;用來放置程序的路徑名,在應(yīng)用程序類CxxAppInitInstance()函數(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] = '\0';
            m_exePath.Format( "%s", m_Path ); //
            分離路徑名(去掉程序名)
            這段程序執(zhí)行后,字符串變量m_exePath中放置的就是程序所在路徑,其中不包括程序名。
            獲取程序的位置有什么用呢?
            1
            、打開與應(yīng)用程序在一起放置的數(shù)據(jù)文件:
            如果你運行程序過程中使用過打開文件對話框打開過其它路徑下的文件,這時系統(tǒng)的默認(rèn)路徑就發(fā)生了改變,有可能使你原定的數(shù)據(jù)文件打不開了,如果采用以下方法就可以沒問題了:
            CFile file;
            file.Open( m_exePath+"
            數(shù)據(jù)文件名", CFile::modeRead );
            2
            、放置程序運行中的臨時文件:
            同樣,當(dāng)系統(tǒng)的默認(rèn)路徑發(fā)生改變后,程序中生成的臨時文件就會放得到處都是,成了一個個垃圾文件,采用以下方法可使臨時文件只放在程序所在路徑下:
            CFile file;
            file.Open( m_exePath+"
            臨時文件名", CFile::modeCreate | CFile::modeWrite );
            ……
            程序結(jié)束時,用下面的方法刪除臨時文件:
            CFile::Remove( m_exePath+"
            臨時文件名" );

            如何在你的程序中執(zhí)行其它程序
            在自己的程序中調(diào)用其它程序的方法有好幾種,這里我介紹我用過的兩種:
            一、WinExec()函數(shù):
            一般用法:WinExec(m_PathName,SW_SHOWNORMAL);
            m_PathName
            為執(zhí)行程序的路徑名,必須為可執(zhí)行文件。
            如:WinExec("C:\\Program Files\\Internet Explorer\\iexplore.exe",SW_SHOWNORMAL);為打開IE瀏覽器


            BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) 
            {
                CFile file;
                
            if(b_Flag) //b_Flag為文檔修改標(biāo)志,在修改文檔時將其置為True
                {
                    
            int t;
                    t
            =::MessageBox(NULL,"文字已經(jīng)改變,要存盤嗎?","警告",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); 
            //數(shù)據(jù)寫入文件
                        file.Close();
                    }

                }

            return CDocument::CanCloseFrame(pFrame);
            }

             

             





            二、ShellExecute()函數(shù):
            一般用法:ShellExecute(NULL,NULL,m_PathName,NULL,_T("c:\\temp"),SW_SHOWNORMAL);
            m_PathName
            為打開的程序路徑名;
            _T("c:\\temp")
            為工作目錄;
            WinExec()不同的是ShellExecute()函數(shù)也可以打開非可執(zhí)行文件,比如你指定的文件為.txt,結(jié)果會打開記事本裝入該文件。我用這種方法調(diào)用自己制作的幫助文件(.chm)效果很好。

            如果不使用串行化,如何在程序結(jié)束時保存文件?
            在文檔-視圖結(jié)構(gòu)中,用串行化自動保存文件在各種VC書上都有介紹。現(xiàn)在的問題是我不使用串行化,而是自己動手保存,當(dāng)點擊窗口的關(guān)閉按鈕時,如何提示并保存文檔。
            ClassWizard在文檔類(CxxDoc)中添加函數(shù)CanCloseFrame(),再在其中加入保存文件的語句就可以了。
            例:

            BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) 
            {
                CFile file;
                
            if(b_Flag) //b_Flag為文檔修改標(biāo)志,在修改文檔時將其置為True
                {
                    
            int t;
                    t
            =::MessageBox(NULL,"文字已經(jīng)改變,要存盤嗎?","警告",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); 
            //數(shù)據(jù)寫入文件
                        file.Close();
                    }

                }

            return CDocument::CanCloseFrame(pFrame);
            }


            //


            退出程序這樣當(dāng)你單擊窗口上的關(guān)閉按鈕時,如果數(shù)據(jù)已修改了,就會彈出一個提示保存數(shù)據(jù)的對話框,提示你保存數(shù)據(jù)。
            程序中的b_Flag是數(shù)據(jù)修改標(biāo)志,應(yīng)該在修改數(shù)據(jù)時進(jìn)行設(shè)置,m_Text是準(zhǔn)備保存的數(shù)據(jù),放在文檔內(nèi)。

            POSITION
            怎么用?
            POSITION
            類型數(shù)據(jù)用于表征各種列表中元素的位置,它類似于數(shù)組的下標(biāo),但又有所不同。主要區(qū)別是:
            我們不能訪問POSITION型數(shù)據(jù)的值,也不能對POSITION數(shù)據(jù)型數(shù)據(jù)進(jìn)行加減、比較等運算。
            POSITION型數(shù)據(jù)訪問列表時,都是采用迭代法,一般格式為:
            POSITION pos; //
            定義pos型變量
            pos = GetHeadPosition(); //
            獲取列表起始元素位置
            while( pos )
            {
            x = GetNext(pos); //
            獲取pos處的列表值,同時修改pos為下一個元素位置
            }
            GetNext()
            就是一種迭代,其格式為:
            TYPE GetNext(POSITION& rPosition);
            首先,它返回當(dāng)前pos位置處的元素;再就是把pos值修改為下一個元素位置。這樣循環(huán)時,可依次取得列表中各元素的值;當(dāng)?shù)竭_(dá)列表尾時,posNULL,循環(huán)結(jié)束。
            所以使用POSITION型數(shù)據(jù)時,你不要試圖用加減等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反復(fù)迭代來修改它的值。
            如果你想直接到達(dá)指定值,還可以用Find()函數(shù)或FindIndex()函數(shù)獲得指定值的POSITION值。
            POSITION Find(TYPE Value);
            用于在列表中查找值為Value的元素的POSITION值;
            POSITION FindIndex(int nIndex);
            用于獲取列表中第nIndex個元素的POSITION值,nIndex0開始。
            如:
            pos = FindIndex(5); //
            求列表中第5個元素的位置
            x = GetNext(pos); //
            讀取元素的值
            總之,POSITION類型在多種涉及列表的類中提供,不同的類提供的函數(shù)有所不同,但用法都是類似的。

            如何從完整的文件路徑中分離文件名和路徑名?
            從路徑中分離文件名:

            CString GetFileName(CString pathname)
            {
                
            forint 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 );
            }

            posted on 2008-05-04 21:02 wrh 閱讀(542) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2008年11月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            統(tǒng)計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品多毛少妇人妻AV免费久久| 久久久精品国产亚洲成人满18免费网站 | 精品久久人人做人人爽综合| 久久久久亚洲国产| 91精品观看91久久久久久 | 99精品久久精品| 久久99久久99精品免视看动漫 | 99久久99久久精品国产片| 午夜精品久久久久9999高清| 国产精品久久久99| 国产午夜电影久久| 亚洲熟妇无码另类久久久| 久久91这里精品国产2020| 日韩人妻无码一区二区三区久久 | 国内精品久久国产| 香蕉久久夜色精品国产尤物| 久久国产免费观看精品| 国内精品久久人妻互换| 99久久久精品| 国产激情久久久久久熟女老人 | 精品久久人妻av中文字幕| 欧美精品一区二区久久 | 99久久精品免费国产大片| 性欧美大战久久久久久久久| 香蕉久久夜色精品升级完成| 日本欧美国产精品第一页久久| 99久久99这里只有免费费精品| 久久婷婷人人澡人人爽人人爱| 久久精品无码一区二区app| 日本免费一区二区久久人人澡| 中文字幕亚洲综合久久| 99热成人精品热久久669| 久久精品蜜芽亚洲国产AV| 国产 亚洲 欧美 另类 久久 | 国内精品九九久久精品 | 国产精品无码久久综合网| 久久久久国产精品| 久久亚洲欧美日本精品| 香港aa三级久久三级| 国产精品热久久无码av| 久久精品国产99久久丝袜|