| 窗口篇 | 讓窗口一啟動(dòng)就最大化 把應(yīng)用程序類(CxxxApp)的 InitInstance() 函數(shù)中的 m_pMainWnd->ShowWindow(SW_SHOW); 改為 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); 則窗口一啟動(dòng)就最大化顯示。 |
| 如何設(shè)置窗口的初始尺寸 在將應(yīng)用程序類(CxxAPP)的 InitInstance() 函數(shù)中加入: 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);//設(shè)置窗口的初始大小為750*555 ????m_pMainWnd->ShowWindow(SW_SHOW); ????m_pMainWnd->UpdateWindow();
????return?TRUE; } |
| 讓窗口居中顯示 | 以下兩種方法可任選其一: ①在應(yīng)用程序類(CxxxApp)的 InitInstance() 函數(shù)中加入: m_pMainWnd->CenterWindow( GetDesktopWindow() ); ②在主框架類(MainFrm.cpp)的OnCreate()函數(shù)中加入: 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()?);?//使窗口打開時(shí)處于屏幕正中
????return?0; } |
| 如何修改窗口標(biāo)題 | 窗口標(biāo)題一般形式為:文檔標(biāo)題 - 程序標(biāo)題 1、設(shè)置文檔標(biāo)題: 在文檔類(CxxxDoc)的OnNewDocument()函數(shù)中加入語句:SetTitle("文檔名"); 如:TextEditorDoc.cpp: 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 ????m_strTitle?=?_T("文本整理器");????//設(shè)置程序標(biāo)題 ????return?TRUE; } 以上兩點(diǎn)比較適用于視圖-文檔結(jié)構(gòu)的程序,在新建文檔時(shí),系統(tǒng)會(huì)自動(dòng)運(yùn)行OnNewDocument()函數(shù),在其中可以設(shè)置合適的標(biāo)題。對(duì)于未采用文檔的程序可以用下面的方法修改標(biāo)題: 3、修改窗口標(biāo)題: 修改窗口標(biāo)題一般在打開文件函數(shù)OnFileOpen()和另存為函數(shù)OnFileSaveAs()中進(jìn)行,可以使用下面的函數(shù): AfxGetMainWnd()->SetWindowText("文檔標(biāo)題"+" - "+"程序標(biāo)題"); 其中文檔標(biāo)題和程序標(biāo)題可使用定義過的串變量。 |
|
| 項(xiàng)目篇 | 如何干凈的刪除一個(gè)類? 1、先刪除項(xiàng)目中對(duì)應(yīng)的.h和.cpp文件,(選中后用Delete鍵刪除) 2、保存后退出項(xiàng)目,到文件夾中刪除實(shí)際的.h和.cpp文件; 3、刪除.clw文件; 4、重新進(jìn)入項(xiàng)目,進(jìn)行全部重建(rebuild all)。 |
| 如何建立一個(gè)新類? | 從“插入”(Insert)菜單中選擇“新建類”(New Class),在彈出的對(duì)話框中選擇基類(Base class),在Name中輸入新類的名字(一般都以C開頭)即可。 如果想要建立一個(gè)沒有基類的自定義類,則在New Class對(duì)話框中把Class type設(shè)置為generic,再輸入類名即可。 |
| 如何把外來文件添加到項(xiàng)目中? | 先把外來文件復(fù)制到當(dāng)前項(xiàng)目的目錄下,從“項(xiàng)目”(Project)菜單下選擇“添加項(xiàng)目”(Add to Project)下的“Files”菜單項(xiàng),從彈出的打開文件對(duì)話框中把外來文件打開即可。 |
| 如何在一個(gè)工作區(qū)中打開多個(gè)項(xiàng)目? | 一般編程者都有這樣的經(jīng)歷:做了一個(gè)項(xiàng)目,由于不滿意,想從頭重做,但又想把舊項(xiàng)目的一些可用內(nèi)容拷到新項(xiàng)目中來,以免做重復(fù)工作,這時(shí)就需要在新項(xiàng)目中打開舊項(xiàng)目。 先打開新項(xiàng)目,從“項(xiàng)目”(Project)菜單下選擇“插入項(xiàng)目到工作區(qū)”(Insert Project into Workspace),從彈出的打開文件對(duì)話框中打開舊項(xiàng)目的.asp文件即可。 之后,可以利用“項(xiàng)目”(Project)菜單下的“設(shè)置活動(dòng)項(xiàng)目”(Select Active Project)的選項(xiàng)中切換各打開的項(xiàng)目。 注意:在一個(gè)工作區(qū)中打開的各項(xiàng)目不能同名。 |
| 如何把項(xiàng)目中的文件分類存放? | 當(dāng)我們往項(xiàng)目中添加新類時(shí),它會(huì)把源文件放在Source Files下,頭文件放在Header Files下。當(dāng)項(xiàng)目中文件很多時(shí),管理不便,最好添加新節(jié)點(diǎn),把文件分類放置。 右擊項(xiàng)目節(jié)點(diǎn)樹的根節(jié)點(diǎn),選擇“New Folder...”,在彈出的對(duì)話框中填入新節(jié)點(diǎn)名,則新節(jié)點(diǎn)就建立了,用鼠標(biāo)節(jié)點(diǎn)樹中的文件拖入新節(jié)點(diǎn),就可以把文件分類了。 以上分類只是在項(xiàng)目的節(jié)點(diǎn)樹中分類,它不影響文件在磁盤上的位置,所有.cpp文件和.h文件仍在項(xiàng)目的根目錄下,最好文件本身也能分類存放在不同文件夾中。 在Windows下,用“新建文件夾”在項(xiàng)目的根目錄下建立子文件夾,如DialogClass,把所有對(duì)話框類的.cpp文件和.h文件拖入其中。 回到VC下,右鍵單擊項(xiàng)目樹中更改了路徑的節(jié)點(diǎn),選擇“Properties”,在彈出的對(duì)話框中修改文件路徑,如:把原路徑“.\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,它會(huì)提示你文件不存在,單擊“確定”后,從對(duì)話框中用“Browse...”選擇文件所在路徑,則ClassWizard也可正常使用了。 |
|
| 編輯篇 | 編輯代碼時(shí),跟隨提示消失了怎么辦? | 單擊“工具”(Tools)菜單中的“設(shè)置”(Options)菜單項(xiàng),在彈出的Options對(duì)話框中選擇Editor制表頁,把它最下方的四個(gè)復(fù)選框都選中(Auto list member、Auto type info、Code comments、Auto parameter info),這樣,當(dāng)用戶輸入“->”或“.”時(shí),會(huì)自動(dòng)顯示跟隨提示,減少了輸入負(fù)擔(dān)。 |
|
| 對(duì)話框篇 | 如何修改對(duì)話框的背景色 | 在對(duì)話框的OnPaint()函數(shù)中加入下面語句: CRect rect; GetClientRect(&rect);??????//計(jì)算對(duì)話框的尺寸 dc.FillSolidRect(&rect,RGB(192,248,202));???//繪制對(duì)話框背景色 |
| 如何讓彈出式對(duì)話框具有統(tǒng)一的背景色 | 在應(yīng)用程序類CxxxApp的InitInstance()函數(shù)中加入下面的語句: SetDialogBkColor( RGB(192,248,202) ); 則所有用戶定義的彈出式對(duì)話框都以RGB(192,248,202)為背景色,就不需要逐個(gè)進(jìn)行設(shè)置了。 |
| 如何讓打開文件對(duì)話框能進(jìn)行多項(xiàng)選擇 | 在定制打開文件對(duì)話框時(shí),增加OFN_ALLOWMULTISELECT屬性,就可以使打開文件對(duì)話框進(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); ??????????………… ?????} } |
| 為什么用打開文件對(duì)話框選擇多個(gè)文件到一定數(shù)目時(shí),文件沒有打開? | CFileDialog為文件列表設(shè)置有緩沖區(qū),當(dāng)選擇文件過多時(shí),會(huì)造成緩沖區(qū)溢出,造成一些文件沒有被打開。可以采用自定義大緩沖區(qū)代替系統(tǒng)緩沖區(qū)的方法解決。 如: CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ???????| OFN_ALLOWMULTISELECT, NULL, NULL );//定制打開文件對(duì)話框 char* pBuf = new char[20480];???????//申請(qǐng)緩沖區(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ū) |
| 提示對(duì)話框(MessageBox) | 在視類和對(duì)話框類中可使用MFC函數(shù)中用的MessageBox()函數(shù)彈出提示對(duì)話框。這個(gè)函數(shù)原型為: int MessageBox(LPCTSTR lpszText,LPCTSTR lpsCaption=NULL,UINT nType=MB_OK); 參數(shù):lpszText 顯示的字符串 lpsCaption 對(duì)話框的標(biāo)題 nType 風(fēng)格,可為如下值的組合: 指定下列標(biāo)志中的一個(gè)來顯示消息框中的按鈕,標(biāo)志的含義如下。 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。 指定下列標(biāo)志中的一個(gè)來顯示消息框中的圖標(biāo):標(biāo)志的含義如下。 MB_ICONEXCLAMATION: MB_ICONWARNING:一個(gè)驚嘆號(hào)出現(xiàn)在消息框。 MB_ICONINFORMATION: MB_ICONASTERISK:一個(gè)圓圈中小寫字母i組成的圖標(biāo)出現(xiàn)在消息框。 MB_ICONOUESTION:一個(gè)問題標(biāo)記圖標(biāo)出現(xiàn)在消息框。 MB_ICONSTOP: MB_ICONERROR: MB_ICONHAND:一個(gè)停止消息圖標(biāo)出現(xiàn)在消息框。 指定下列標(biāo)志中的一個(gè)來指定缺省的按鈕:標(biāo)志的含義如下。 MB_DEFBUTTON1:第一個(gè)按鈕為缺省按鈕。如果MB_DEFBUTTON2,MB_DEFBUTTON3,MB_DEFBUTTON4沒有被指定,則MB_DEFBUTTON1為缺省值。 MB_DEFBUTTON2;第二個(gè)按鈕為缺省按鈕。 MB_DEFBUTTON3:第三個(gè)按鈕為缺省按鈕。 MB_DEFBUTTON4:第四個(gè)按鈕為缺省按鈕。 例:提示文件是否存盤: 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)識(shí)將被創(chuàng)建的消息框的擁有窗口。如果此參數(shù)為NULL,則消息框沒有擁有窗口。 后三個(gè)參數(shù)與視類的MessageBox相同,但沒有缺省值,必須設(shè)置。 例:::MessageBox(NULL,m_PathName+"的文字已經(jīng)改變,要存盤嗎?", "警告",MB_YESNOCANCEL | MB_ICONWARNING); |
|
| 調(diào)試篇 | error C2146: syntax error : missing ';' before identifier …… | 如果出現(xiàn)這個(gè)錯(cuò)誤且錯(cuò)誤數(shù)目很多,通常并不是缺失了分號(hào)引起的,而是忘記了添加某頭文件引起的。 最常見的是新加入了對(duì)話框,然后用它的類定義了一個(gè)對(duì)象,再編譯出現(xiàn)上面的錯(cuò)誤。 解決方法是在引用新類的文件中加入#include "類名.h",再編譯,錯(cuò)誤消失。 |
| fatal error C1010: unexpected end of file while looking for precompiled header directive | 在一個(gè)項(xiàng)目中,如果用“New”向工程中添加了一個(gè).cpp文件,編譯,出錯(cuò)。 解決方法:在新建的.cpp文件的開頭加入#include "stdafx.h"。 |
|
| 發(fā)布篇 | Debug模式和Release模式 | 早就發(fā)現(xiàn)用VC編譯出來的.exe文件比用Turbo C編譯出來的文件大了許多,于是就認(rèn)為VC編譯時(shí)一定加了很多沒用的東西,記得當(dāng)時(shí)還做過把VC自動(dòng)生成的項(xiàng)目中自認(rèn)為沒用的函數(shù)都刪掉的傻事。后來才從網(wǎng)上的文章中了解到還有編譯模式一說。 Debug模式是用來調(diào)試用的,它生成的執(zhí)行文件中含有大量調(diào)試信息,所以很大; Release模式生成的執(zhí)行文件消除了這些調(diào)試信息,可用來作為成品發(fā)布。 默認(rèn)情況下是Debug模式,切換方法是在“編譯”(Build)菜單中選“設(shè)置項(xiàng)目配置”(Set Active Configure)。從彈出的對(duì)話框中選擇Win32 Release模式,然后再重新編譯。這時(shí)在工作目錄下會(huì)多出一個(gè)Release目錄,其中的exe文件比Debug目錄下的那個(gè)要小得多。 |
| 動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫 | 用VC做好了一個(gè)程序,拿到別人那里卻不能運(yùn)行,這也是很多編程者都經(jīng)歷過的,這樣的軟件只能在安裝有VC的機(jī)器上運(yùn)行,也不應(yīng)拿出去發(fā)布。實(shí)際上如果你沒有使用ActiveX控件和自定義的動(dòng)態(tài)DLL技術(shù),只需把MFC的動(dòng)態(tài)鏈接庫打包到你的程序里就可以了,也就是使用靜態(tài)鏈接庫。 設(shè)置方法:從“項(xiàng)目”(Project)菜單下選擇“設(shè)置”(Settings),在彈出的對(duì)話框中的General選項(xiàng)卡下,把“User MFC in a Shared DLL”改為“User MFC in a Static Library”,關(guān)閉對(duì)話框后重新編譯即可。 在靜態(tài)鏈接庫下編譯的文件比動(dòng)態(tài)鏈接庫的要大很多,不過,如果使用Release模式編譯,一般也就幾百K,它就可以在沒有安裝VC的機(jī)器上運(yùn)行了。 |
| 發(fā)布VC源代碼時(shí),哪些文件可以刪除? | 源代碼是給其他VC愛好者提供參考的,如果把所有文件都打包會(huì)很大,而且也沒有必要,所以為他人提供源代碼時(shí)可以刪除一些不必要的文件。 ①可刪除Debug文件夾和Release文件夾; ②原則上還可刪除主文件夾中所有圖標(biāo)為的文件,包括.aps、.ncb、.opt、.plg等文件,它們都能在編譯時(shí)重建。但一般.clw不要?jiǎng)h除,它可能導(dǎo)致ClassWizard不好用。 |
|
| 控件篇 | 如何隱藏和顯示控件 | 用CWnd類的函數(shù)BOOL ShowWindow(int nCmdShow)可以隱藏或顯示一個(gè)控件。 例1: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 );??//獲取控件指針,IDC_EDIT為控件ID號(hào) pWnd->ShowWindow( SW_HIDE );?????//隱藏控件 例2: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 );??//獲取控件指針,IDC_EDIT為控件ID號(hào) pWnd->ShowWindow( SW_SHOW );?????//顯示控件 |
| 按鈕的使能與禁止 用ClassWizard的Member 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對(duì)象; 例: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 );????//獲取控件指針,IDC_EDIT1為控件ID號(hào) pWnd->MoveWindow( CRect(0,0,100,100) );??//在窗口左上角顯示一個(gè)寬100、高100的編輯控件 SetWindowPos()函數(shù)使用更靈活,多用于只修改控件位置而大小不變或只修改大小而位置不變的情況: BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags); 第一個(gè)參數(shù)一般設(shè)為NULL; x、y控件位置;cx、cy控件寬度和高度; nFlags常用取值: SWP_NOZORDER:忽略第一個(gè)參數(shù); SWP_NOMOVE:忽略x、y,維持位置不變; SWP_NOSIZE:忽略cx、cy,維持大小不變; 例: CWnd *pWnd; pWnd = GetDlgItem( IDC_BUTTON1 );????//獲取控件指針,IDC_BUTTON1為控件ID號(hào) 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)的使用 | 一、對(duì)單選按鈕進(jìn)行分組: 每組的第一個(gè)單選按鈕設(shè)置屬性:Group,Tabstop,Auto;其余按鈕設(shè)置屬性Tabstop,Auto。 如: Radio1、Radio2、Radio3為一組,Radio4、Radio5為一組 設(shè)定Radio1屬性:Group,Tabstop,Auto 設(shè)定Radio2屬性:Tabstop,Auto 設(shè)定Radio3屬性:Tabstop,Auto 設(shè)定Radio4屬性:Group,Tabstop,Auto 設(shè)定Radio5屬性:Tabstop,Auto 二、用ClassWizard為單選控件定義變量,每組只能定義一個(gè)。如:m_Radio1、m_Radio4。 三、用ClassWizard生成各單選按鈕的單擊消息函數(shù),并加入內(nèi)容: 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è)單選按鈕被選中 } 當(dāng)控件變量值為0時(shí),它對(duì)應(yīng)組的第一個(gè)單選按鈕處于選中狀態(tài)。 四、設(shè)置默認(rèn)按鈕: 在定義控件變量時(shí),ClassWizard在構(gòu)造函數(shù)中會(huì)把變量初值設(shè)為-1,只需把它改為其它值即可。 如: //{{AFX_DATA_INIT(CWEditView) m_Ridio1 = 0;????//初始時(shí)第一個(gè)單選按鈕被選中 m_Ridio4 = 0;????//初始時(shí)第四個(gè)單選按鈕被選中 //}}AFX_DATA_INIT |
| 旋轉(zhuǎn)控件(Spin)的使用 | 當(dāng)單擊旋轉(zhuǎn)控件上的按鈕時(shí),相應(yīng)的編輯控件值會(huì)增大或減小。其設(shè)置的一般步驟為: 一、在對(duì)話框中放入一個(gè)Spin控件和一個(gè)編輯控件作為Spin控件的伙伴窗口 設(shè)置Spin控件屬性:Auto buddy、Set buddy integer、Arrow keys 設(shè)置文本控件屬性:Number 二、用ClassWizard為Spin控件定義變量m_Spin,為編輯控件定義變量m_Edit,定義時(shí)注意要把m_Edit設(shè)置為int型。 三、在對(duì)話框的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() | 對(duì)于可以接收數(shù)據(jù)的控件,如編輯控件來說,UpdateData()函數(shù)至關(guān)重要。當(dāng)控件內(nèi)容發(fā)生變化時(shí),對(duì)應(yīng)的控件變量的值并沒有跟著變化,同樣,當(dāng)控件變量值變化時(shí),控件內(nèi)容也不會(huì)跟著變。 UpdateData()函數(shù)就是解決這個(gè)問題的。 UpdateData(true);????把控件內(nèi)容裝入控件變量 UpdateData(false);???用控件變量的值更新控件 如:有編輯控件IDC_EDIT1,對(duì)應(yīng)的變量為字符串m_Edit1, 1、修改變量值并顯示在控件中: m_Edit1 = _T("結(jié)果為50"); UpdateData(false); 2、讀取控件的值到變量中: 用ClassWizard為IDC_EDIT1添加EN_CHANGE消息處理函數(shù),這個(gè)函數(shù)在編輯控件內(nèi)容發(fā)生變化時(shí)執(zhí)行。 void CEditView::OnChangeEdit1() { ????UpdateData(true);????//更新變量值 } |
|
| 其它 | 如何獲取程序所在的路徑 | 也就是獲取你這個(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] = '\0'; 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í)文件名" ); |
| 如何在你的程序中執(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瀏覽器 二、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)效果很好。 |
| 如果不使用串行化,如何在程序結(jié)束時(shí)保存文件? | 在文檔-視圖結(jié)構(gòu)中,用串行化自動(dòng)保存文件在各種VC書上都有介紹。現(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)。 |
| 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ù)有所不同,但用法都是類似的。 |
| 如何從完整的文件路徑中分離文件名和路徑名? | 從路徑中分離文件名:
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?); } |
|
|