欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
VC小技巧收集(轉載自風(fēng)林的家)
VC小技巧收集
來(lái)源:風(fēng)林的家

窗口篇
讓窗口一啟動(dòng)就最大化
把應用程序類(lèi)(CxxxApp)的 InitInstance() 函數中的
m_pMainWnd->ShowWindow(SW_SHOW); 改為
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
則窗口一啟動(dòng)就最大化顯示。
如何設置窗口的初始尺寸
在將應用程序類(lèi)(CxxAPP)的 InitInstance() 函數中加入:
m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);
Width為窗口寬度,Height為窗口高度
SWP_NOMOVE表示忽略位置(x,y)。

如:

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);//設置窗口的初始大小為750*555
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();

    return TRUE;
}

讓窗口居中顯示
以下兩種方法可任選其一:

①在應用程序類(lèi)(CxxxApp)的 InitInstance() 函數中加入:
m_pMainWnd->CenterWindow( GetDesktopWindow() );

②在主框架類(lèi)(MainFrm.cpp)的OnCreate()函數中加入:
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() ); //使窗口打開(kāi)時(shí)處于屏幕正中

    return 0;
}

如何修改窗口標題

窗口標題一般形式為:文檔標題 - 程序標題

1、設置文檔標題:

在文檔類(lèi)(CxxxDoc)的OnNewDocument()函數中加入語(yǔ)句:SetTitle("文檔名");

如:TextEditorDoc.cpp:

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

2、設置程序標題:

在框架類(lèi)(CMainFrame)的PreCreateWindow()函數中加入語(yǔ)句:m_strTitle = _T("程序標題");

如: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
    m_strTitle = _T("文本整理器");    //設置程序標題
    return TRUE;
}

以上兩點(diǎn)比較適用于視圖-文檔結構的程序,在新建文檔時(shí),系統會(huì )自動(dòng)運行OnNewDocument()函數,在其中可以設置合適的標題。對于未采用文檔的程序可以用下面的方法修改標題:

3、修改窗口標題:

修改窗口標題一般在打開(kāi)文件函數OnFileOpen()和另存為函數OnFileSaveAs()中進(jìn)行,可以使用下面的函數:

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

其中文檔標題和程序標題可使用定義過(guò)的串變量。


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

從“插入”(Insert)菜單中選擇“新建類(lèi)”(New Class),在彈出的對話(huà)框中選擇基類(lèi)(Base class),在Name中輸入新類(lèi)的名字(一般都以C開(kāi)頭)即可。

如果想要建立一個(gè)沒(méi)有基類(lèi)的自定義類(lèi),則在New Class對話(huà)框中把Class type設置為generic,再輸入類(lèi)名即可。

如何把外來(lái)文件添加到項目中?
先把外來(lái)文件復制到當前項目的目錄下,從“項目”(Project)菜單下選擇“添加項目”(Add to Project)下的“Files”菜單項,從彈出的打開(kāi)文件對話(huà)框中把外來(lái)文件打開(kāi)即可。
如何在一個(gè)工作區中打開(kāi)多個(gè)項目?

一般編程者都有這樣的經(jīng)歷:做了一個(gè)項目,由于不滿(mǎn)意,想從頭重做,但又想把舊項目的一些可用內容拷到新項目中來(lái),以免做重復工作,這時(shí)就需要在新項目中打開(kāi)舊項目。

先打開(kāi)新項目,從“項目”(Project)菜單下選擇“插入項目到工作區”(Insert Project into Workspace),從彈出的打開(kāi)文件對話(huà)框中打開(kāi)舊項目的.asp文件即可。

之后,可以利用“項目”(Project)菜單下的“設置活動(dòng)項目”(Select Active Project)的選項中切換各打開(kāi)的項目。

注意:在一個(gè)工作區中打開(kāi)的各項目不能同名。

如何把項目中的文件分類(lèi)存放?

當我們往項目中添加新類(lèi)時(shí),它會(huì )把源文件放在Source Files下,頭文件放在Header Files下。當項目中文件很多時(shí),管理不便,最好添加新節點(diǎn),把文件分類(lèi)放置。

右擊項目節點(diǎn)樹(shù)的根節點(diǎn),選擇“New Folder...”,在彈出的對話(huà)框中填入新節點(diǎn)名,則新節點(diǎn)就建立了,用鼠標節點(diǎn)樹(shù)中的文件拖入新節點(diǎn),就可以把文件分類(lèi)了。

以上分類(lèi)只是在項目的節點(diǎn)樹(shù)中分類(lèi),它不影響文件在磁盤(pán)上的位置,所有.cpp文件和.h文件仍在項目的根目錄下,最好文件本身也能分類(lèi)存放在不同文件夾中。

在Windows下,用“新建文件夾”在項目的根目錄下建立子文件夾,如DialogClass,把所有對話(huà)框類(lèi)的.cpp文件和.h文件拖入其中。

回到VC下,右鍵單擊項目樹(shù)中更改了路徑的節點(diǎn),選擇“Properties”,在彈出的對話(huà)框中修改文件路徑,如:把原路徑“.\Dialog1.cpp”改為“.\DialogClass\Dialog1.cpp”。

打開(kāi)Dialog1.cpp文件,修改它包含的文件路徑。如:
#include "stdafx.h"
#include "PluckBox.h"
#include "Dialog1.h"
改為:
#include "stdafx.h"
#include "..\\PluckBox.h"
#include "Dialog1.h"

打開(kāi)ClassWizard,它會(huì )提示你文件不存在,單擊“確定”后,從對話(huà)框中用“Browse...”選擇文件所在路徑,則ClassWizard也可正常使用了。


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

對話(huà)框篇
如何修改對話(huà)框的背景色

在對話(huà)框的OnPaint()函數中加入下面語(yǔ)句:

CRect rect;
GetClientRect(&rect);      //計算對話(huà)框的尺寸
dc.FillSolidRect(&rect,RGB(192,248,202));   //繪制對話(huà)框背景色

如何讓彈出式對話(huà)框具有統一的背景色

在應用程序類(lèi)CxxxApp的InitInstance()函數中加入下面的語(yǔ)句:

SetDialogBkColor( RGB(192,248,202) );

則所有用戶(hù)定義的彈出式對話(huà)框都以RGB(192,248,202)為背景色,就不需要逐個(gè)進(jìn)行設置了。

如何讓打開(kāi)文件對話(huà)框能進(jìn)行多項選擇

在定制打開(kāi)文件對話(huà)框時(shí),增加OFN_ALLOWMULTISELECT屬性,就可以使打開(kāi)文件對話(huà)框進(jìn)行多選了。

如:
CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
       | OFN_ALLOWMULTISELECT, NULL, NULL );

之后,用GetStartPosition()函數獲取選擇的起始文件位置,用GetNextPathName()函數獲取各位置上的文件名。

如:
if( m_Dlg.DoModal() == IDOK )
{
     POSITION pos;
     pos = m_Dlg.GetStartPosition();
     while( pos )
     {
          m_Path = m_Dlg.GetNextPathName(pos);
          …………
     }
}

為什么用打開(kāi)文件對話(huà)框選擇多個(gè)文件到一定數目時(shí),文件沒(méi)有打開(kāi)?

CFileDialog為文件列表設置有緩沖區,當選擇文件過(guò)多時(shí),會(huì )造成緩沖區溢出,造成一些文件沒(méi)有被打開(kāi)??梢圆捎米远x大緩沖區代替系統緩沖區的方法解決。

如:
CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
       | OFN_ALLOWMULTISELECT, NULL, NULL );//定制打開(kāi)文件對話(huà)框
char* pBuf = new char[20480];       //申請緩沖區
m_Dlg.m_ofn.nMaxFile = 20480;       //讓pBuf代替CFileDialog緩沖區
m_Dlg.m_ofn.lpstrFile = pBuf;
m_Dlg.m_ofn.lpstrFile[0] = NULL;
…………
delete []pBuf;       //回收緩沖區

提示對話(huà)框(MessageBox)

在視類(lèi)和對話(huà)框類(lèi)中可使用MFC函數中用的MessageBox()函數彈出提示對話(huà)框。這個(gè)函數原型為:

int MessageBox(LPCTSTR lpszText,LPCTSTR lpsCaption=NULL,UINT nType=MB_OK);

參數:lpszText 顯示的字符串
lpsCaption 對話(huà)框的標題
nType 風(fēng)格,可為如下值的組合:

指定下列標志中的一個(gè)來(lái)顯示消息框中的按鈕,標志的含義如下。

MB_ABORTRETRYIGNORE:消息框含有三個(gè)按鈕:Abort,Retry和Ignore。
MB_OK:消息框含有一個(gè)按鈕:OK。這是缺省值。
MB_OKCANCEL:消息框含有兩個(gè)按鈕:OK和Cancel。
MB_RETRYCANCEL:消息框含有兩個(gè)按鈕:Retry和Cancel。
MB_YESNO:消息框含有兩個(gè)按鈕:Yes和No。
MB_YESNOCANCEL:消息框含有三個(gè)按鈕:Yes,No和Cancel。

指定下列標志中的一個(gè)來(lái)顯示消息框中的圖標:標志的含義如下。

MB_ICONEXCLAMATION:
MB_ICONWARNING:一個(gè)驚嘆號出現在消息框。
MB_ICONINFORMATION:
MB_ICONASTERISK:一個(gè)圓圈中小寫(xiě)字母i組成的圖標出現在消息框。
MB_ICONOUESTION:一個(gè)問(wèn)題標記圖標出現在消息框。
MB_ICONSTOP:
MB_ICONERROR:
MB_ICONHAND:一個(gè)停止消息圖標出現在消息框。

指定下列標志中的一個(gè)來(lái)指定缺省的按鈕:標志的含義如下。

MB_DEFBUTTON1:第一個(gè)按鈕為缺省按鈕。如果MB_DEFBUTTON2,MB_DEFBUTTON3,MB_DEFBUTTON4沒(méi)有被指定,則MB_DEFBUTTON1為缺省值。
MB_DEFBUTTON2;第二個(gè)按鈕為缺省按鈕。
MB_DEFBUTTON3:第三個(gè)按鈕為缺省按鈕。
MB_DEFBUTTON4:第四個(gè)按鈕為缺省按鈕。

例:提示文件是否存盤(pán):
int t;
t=MessageBox(m_PathName+"的文字已經(jīng)改變,要存盤(pán)嗎?",
"警告",MB_YESNOCANCEL | MB_ICONWARNING);
if(t==0 || t==IDCANCEL)
    return;
if(t==IDYES)
    OnFileSave();

在文檔類(lèi)等其它類(lèi)中不能使用MFC中的MessageBox()函數,只能使用API函數中的MessageBox()函數:

int MessageBox(HWND hWnd,LPCTSTR lpszText,LPCTSTR lpCaption,UINT UType);

hWnd:標識將被創(chuàng )建的消息框的擁有窗口。如果此參數為NULL,則消息框沒(méi)有擁有窗口。
后三個(gè)參數與視類(lèi)的MessageBox相同,但沒(méi)有缺省值,必須設置。

例:::MessageBox(NULL,m_PathName+"的文字已經(jīng)改變,要存盤(pán)嗎?",
"警告",MB_YESNOCANCEL | MB_ICONWARNING);


調試篇
error C2146: syntax error : missing ';' before identifier ……

如果出現這個(gè)錯誤且錯誤數目很多,通常并不是缺失了分號引起的,而是忘記了添加某頭文件引起的。

最常見(jiàn)的是新加入了對話(huà)框,然后用它的類(lèi)定義了一個(gè)對象,再編譯出現上面的錯誤。

解決方法是在引用新類(lèi)的文件中加入#include "類(lèi)名.h",再編譯,錯誤消失。

fatal error C1010: unexpected end of file while looking for precompiled header directive

在一個(gè)項目中,如果用“New”向工程中添加了一個(gè).cpp文件,編譯,出錯。

解決方法:在新建的.cpp文件的開(kāi)頭加入#include "stdafx.h"。


發(fā)布篇
Debug模式和Release模式

早就發(fā)現用VC編譯出來(lái)的.exe文件比用Turbo C編譯出來(lái)的文件大了許多,于是就認為VC編譯時(shí)一定加了很多沒(méi)用的東西,記得當時(shí)還做過(guò)把VC自動(dòng)生成的項目中自認為沒(méi)用的函數都刪掉的傻事。后來(lái)才從網(wǎng)上的文章中了解到還有編譯模式一說(shuō)。

Debug模式是用來(lái)調試用的,它生成的執行文件中含有大量調試信息,所以很大;

Release模式生成的執行文件消除了這些調試信息,可用來(lái)作為成品發(fā)布。

默認情況下是Debug模式,切換方法是在“編譯”(Build)菜單中選“設置項目配置”(Set Active Configure)。從彈出的對話(huà)框中選擇Win32 Release模式,然后再重新編譯。這時(shí)在工作目錄下會(huì )多出一個(gè)Release目錄,其中的exe文件比Debug目錄下的那個(gè)要小得多。

動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫

用VC做好了一個(gè)程序,拿到別人那里卻不能運行,這也是很多編程者都經(jīng)歷過(guò)的,這樣的軟件只能在安裝有VC的機器上運行,也不應拿出去發(fā)布。實(shí)際上如果你沒(méi)有使用ActiveX控件和自定義的動(dòng)態(tài)DLL技術(shù),只需把MFC的動(dòng)態(tài)鏈接庫打包到你的程序里就可以了,也就是使用靜態(tài)鏈接庫。

設置方法:從“項目”(Project)菜單下選擇“設置”(Settings),在彈出的對話(huà)框中的General選項卡下,把“User MFC in a Shared DLL”改為“User MFC in a Static Library”,關(guān)閉對話(huà)框后重新編譯即可。

在靜態(tài)鏈接庫下編譯的文件比動(dòng)態(tài)鏈接庫的要大很多,不過(guò),如果使用Release模式編譯,一般也就幾百K,它就可以在沒(méi)有安裝VC的機器上運行了。

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

源代碼是給其他VC愛(ài)好者提供參考的,如果把所有文件都打包會(huì )很大,而且也沒(méi)有必要,所以為他人提供源代碼時(shí)可以刪除一些不必要的文件。

①可刪除Debug文件夾和Release文件夾;

②原則上還可刪除主文件夾中所有圖標為

的文件,包括.aps、.ncb、.opt、.plg等文件,它們都能在編譯時(shí)重建。但一般.clw不要刪除,它可能導致ClassWizard不好用。


控件篇
如何隱藏和顯示控件
用CWnd類(lèi)的函數BOOL ShowWindow(int nCmdShow)可以隱藏或顯示一個(gè)控件。

例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 );     //顯示控件

按鈕的使能與禁止
用ClassWizard的Member Variables為按鈕定義變量,如:m_Button1;

m_Button1.EnableWindow(true);    使按鈕處于允許狀態(tài)
m_Button1.EnableWindow(false);   使按鈕被禁止,并變灰顯示
改變控件的大小和位置

用CWnd類(lèi)的函數MoveWindow()或SetWindowPos()可以改變控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);

第一種用法需給出控件新的坐標和寬度、高度;
第二種用法給出存放位置的CRect對象;

例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //獲取控件指針,IDC_EDIT1為控件ID號
pWnd->MoveWindow( CRect(0,0,100,100) );  //在窗口左上角顯示一個(gè)寬100、高100的編輯控件

SetWindowPos()函數使用更靈活,多用于只修改控件位置而大小不變或只修改大小而位置不變的情況:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一個(gè)參數一般設為NULL;
x、y控件位置;cx、cy控件寬度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一個(gè)參數;
SWP_NOMOVE:忽略x、y,維持位置不變;
SWP_NOSIZE:忽略cx、cy,維持大小不變;

例:
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 ); //把編輯控件的大小設為(100,80),位置不變
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );  //編輯控件的大小和位置都改變

以上方法也適用于各種窗口。

單選按鈕控件(Radio Button)的使用

一、對單選按鈕進(jìn)行分組:

每組的第一個(gè)單選按鈕設置屬性:Group,Tabstop,Auto;其余按鈕設置屬性Tabstop,Auto。

如:
Radio1、Radio2、Radio3為一組,Radio4、Radio5為一組

設定Radio1屬性:Group,Tabstop,Auto
設定Radio2屬性:Tabstop,Auto
設定Radio3屬性:Tabstop,Auto

設定Radio4屬性:Group,Tabstop,Auto
設定Radio5屬性:Tabstop,Auto

二、用ClassWizard為單選控件定義變量,每組只能定義一個(gè)。如:m_Radio1、m_Radio4。

三、用ClassWizard生成各單選按鈕的單擊消息函數,并加入內容:

void CWEditView::OnRadio1()
{
    m_Radio1 = 0;    //第一個(gè)單選按鈕被選中
}

void CWEditView::OnRadio2()
{
    m_Radio1 = 1;    //第二個(gè)單選按鈕被選中
}

void CWEditView::OnRadio3()
{
    m_Radio1 = 2;    //第三個(gè)單選按鈕被選中
}

void CWEditView::OnRadio4()
{
    m_Radio4 = 0;    //第四個(gè)單選按鈕被選中
}

void CWEditView::OnRadio5()
{
    m_Radio4 = 1;    //第五個(gè)單選按鈕被選中
}

當控件變量值為0時(shí),它對應組的第一個(gè)單選按鈕處于選中狀態(tài)。

四、設置默認按鈕:

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

旋轉控件(Spin)的使用

當單擊旋轉控件上的按鈕時(shí),相應的編輯控件值會(huì )增大或減小。其設置的一般步驟為:

一、在對話(huà)框中放入一個(gè)Spin控件和一個(gè)編輯控件作為Spin控件的伙伴窗口

設置Spin控件屬性:Auto buddy、Set buddy integer、Arrow keys
設置文本控件屬性:Number

二、用ClassWizard為Spin控件定義變量m_Spin,為編輯控件定義變量m_Edit,定義時(shí)注意要把m_Edit設置為int型。

三、在對話(huà)框的OnInitDialog()函數中加入語(yǔ)句:

BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) );  //設置編輯控件為Spin控件的伙伴窗口
    m_Spin.SetRange( 0, 10 );    //設置數據范圍為0-10
    return TRUE;
}

四、用ClassWizard為編輯控件添加EN_CHANGE消息處理函數,再加入語(yǔ)句:

void CMyDlg::OnChangeEdit1()
{
    m_Edit = m_Spin.GetPos();    //獲取Spin控件當前值
}

UpdateData()

對于可以接收數據的控件,如編輯控件來(lái)說(shuō),UpdateData()函數至關(guān)重要。當控件內容發(fā)生變化時(shí),對應的控件變量的值并沒(méi)有跟著(zhù)變化,同樣,當控件變量值變化時(shí),控件內容也不會(huì )跟著(zhù)變。

UpdateData()函數就是解決這個(gè)問(wèn)題的。

UpdateData(true);    把控件內容裝入控件變量
UpdateData(false);   用控件變量的值更新控件

如:有編輯控件IDC_EDIT1,對應的變量為字符串m_Edit1,

1、修改變量值并顯示在控件中:

m_Edit1 = _T("結果為50");
UpdateData(false);

2、讀取控件的值到變量中:

用ClassWizard為IDC_EDIT1添加EN_CHANGE消息處理函數,這個(gè)函數在編輯控件內容發(fā)生變化時(shí)執行。

void CEditView::OnChangeEdit1()
{
    UpdateData(true);    //更新變量值
}


其它
如何獲取程序所在的路徑

也就是獲取你這個(gè)程序本身所在的路徑。

在應用程序類(lèi)CxxApp的頭文件中定義一個(gè)變量CString m_exePath;用來(lái)放置程序的路徑名,在應用程序類(lèi)CxxApp的InitInstance()函數中加入如下語(yǔ)句:

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 );    //分離路徑名(去掉程序名)

這段程序執行后,字符串變量m_exePath中放置的就是程序所在路徑,其中不包括程序名。

獲取程序的位置有什么用呢?

1、打開(kāi)與應用程序在一起放置的數據文件:

如果你運行程序過(guò)程中使用過(guò)打開(kāi)文件對話(huà)框打開(kāi)過(guò)其它路徑下的文件,這時(shí)系統的默認路徑就發(fā)生了改變,有可能使你原定的數據文件打不開(kāi)了,如果采用以下方法就可以沒(méi)問(wèn)題了:

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

2、放置程序運行中的臨時(shí)文件:

同樣,當系統的默認路徑發(fā)生改變后,程序中生成的臨時(shí)文件就會(huì )放得到處都是,成了一個(gè)個(gè)垃圾文件,采用以下方法可使臨時(shí)文件只放在程序所在路徑下:

CFile file;
file.Open( m_exePath+"臨時(shí)文件名", CFile::modeCreate | CFile::modeWrite );
……

程序結束時(shí),用下面的方法刪除臨時(shí)文件:

CFile::Remove( m_exePath+"臨時(shí)文件名" );

如何在你的程序中執行其它程序

在自己的程序中調用其它程序的方法有好幾種,這里我介紹我用過(guò)的兩種:

一、WinExec()函數:

一般用法:WinExec(m_PathName,SW_SHOWNORMAL);

m_PathName為執行程序的路徑名,必須為可執行文件。

如:WinExec("C:\\Program Files\\Internet Explorer\\iexplore.exe",SW_SHOWNORMAL);為打開(kāi)IE瀏覽器

二、ShellExecute()函數:

一般用法:ShellExecute(NULL,NULL,m_PathName,NULL,_T("c:\\temp"),SW_SHOWNORMAL);

m_PathName為打開(kāi)的程序路徑名;
_T("c:\\temp")為工作目錄;

與WinExec()不同的是ShellExecute()函數也可以打開(kāi)非可執行文件,比如你指定的文件為.txt,結果會(huì )打開(kāi)記事本裝入該文件。我用這種方法調用自己制作的幫助文件(.chm)效果很好。

如果不使用串行化,如何在程序結束時(shí)保存文件?

在文檔-視圖結構中,用串行化自動(dòng)保存文件在各種VC書(shū)上都有介紹?,F在的問(wèn)題是我不使用串行化,而是自己動(dòng)手保存,當點(diǎn)擊窗口的關(guān)閉按鈕時(shí),如何提示并保存文檔。

用ClassWizard在文檔類(lèi)(CxxDoc)中添加函數CanCloseFrame(),再在其中加入保存文件的語(yǔ)句就可以了。

例:

//退出程序
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame)
{
    CFile file;
    if(b_Flag)    //b_Flag為文檔修改標志,在修改文檔時(shí)將其置為T(mén)rue
    {
        int t;
        t=::MessageBox(NULL,"文字已經(jīng)改變,要存盤(pán)嗎?","警告",
            MB_YESNOCANCEL | MB_ICONWARNING);    //彈出提示對話(huà)框
        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); //定制文件對話(huà)框

            int k=m_Dlg.DoModal(); //彈出文件對話(huà)框
            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); //數據寫(xiě)入文件
            file.Close();
        }
    }
    return CDocument::CanCloseFrame(pFrame);
}

這樣當你單擊窗口上的關(guān)閉按鈕時(shí),如果數據已修改了,就會(huì )彈出一個(gè)提示保存數據的對話(huà)框,提示你保存數據。

程序中的b_Flag是數據修改標志,應該在修改數據時(shí)進(jìn)行設置,m_Text是準備保存的數據,放在文檔內。

POSITION怎么用?

POSITION類(lèi)型數據用于表征各種列表中元素的位置,它類(lèi)似于數組的下標,但又有所不同。主要區別是:

我們不能訪(fǎng)問(wèn)POSITION型數據的值,也不能對POSITION數據型數據進(jìn)行加減、比較等運算。

用POSITION型數據訪(fǎng)問(wèn)列表時(shí),都是采用迭代法,一般格式為:

POSITION pos;        //定義pos型變量
pos = GetHeadPosition();    //獲取列表起始元素位置
while( pos )
{
    x = GetNext(pos);    //獲取pos處的列表值,同時(shí)修改pos為下一個(gè)元素位置
}

GetNext()就是一種迭代,其格式為:

TYPE GetNext(POSITION& rPosition);

首先,它返回當前pos位置處的元素;再就是把pos值修改為下一個(gè)元素位置。這樣循環(huán)時(shí),可依次取得列表中各元素的值;當到達列表尾時(shí),pos為NULL,循環(huán)結束。

所以使用POSITION型數據時(shí),你不要試圖用加減等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反復迭代來(lái)修改它的值。

如果你想直接到達指定值,還可以用Find()函數或FindIndex()函數獲得指定值的POSITION值。

POSITION Find(TYPE Value);用于在列表中查找值為Value的元素的POSITION值;

POSITION FindIndex(int nIndex);用于獲取列表中第nIndex個(gè)元素的POSITION值,nIndex從0開(kāi)始。

如:

pos = FindIndex(5);    //求列表中第5個(gè)元素的位置
x = GetNext(pos);      //讀取元素的值

總之,POSITION類(lèi)型在多種涉及列表的類(lèi)中提供,不同的類(lèi)提供的函數有所不同,但用法都是類(lèi)似的。

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

從路徑中分離文件名:

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 );
}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VC編程經(jīng)驗匯總
c語(yǔ)言
CStatic控件的基本使用
MFC 對話(huà)框Picture Control(圖片控件)中靜態(tài)和動(dòng)態(tài)顯示Bmp圖片
如何改變控件的字體和字體顏色
VC++之隨父窗口變化調整控件大小
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久