青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

VC常用小技巧

窗口

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

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

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



控件
如何隱藏和顯示控件
CWnd類的函數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);
使按鈕處于允許狀態
m_Button1.EnableWindow(false);
使按鈕被禁止,并變灰顯示

改變控件的大小和位置
CWnd類的函數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) ); //
在窗口左上角顯示一個寬100、高100的編輯控件
SetWindowPos()
函數使用更靈活,多用于只修改控件位置而大小不變或只修改大小而位置不變的情況:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一個參數一般設為NULL;
x
、y控件位置;cx、cy控件寬度和高度;
nFlags
常用取值:
SWP_NOZORDER
:忽略第一個參數;
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 ); //
把編輯控件的大小設為(100,80),位置不變
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //
編輯控件的大小和位置都改變
以上方法也適用于各種窗口。

單選按鈕控件(Radio Button)的使用
一、對單選按鈕進行分組:
每組的第一個單選按鈕設置屬性:Group,Tabstop,Auto;其余按鈕設置屬性Tabstop,Auto
如:
Radio1
、Radio2、Radio3為一組,Radio4、Radio5為一組
設定Radio1屬性:Group,TabstopAuto
設定Radio2屬性:Tabstop,Auto
設定Radio3屬性:Tabstop,Auto
設定Radio4屬性:Group,TabstopAuto
設定Radio5屬性:Tabstop,Auto
二、用ClassWizard為單選控件定義變量,每組只能定義一個。如:m_Radio1、m_Radio4。
三、用ClassWizard生成各單選按鈕的單擊消息函數,并加入內容:
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; //
第五個單選按鈕被選中
}
當控件變量值為0時,它對應組的第一個單選按鈕處于選中狀態。

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


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"); //設置文檔標題 
return TRUE; 
}


2、設置程序標題:
在框架類(CMainFrame)PreCreateWindow()函數中加入語句: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 
cs.style&=~FWS_ADDTOTITLE;//去除標題欄文字前面的"無標題"
m_strTitle = _T("文本整理器"); //設置程序標題 
return TRUE; 
}

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



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

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

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

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

如何把項目中的文件分類存放?
當我們往項目中添加新類時,它會把源文件放在Source Files下,頭文件放在Header Files下。當項目中文件很多時,管理不便,最好添加新節點,把文件分類放置。
右擊項目節點樹的根節點,選擇“New Folder...”,在彈出的對話框中填入新節點名,則新節點就建立了,用鼠標節點樹中的文件拖入新節點,就可以把文件分類了。
以上分類只是在項目的節點樹中分類,它不影響文件在磁盤上的位置,所有.cpp文件和.h文件仍在項目的根目錄下,最好文件本身也能分類存放在不同文件夾中。
Windows下,用新建文件夾在項目的根目錄下建立子文件夾,如DialogClass,把所有對話框類的.cpp文件和.h文件拖入其中。
回到VC下,右鍵單擊項目樹中更改了路徑的節點,選擇“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)菜單中的設置”(Options)菜單項,在彈出的Options對話框中選擇Editor制表頁,把它最下方的四個復選框都 選中(Auto list memberAuto type info、Code comments、Auto parameter info),這樣,當用戶輸入“->”“.”時,會自動顯示跟隨提示,減少了輸入負擔。



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

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


如何讓打開文件對話框能進行多項選擇
在定制打開文件對話框時,增加OFN_ALLOWMULTISELECT屬性,就可以使打開文件對話框進行多選了。
如:
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);
…………
}
}

為什么用打開文件對話框選擇多個文件到一定數目時,文件沒有打開?
CFileDialog
為文件列表設置有緩沖區,當選擇文件過多時,會造成緩沖區溢出,造成一些文件沒有被打開??梢圆捎米远x大緩沖區代替系統緩沖區的方法解決。
如:
CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
| OFN_ALLOWMULTISELECT, NULL, NULL );//
定制打開文件對話框
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; //
回收緩沖區

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

MB_ICONASTERISK
:一個圓圈中小寫字母i組成的圖標出現在消息框。
MB_ICONOUESTION:
一個問題標記圖標出現在消息框。
MB_ICONSTOP:
MB_ICONERROR

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



調試
error C2146: syntax error : missing ';' before identifier ……
如果出現這個錯誤且錯誤數目很多,通常并不是缺失了分號引起的,而是忘記了添加某頭文件引起的。
最常見的是新加入了對話框,然后用它的類定義了一個對象,再編譯出現上面的錯誤。
解決方法是在引用新類的文件中加入#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,然后設置第一選項,選擇不使用預編譯頭,解決這個問題。發布
Debug
模式和Release模式
早就發現用VC編譯出來的.exe文件比用Turbo C編譯出來的文件大了許多,于是就認為VC編譯時一定加了很多沒用的東西,記得當時還做過把VC自動生成的項目中自認為沒用的函數都刪掉的傻事。后來才從網上的文章中了解到還有編譯模式一說。
Debug
模式是用來調試用的,它生成的執行文件中含有大量調試信息,所以很大;
Release
模式生成的執行文件消除了這些調試信息,可用來作為成品發布。
默 認情況下是Debug模式,切換方法是在編譯”(Build)菜單中選設置項目配置”(Set Active Configure)。從彈出的對話框中選擇Win32 Release模式,然后再重新編譯。這時在工作目錄下會多出一個Release目錄,其中的exe文件比Debug目錄下的那個要小得多。

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

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

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

 


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

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

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

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



其它
如何獲取程序所在的路徑
也就是獲取你這個程序本身所在的路徑。
在應用程序類CxxApp的頭文件中定義一個變量CString m_exePath;用來放置程序的路徑名,在應用程序類CxxAppInitInstance()函數中加入如下語句:
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
、打開與應用程序在一起放置的數據文件:
如果你運行程序過程中使用過打開文件對話框打開過其它路徑下的文件,這時系統的默認路徑就發生了改變,有可能使你原定的數據文件打不開了,如果采用以下方法就可以沒問題了:
CFile file;
file.Open( m_exePath+"
數據文件名", CFile::modeRead );
2
、放置程序運行中的臨時文件:
同樣,當系統的默認路徑發生改變后,程序中生成的臨時文件就會放得到處都是,成了一個個垃圾文件,采用以下方法可使臨時文件只放在程序所在路徑下:
CFile file;
file.Open( m_exePath+"
臨時文件名", CFile::modeCreate | CFile::modeWrite );
……
程序結束時,用下面的方法刪除臨時文件:
CFile::Remove( m_exePath+"
臨時文件名" );

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


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

 

 





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

如果不使用串行化,如何在程序結束時保存文件?
在文檔-視圖結構中,用串行化自動保存文件在各種VC書上都有介紹?,F在的問題是我不使用串行化,而是自己動手保存,當點擊窗口的關閉按鈕時,如何提示并保存文檔。
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是準備保存的數據,放在文檔內。

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

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

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 閱讀(551) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久福利视频导航| 久久成人一区| 免费成人美女女| 国产亚洲激情| 国产综合香蕉五月婷在线| 国产欧美日韩综合一区在线观看| 国产日韩欧美麻豆| 在线观看日产精品| 99ri日韩精品视频| 久久成人一区二区| 亚洲电影免费在线观看| 欧美国产日韩精品| 亚洲天堂av电影| 久久精品亚洲一区| 欧美日韩精品一二三区| 国产亚洲一区二区三区在线播放| 欲色影视综合吧| 亚洲视频在线观看| 猛干欧美女孩| 亚洲小视频在线观看| 久久蜜桃香蕉精品一区二区三区| 欧美日韩国产精品自在自线| 国产日韩在线一区| 99在线精品免费视频九九视| 欧美在线一级va免费观看| 亚洲国产欧美在线人成| 欧美一区二区三区四区在线| 欧美激情一区二区三区全黄| 国产揄拍国内精品对白| 亚洲综合视频1区| 亚洲国产精品久久久久婷婷老年| 性一交一乱一区二区洋洋av| 欧美激情视频一区二区三区在线播放 | 国产精品青草综合久久久久99| 在线观看欧美日本| 欧美在线地址| 一区二区高清在线| 欧美激情二区三区| 亚洲高清网站| 久久亚洲综合色| 亚洲中无吗在线| 欧美三级电影网| 亚洲精品一区二区三区在线观看| 久久蜜桃av一区精品变态类天堂| 亚洲一二三区在线观看| 欧美日韩亚洲一区在线观看| 亚洲精品综合在线| 亚洲国产成人一区| 欧美成人亚洲| 亚洲区一区二区三区| 免费毛片一区二区三区久久久| 欧美一二区视频| 欧美精品日韩一区| 小辣椒精品导航| 欧美另类一区二区三区| 亚洲国产一区二区三区高清| 巨胸喷奶水www久久久免费动漫| 午夜日韩福利| 国产一区二区三区在线观看视频 | 日韩西西人体444www| 欧美a级一区| 亚洲国产精品一区二区第四页av | 欧美日韩麻豆| 亚洲淫性视频| 亚洲在线中文字幕| 国产欧美精品一区aⅴ影院| 新狼窝色av性久久久久久| 中文一区字幕| 国产欧美日韩一区二区三区在线| 久久精品72免费观看| 久久精品人人| 亚洲美女在线看| 在线午夜精品自拍| 国产一区二区三区久久| 麻豆精品视频| 欧美精品久久99| 亚洲欧美中文另类| 久久精品国产久精国产思思| 亚洲国产精品黑人久久久| 亚洲免费不卡| 国产日韩av在线播放| 欧美成人激情在线| 欧美日韩在线一区| 久久久久成人精品| 欧美激情按摩在线| 欧美一区二区三区在线看| 久久一区二区三区四区| av不卡在线看| 欧美一区午夜精品| 99国内精品| 欧美一区二区三区视频在线观看| 亚洲激情第一页| 这里只有精品丝袜| 一区二区在线观看视频在线观看| 91久久在线观看| 国产午夜久久| 日韩亚洲欧美综合| 在线电影院国产精品| 亚洲视频在线观看网站| 亚洲二区在线视频| 亚洲综合日韩在线| 日韩午夜激情| 久久亚洲春色中文字幕| 午夜精品福利一区二区三区av| 老司机免费视频一区二区三区| 午夜精品福利在线| 欧美日韩的一区二区| 快播亚洲色图| 国产欧美精品久久| 欧美日本不卡视频| 影音先锋久久精品| 亚洲天堂免费在线观看视频| 亚洲国产毛片完整版| 午夜免费在线观看精品视频| 99精品欧美一区二区三区综合在线| 欧美在线免费| 欧美一站二站| 国产精品福利在线观看| 亚洲国产一区二区在线| 在线观看91精品国产麻豆| 羞羞视频在线观看欧美| 亚洲欧美99| 国产精品成人va在线观看| 亚洲免费观看高清在线观看 | 午夜精品视频在线| 欧美视频中文字幕在线| 亚洲三级性片| 亚洲最黄网站| 欧美区高清在线| 亚洲精品国产精品乱码不99按摩| 亚洲人成网站影音先锋播放| 免费成人网www| 欧美国产精品v| 最近中文字幕日韩精品 | 午夜精品久久久久久久久久久久 | 日韩视频在线一区| 欧美激情亚洲一区| 亚洲精选在线观看| 在线视频欧美一区| 欧美性片在线观看| 亚洲免费视频观看| 久久精品色图| 亚洲国产精品va在看黑人| 美女久久一区| 亚洲经典一区| 亚洲免费视频一区二区| 国产欧美日韩91| 久久久久久黄| 亚洲激情影院| 午夜精品久久久99热福利| 国产女主播在线一区二区| 久久精品久久99精品久久| 欧美风情在线| 亚洲视频中文字幕| 国产乱码精品一区二区三区忘忧草| 欧美亚洲自偷自偷| 欧美韩日一区二区| 亚洲小少妇裸体bbw| 国产精品嫩草99av在线| 久久精品在线免费观看| 亚洲激情欧美激情| 欧美一区二区三区免费看| 极品中文字幕一区| 欧美日韩精品免费| 欧美在线二区| 亚洲日韩中文字幕在线播放| 亚洲欧美日韩一区在线观看| 激情综合视频| 欧美婷婷六月丁香综合色| 性久久久久久久久| 亚洲国产欧美国产综合一区| 99在线视频精品| 另类av导航| 一区二区三区欧美成人| 国产亚洲精品激情久久| 欧美成人综合| 久久精品国产2020观看福利| 亚洲伦理网站| 免费成人在线视频网站| 亚洲一区二区三区777| 在线免费观看成人网| 国产精品高清在线| 欧美激情网站在线观看| 久久精品综合| 亚洲欧美日韩精品久久久| 亚洲精品午夜| 欧美成人精品激情在线观看| 欧美一级播放| 亚洲一区三区电影在线观看| 亚洲精品日产精品乱码不卡| 国产在线不卡视频| 国产欧美日韩一区| 国产精品美女久久久免费| 欧美经典一区二区| 老牛影视一区二区三区| 久久国产精品72免费观看| 亚洲一区高清| 亚洲天堂av图片| 国产精品99久久久久久久vr| 亚洲免费观看在线视频|