VC++編程常見(jiàn)問(wèn)題解答_第1頁(yè)
VC++編程常見(jiàn)問(wèn)題解答_第2頁(yè)
VC++編程常見(jiàn)問(wèn)題解答_第3頁(yè)
VC++編程常見(jiàn)問(wèn)題解答_第4頁(yè)
VC++編程常見(jiàn)問(wèn)題解答_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、VC+編程常見(jiàn)問(wèn)題解答1、 HYPERLINK l B1 如何獲取應(yīng)用程序的實(shí)例句柄?2、HYPERLINK l B2如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?3、HYPERLINK l B3如何在程序中獲得其他程序的圖標(biāo)?4、 HYPERLINK l B4 如何編程結(jié)束應(yīng)用程序?如何編程控制windows的重新引導(dǎo)?5、 HYPERLINK l B5 怎樣加載其他的應(yīng)用程序?6、HYPERLINK l B6確定應(yīng)用程序的路徑7、 HYPERLINK l B7 獲得各種目錄信息8、 HYPERLINK l B8 如何自定義消息9、 HYPERLINK l B9 如何改變窗口的圖標(biāo)? 10、 HYP

2、ERLINK l B10 如何改變窗口的 缺省風(fēng)格? 11、 HYPERLINK l B11 如何將窗口居中顯示? 12、 HYPERLINK l B12 如何讓窗口和MDI窗口一啟動(dòng)就最大化和最小化? 13、 HYPERLINK l B13 如何使程序保持極小狀態(tài)? 14、 HYPERLINK l B14 如何限制窗口的 大小? 15、 HYPERLINK l B15 如何使窗口不可見(jiàn)? 16、 HYPERLINK l B16 如何使窗口始終在最前方? 17、 HYPERLINK l B17 如何創(chuàng)立一個(gè)字繚繞的CEditView 18、 HYPERLINK l B18 通用控件的顯示窗口

3、19、 HYPERLINK l B19 移動(dòng)窗口 20、 HYPERLINK l B20 重置窗口的大小 21、 HYPERLINK l B21 如何單擊除了窗口標(biāo)題欄以外的區(qū)域使窗口移動(dòng) 22、 HYPERLINK l B22 如何改變視窗的背景顏色 23、 HYPERLINK l B23 如何改變窗口標(biāo)題 24、 HYPERLINK l B24 如何防止主框窗口在其說(shuō)明中顯示活動(dòng)的文檔名 25、 HYPERLINK l B25 如何獲取有關(guān)窗口正在處理的當(dāng)前消息的信息 26、 HYPERLINK l B26 如何創(chuàng)立一個(gè)不規(guī)那么形狀的窗口 27、 HYPERLINK l B27 如何在代碼

4、中獲取工具條和狀態(tài)條的指針 28、 HYPERLINK l B28 如何使能和禁止工具條的工具提示 29、 HYPERLINK l B29 如何設(shè)置工具條標(biāo)題 30、 HYPERLINK l B30 如何創(chuàng)立和使用無(wú)模式對(duì)話框 31、 HYPERLINK l B31 如何在對(duì)話框中顯示一個(gè)位圖 32、 HYPERLINK l B32 如何改變對(duì)話或窗體視窗的背景顏色 33、 HYPERLINK l B33 如何獲取一個(gè)對(duì)話控件的指針 34、 HYPERLINK l B34 如何禁止和使能控件 35、 HYPERLINK l B35 如何改變控件的字體 36、 HYPERLINK l B36 如

5、何在OLE控件中使用OLE_COLOR數(shù)據(jù)類(lèi)型 37、 HYPERLINK l B37 在不使用通用文件翻開(kāi)對(duì)話的情況下如何顯示一個(gè)文件列表 38、 HYPERLINK l B38 為什么旋轉(zhuǎn)按鈕控件看起來(lái)倒轉(zhuǎn) 39、 HYPERLINK l B39 為什么旋轉(zhuǎn)按鈕控件不能自動(dòng)地更新它下面的編輯控件 40、 HYPERLINK l B40 如何用位圖顯示下壓按鈕 41、 HYPERLINK l B41 如何一個(gè)創(chuàng)立三態(tài)下壓按鈕 42、 HYPERLINK l B42 如何動(dòng)態(tài)創(chuàng)立控件 43、 HYPERLINK l B43 如何限制編輯框中的準(zhǔn)許字符 44、 HYPERLINK l B44 如

6、何改變控件的顏色 45、 HYPERLINK l B45 當(dāng)向列表框中添加多個(gè)項(xiàng)時(shí)如何防止閃爍 46、 HYPERLINK l B46 如何向編輯控件中添加文本 47、 HYPERLINK l B47 如何訪問(wèn)預(yù)定義的GDI對(duì)象 48、 HYPERLINK l B48 如何獲取GDI對(duì)象的屬性信息 49、 HYPERLINK l B49 如何實(shí)現(xiàn)一個(gè)橡皮區(qū)矩形 50、 HYPERLINK l B50 如何更新翻轉(zhuǎn)背景顏色的文本 51、 HYPERLINK l B51 如何創(chuàng)立一個(gè)具有特定點(diǎn)大小的字體 52、 HYPERLINK l B52 如何計(jì)算一個(gè)串的大小 53、 HYPERLINK l

7、B53 如何顯示旋轉(zhuǎn)文本 54、 HYPERLINK l B54 如何正確顯示包含標(biāo)簽字符的串 55、 HYPERLINK l B55 串太長(zhǎng)時(shí)如何在其末尾顯示一個(gè)省略號(hào) 56、 HYPERLINK l B56 如何快速地格式化一個(gè)CString對(duì)象 57、 HYPERLINK l B57 為什么即使調(diào)用EnableMenuItem菜單項(xiàng)后,菜單項(xiàng)還處于禁止?fàn)顟B(tài) 58、 HYPERLINK l B58 如何給系統(tǒng)菜單添加一個(gè)菜單項(xiàng) 59、 HYPERLINK l B59 如何確定頂層菜單所占據(jù)的菜單行數(shù) 60、 HYPERLINK l B60 在用戶環(huán)境中如何確定系統(tǒng)顯示元素的顏色 61、 H

8、YPERLINK l B61 如何控制窗口框架的最大最小尺寸?62、 HYPERLINK l B62 如何改變窗口框架的顏色?63、 HYPERLINK l B63 如何將應(yīng)用程序窗口置于屏幕正中?64、 HYPERLINK l B64 當(dāng)文檔被修改時(shí),如何在標(biāo)題上加上標(biāo)志*?65、 HYPERLINK l B65 容性?66、 HYPERLINK l B66 打印和打印機(jī)的問(wèn)題?67、 HYPERLINK l B67 CRichEditCtrl滾動(dòng)條的問(wèn)題?68、 HYPERLINK l B68 從數(shù)據(jù)庫(kù)中讀大于32k的內(nèi)容?69、 HYPERLINK l B69 如何獲得CRichEdit

9、Ctrl中字符的位置?70、 HYPERLINK l B70 如何限制mdi子框架最大化時(shí)的大小?71、 HYPERLINK l B71 如何切換視口而不破壞它們?72、 HYPERLINK l B72 改變列表控制時(shí)發(fā)生閃爍現(xiàn)象?73、 HYPERLINK l B73 處理列表控件可見(jiàn)項(xiàng)的問(wèn)題?74、 HYPERLINK l B74 產(chǎn)生線程的問(wèn)題?75、HYPERLINK l B75CFile使用了緩沖區(qū)嗎?76、 HYPERLINK l B76 DAO的密碼?77、 HYPERLINK l B77 如何知道CListBox什么時(shí)候滾動(dòng)了?78、 HYPERLINK l B78 視口的不活

10、動(dòng)性如何處理?79、 HYPERLINK l B79 如何使用COleClientItem的IDispatch接口?80、 HYPERLINK l B80 關(guān)于用戶自定義的消息使用?81、 HYPERLINK l B81 在翻開(kāi)一個(gè)文檔時(shí)退出?82、 HYPERLINK l B82 在CListCtrl控件中多項(xiàng)選擇擇項(xiàng)的刪除?83、 HYPERLINK l B83 工作線程的登錄狀態(tài)?84、 HYPERLINK l B84 如何控制菜單的大小?85、 HYPERLINK l B85 改變LVIS_SELECTED的狀態(tài)顏色?86、 HYPERLINK l B86 如何只存儲(chǔ)文檔的某一局部?8

11、7、 HYPERLINK l B87 保存工具條菜單有bug嗎?88、 HYPERLINK l B88 Tip of the day的bug89、 HYPERLINK l B89 如何讓我的mfc應(yīng)用程序可以在最上面?90、 HYPERLINK l B90 如何增加視圖中ActiveX控件的事件處理函數(shù)?91、 HYPERLINK l B91 如何創(chuàng)立一個(gè)動(dòng)態(tài)的Tree控件?92、 HYPERLINK l B92 SDI程序開(kāi)始時(shí)不翻開(kāi)文檔?93、 HYPERLINK l B93 List控件中整欄選擇?94、 HYPERLINK l B94 如何重載MRU文件?95、 HYPERLINK l

12、 B95 CImageList控件中圖象橙色被顯示為黃色?96、 HYPERLINK l B96 無(wú)法正確改變應(yīng)用程序的圖標(biāo)?97、HYPERLINK l B97工具條狀態(tài)的問(wèn)題?98、 HYPERLINK l B98 在SDI應(yīng)用程序中使用Active控件?99、 HYPERLINK l B99 有RichEdit控件的對(duì)話框無(wú)法正常顯示? 100、 HYPERLINK l B100 DLL中的模板成員函數(shù)?101、 HYPERLINK l B101 為什么在匹配模板定義時(shí)它要尋找一個(gè)DOUBLE參數(shù)?102、 HYPERLINK l B102 CFormView中的上下文幫助?103、 H

13、YPERLINK l B103 CArchive類(lèi)的WriteObject函數(shù)問(wèn)題?104、 HYPERLINK l B104 RegisterWindowMessage中的BroadcastSystemMessage如何處理?105、 HYPERLINK l B105 CListCtrl中選擇變化時(shí)如何獲得通知?106、 HYPERLINK l B106 如何向ATL-COM對(duì)象傳送一個(gè)數(shù)組?107、 HYPERLINK l B107 如何選擇CTreeCtrl中的節(jié)點(diǎn)文本進(jìn)行編輯?108、 HYPERLINK l B108 如何改變默認(rèn)的光標(biāo)形狀?109、 HYPERLINK l B109

14、 如何在線程中處理狀態(tài)條?110、 HYPERLINK l B110 如何阻止WINDOWS關(guān)閉?111、 HYPERLINK l B111 如何使一個(gè)按鈕Disable?112、 HYPERLINK l B112 怎樣從MFC擴(kuò)展動(dòng)態(tài)鏈結(jié)庫(kù)(DLL)中顯示一個(gè)對(duì)話框? 113、 HYPERLINK l B113 想隱藏用戶界面怎么辦?114、 HYPERLINK l B114 如何實(shí)現(xiàn)SDI與MDI的轉(zhuǎn)換?115、 HYPERLINK l B115 CDC中的豎排文本?116、 HYPERLINK l B116 如何激活變灰的彈出菜單? 117、 HYPERLINK l B117 線程消息?

15、 118、 HYPERLINK l B118 TreeCtrl控制的顯示速度太慢? 1. HYPERLINK l A1如何獲取應(yīng)用程序的實(shí)例句柄?應(yīng)用程序的實(shí)例句柄保存在CWinAppIm_hInstance 中,可以這么調(diào)用AfxGetInstancdHandle獲得句柄.Example: HANDLE hInstance=AfxGetInstanceHandle();2. HYPERLINK l A2 如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?主窗口的 指針保存在CWinThread:m_pMainWnd中,調(diào)用 AfxGetMainWnd實(shí)現(xiàn)。AfxGetMainWnd() -ShowWin

16、dow(SW_SHOWMAXMIZED); /使程序最大化.3. HYPERLINK l A3 如何在程序中獲得其他程序的圖標(biāo)?兩種方法: (1) SDK函數(shù) SHGetFileInfo 或使用 ExtractIcon獲得圖標(biāo)資源的 handle, (2) SDK函數(shù) SHGetFileInfo獲得有關(guān)文件的 很多信息,如大小圖標(biāo),屬性, 類(lèi)型等.Example(1): 在程序窗口左上角顯示NotePad圖標(biāo).void CSampleView: OnDraw(CDC * pDC)if( : SHGetFileInfo(_T(c:pwin95notepad.exe),0,&stFileInfo,

17、sizeof(stFileInfo),SHGFI_ICON)pDC -DrawIcon(10,10,stFileInfo.hIcon);Example(2):同樣功能,Use ExtractIcon Functionvoid CSampleView: OnDraw(CDC *pDC)HICON hIcon=: ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0);if (hIcon &hIcon!=(HICON)-1)pDC-DrawIcon(10,10,hIcon);說(shuō)明: 獲得notepad.exe的路徑正規(guī)上來(lái)說(shuō)用GetWindows

18、Directory 函數(shù)得到,如果是調(diào)用 win95下的畫(huà)筆,應(yīng)該用訪問(wèn)注冊(cè)表的方法獲得其路徑,要作成一個(gè)比較考究的程序,考慮應(yīng)該全面點(diǎn).4. HYPERLINK l A4 如何編程結(jié)束應(yīng)用程序?如何編程控制windows的重新引導(dǎo)?這是個(gè)很簡(jiǎn)單又是編程中經(jīng)常要遇到的問(wèn)題.示是否保存修改正的數(shù)據(jù).Example: AfxGetMainWindow()-SendMessage(WM_CLOSE);還可以創(chuàng)立一個(gè)自定義的函數(shù) Terminate Windowvoid Terminate Window(LPCSTR pCaption)CWnd *pWnd=Cwnd:FindWindow(NULL,p

19、Caption);if (pWnd)pWnd -SendMessage(WM_CLOSE);說(shuō)明: FindWindow函數(shù)不是提倡的做法,因?yàn)樗鼰o(wú)法處理標(biāo)題欄自動(dòng)改變,比方我們要檢測(cè) Notepad是不是已運(yùn)行而事先不知道Notepad的標(biāo)題欄,這時(shí) FindWindow就無(wú)能為力了,可以通過(guò)枚舉 windows任務(wù)列表的方法來(lái)實(shí)現(xiàn)。 在機(jī)械出版社Windows 95 API開(kāi)發(fā)人員指南一書(shū)有比擬詳細(xì)的介紹,這里就不再多說(shuō)樂(lè)。第二問(wèn),Use ExitWindowsEx Function函數(shù)控制系統(tǒng)是重新引導(dǎo),還是重啟windows. 前面已經(jīng)有人講過(guò)樂(lè),就不再提了。5. HYPERLINK

20、l A5 怎樣加載其他的應(yīng)用程序?我記得這好象是出場(chǎng)頻度很高的問(wèn)題。三個(gè)SDK函數(shù) winexec, shellexecute,createprocess可以使用。值得說(shuō)一下,比方泥用 SW_SHOWMAXMIZED方式去加栽一個(gè)無(wú)最大化按鈕的 程序,呵呵就是Neterm,calc等等,就不會(huì)出現(xiàn)正常的窗體,但是已經(jīng)被加到任務(wù)列表里了。ShellExecute較 WinExex靈活一點(diǎn),可以指定工作目錄,下面的 Example就是直接翻開(kāi) c:temp1.txt,而不用加栽與 txt文件關(guān)聯(lián)的應(yīng)用程序,很多安裝程序完成后都會(huì)翻開(kāi)一個(gè)窗口,來(lái)顯示Readme or Faq,就是這么作的啦.She

21、llExecute(NULL,NULL,_T(1.txt),NULL,_T(c:temp),SW_SHOWMAXMIZED);CreateProcess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大局部都可以用NULL代替,它可以指定進(jìn)程的平安屬性,繼承信息,類(lèi)的優(yōu)先級(jí)等等.來(lái)看個(gè)很簡(jiǎn)單的 Example:STARTUPINFO stinfo; /啟動(dòng)窗口的信息PROCESSINFO procinfo; /進(jìn)程的信息CreateProcess(NULL,_T(notepad.exe),NULL,NULL.FALSE, NORMAL_PRIORITY_CLASS,NULL,NULL, &stinfo,&proc

22、info);6. HYPERLINK l A6 確定應(yīng)用程序的路徑前些天好象有人問(wèn)過(guò)這個(gè)問(wèn)題.Use GetModuleFileName 獲得應(yīng)用程序的路徑,然后去掉可執(zhí)行文件名。Example:TCHAR exeFullPathMAX_PATH; / MAX_PATH在API中定義了吧,好象是128 GetModuleFileName(NULL,exeFullPath,MAX_PATH)7. HYPERLINK l A7 獲得各種目錄信息Windows目錄: Use GetWindowsDirectory“Windows下的system目錄: Use GetSystemDirectoryte

23、mp目錄: Use GetTempPath 當(dāng)前目錄: Use GetCurrentDirectory請(qǐng)注意前兩個(gè)函數(shù)的第一個(gè)參數(shù)為 目錄變量名,后一個(gè)為緩沖區(qū); 后兩個(gè)相反.8. HYPERLINK l A8 如何自定義消息也有人問(wèn)過(guò)的,其實(shí)不難。(1) 手工定義消息,可以這么寫(xiě) #define WM_MY_MESSAGE(WM_USER+100),MS推薦的至少是 WM_USER+100;(2)寫(xiě)消息處理函數(shù),用 WPARAM,LPARAM返回LRESULT.LRESULT CMainFrame:OnMyMessage(WPARAM wparam,LPARAM lParam)/參加你的處理

24、函數(shù)(3) 在類(lèi)的 AFX_MSG處進(jìn)行聲明,也就是常說(shuō)的宏映射 9. HYPERLINK l A9 如何改變窗口的圖標(biāo)? 向窗口發(fā)送 WM_SECTION消息。 Example: HICON hIcon=AfxGetApp() -LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd() -SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon); 10. HYPERLINK l A10 如何改變窗口的缺省風(fēng)格? 重栽 CWnd: PreCreateWindow 并修改CREATESTRUCT結(jié)構(gòu)來(lái)指定窗口風(fēng)格和其他創(chuàng)立

25、信息. Example: Delete Max Button and Set Original Windows Position and Size BOOL CMainFrame: PreCreateWindow (CREATESTRUCT &cs) cs.style &=WS_MAXINIZEMOX; cs.x=cs.y=0; cs.cx=GetSystemMetrics(SM_CXSCREEN/2); cs.cy=GetSystemMetrics(SM_CYSCREEN/2); return CMDIFramewnd :PreCreateWindow(cs); 11. HYPERLINK

26、l A11 如何將窗口居中顯示? Easy, Call Function CWnd: Center Windows Example(1): Center Window( ); /Relative to its parent / Relative to Screen Example(2): Center Window(CWnd: GetDesktopWindow( ); /Relative to Applications MainWindow AfxGetMainWnd( ) - Center Window( ); 12. HYPERLINK l A12 如何讓窗口和MDI窗口一啟動(dòng)就最大化和最

27、小化? 先說(shuō)窗口。 在 InitStance 函數(shù)中設(shè)定 m_nCmdShow的 取值. m_nCmdShow=SW_SHOWMAXMIZED ; /最大化 m_nCmdShow=SW_SHOWMINMIZED ; /最小化 m_nCmdShow=SW_SHOWNORMAL ; /正常方式 MDI窗口: 如果是創(chuàng)立新的應(yīng)用程序,可以用 MFC AppWizard 的Advanced 按鈕并在MDI子窗口風(fēng)格組中檢測(cè)最大化或最小化; 還可以重載 MDI Window 的 PreCreateWindow函數(shù),設(shè)置WS_MAXMIZE or WS_MINMIZE; 如果從 CMDIChildWnd

28、派生,調(diào)用 OnInitialUpdate函數(shù)中的 CWnd:Show,Window來(lái)指定 MDI Child Window的 風(fēng)格。 13. HYPERLINK l A13 如何使程序保持極小狀態(tài)? 很有意思的問(wèn)題 這么辦: 在恢復(fù)程序窗體大小時(shí), Windows會(huì)發(fā)送WM_QUERY-OPEN消息,用 ClassWizard設(shè)置成員函數(shù) OnQueryOpen() ,add following code: Bool CMainFrame: OnQueryOpen( ) Return false; 14. HYPERLINK l A14 如何限制窗口的 大小? 也就是 FixedDialog

29、形式。 Windows 發(fā)送 WM_GETMAXMININFO消息來(lái)跟蹤, 響應(yīng)它,在 OnGetMAXMININFO 中寫(xiě)代碼: 15. HYPERLINK l A15 如何使窗口不可見(jiàn)? 很簡(jiǎn)單,用SW_HIDE 隱藏窗口,可以結(jié)合 FindWindow,ShowWindow 控制. 16. HYPERLINK l A16 如何使窗口始終在最前方? 兩種途徑. BringWindowToTop(Handle); SetWindowPos函數(shù),指定窗口的 最迎風(fēng)格,用WS_EX_TOPMOST擴(kuò)展窗口的 風(fēng)格 Example: void ToggleTopMost( CWnd *pWnd)

30、ASSERT_VALID(pWnd); pWnd -SetWindowPos(pWnd- GetStyle( ) &WS_EX_TOPMOST)? &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE); 17、 HYPERLINK l A17 如何創(chuàng)立一個(gè)字繚繞的CEditView 重載CWnd : : PreCreateWindow和修改CREATESTRUCT結(jié)構(gòu),關(guān)閉CEditView對(duì)象 的ES_AUTOHSCROLL和WS_HSCROLL風(fēng)格位, 由于CEditView : : PreCreateWindow顯示設(shè)置cs.

31、 style,調(diào)用基類(lèi)函數(shù)后要修改cs . style。 BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs) /First call basse class function . BOOL bResutl =CEditView : : PreCreateWindow (cs) ; / Now specify the new window style . cs.style &= (ES_AUTOHSCROLL WS_HSCROLL); return bResult ; 18、 HYPERLINK l A18 通用控件的顯示窗口 M

32、FC提供了幾個(gè)CView派生的視窗類(lèi), 封裝了通用控件的功能,但仍然使用工作框文檔顯示窗口體系結(jié)構(gòu):CEditView封裝了編輯控件,CTreeView保持了樹(shù)列表控件,CListView封裝了列表顯示窗口控件,CRichEditView可以處理多種編輯控件。 19、 HYPERLINK l A19 移動(dòng)窗口 調(diào)用CWnd : : SetWindowPos并指定SWP_NOSIZE標(biāo)志。目的位置與父窗口有關(guān)頂層窗口與屏幕有關(guān)。調(diào)用CWnd : : MoveWindow時(shí)必須要指定窗口的大小。 /Move window to positoin 100 , 100 of its parent wi

33、ndow . SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE SWP_NOAORDER); 20、 HYPERLINK l A20 重置窗口的大小 調(diào)用CWnd: : SetWindowPos并指定SWP_NOMOVE標(biāo)志, 也可調(diào)用CWnd : : MoveWindow 但必須指定窗口的位置。 / Get the size of the window . Crect reWindow ; GetWindowRect (reWindow ); /Make the window twice as wide and twice as tall

34、. SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2, reWindow . Height () * 2, SWP_NOMOVE SWP_NOZORDER ); 21、 HYPERLINK l A21 如何單擊除了窗口標(biāo)題欄以外的區(qū)域使窗口移動(dòng) 當(dāng)窗口需要確定鼠標(biāo)位置時(shí)Windows向窗口發(fā)送WM_NCHITTEST信息,可以處理該信息使Windows認(rèn)為鼠標(biāo)在窗口標(biāo)題上。對(duì)于對(duì)話框和基于對(duì)話的應(yīng)用程序,可以使用ClassWizard處理該信息并調(diào)用基類(lèi)函數(shù), 如果函數(shù)返回HTCLIENT 那么說(shuō)明鼠標(biāo)在客房區(qū)域,返回HTCAPTION說(shuō)

35、明鼠標(biāo)在Windows的標(biāo)題欄中。 UINT CSampleDialog : : OnNcHitTest (Cpoint point ) UINT nHitTest =Cdialog: : OnNcHitTest (point ); return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ; 上述技術(shù)有兩點(diǎn)不利之處, 其一是在窗口的客戶區(qū)域雙擊時(shí), 窗口將極大;其二, 它不適合包含幾個(gè)視窗的主框窗口。還有一種方法,當(dāng)用戶按下鼠標(biāo)左鍵使主框窗口認(rèn)為鼠標(biāo)在其窗口標(biāo)題上,使用ClassWizard在視窗中處理WM_LBUTTODOWN信息并向主框窗口發(fā)

36、送一個(gè)WM_NCLBUTTONDOWN信息和一個(gè)單擊測(cè)試HTCAPTION。 void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point ) CView : : OnLButtonDow (nFlags , pont ); /Fool frame window into thinking somene clicked on its caption bar . GetParentFrame ( ) PostMessage ( WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x ,

37、 point .y) ); 該技術(shù)也適用于對(duì)話框和基于對(duì)的應(yīng)用程序,只是不必調(diào)用CWnd : : GetParentFrame 。 void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point ) Cdialog : : OnLButtonDow (nFlags, goint ); /Fool dialog into thinking simeone clicked on its caption bar . PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.

38、x , point. y ) ) 22、 HYPERLINK l A22 如何改變視窗的背景顏色 Windows向窗口發(fā)送一個(gè)WM_ERASEBKGND消息通知該窗口擦除背景,可以使用ClassWizard重載該消息的缺省處理程序來(lái)擦除背景實(shí)際是畫(huà),并返回TRUE以防止Windows擦除窗口。 /Paint area that needs to be erased. BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) / Create a pruple brush. CBrush Brush (RGB (128 , 0 , 128) ); / Select

39、 the brush into the device context . CBrush* pOldBrush = pDCSelcetObject (&brush); / Get the area that needs to be erased . CRect reClip ; pDCGetCilpBox (&rcClip); /Paint the area. pDC PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY ); /Unselect brush out of device

40、context . pDCSelectObject (pOldBrush ); / Return nonzero to half fruther processing . return TRUE; 23、 HYPERLINK l A23 如何改變窗口標(biāo)題 調(diào)用CWnd : : SetWindowText可以改變?nèi)魏未翱诎丶臉?biāo)題。/Set title for applications main frame window . AfxGetMainWnd ( ) SetWindowText (_T(Application title) ); /Set title for Views MDI c

41、hild frame window . GetParentFrame ( ) SetWindowText (_T (MDI Child Frame new title) ); /Set title for dialogs push button control. GetDigitem (IDC_BUTTON) SetWindowText (_T (Button new title ) ); 如果需要經(jīng)常修改窗口的標(biāo)題注:控件也是窗口,應(yīng)該考慮使用半文檔,在聯(lián)機(jī)幫助中找不到它,它在AFXPRIV.H中半文檔化, 在以后發(fā)行的MFC中將文檔化。 AfxSetWindowText的實(shí)現(xiàn)如下: voi

42、k AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew ) itn nNewLen= Istrlen (Ipaznew); TCHAR szOld 256; /fast check to see if text really changes (reduces flash in the controls ) if (nNewLen _contof (szOld) : : GetWindowText (hWndCrtl , szOld , _countof (szOld) !=nNewLen Istrcmp (szOld , IpszN

43、ew )! = 0 /change it : : SetWindowText (hWndCtrl , IpszNew ); 24、 HYPERLINK l A24 如何防止主框窗口在其說(shuō)明中顯示活動(dòng)的文檔名 創(chuàng)立主框窗口和MDI子窗口進(jìn)通常具有FWS_ADDTOTITLE風(fēng)格位, 如果不希望在說(shuō)明中自動(dòng)添加文檔名, 必須禁止該風(fēng)格位, 可以使用ClassWizard重置CWnd: : PreCreateWindow并關(guān)閉FWS_ADDTOTITLE風(fēng)格。 BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs) /Turn off FWS_AD

44、DTOTITLE in main frame . cs.styel & = FWS_ADDTOTITLE ; return CMDIFrameWnd : : PreCreateWindow (cs ); 關(guān)閉MDI子窗口的FWS _ADDTOTITLE風(fēng)格將創(chuàng)立一個(gè)具有空標(biāo)題的窗口,可以調(diào)用CWnd: : SetWindowText來(lái)設(shè)置標(biāo)題。記住自己設(shè)置標(biāo)題時(shí)要遵循接口風(fēng)格指南。 25、 HYPERLINK l A25 如何獲取有關(guān)窗口正在處理的當(dāng)前消息的信息 調(diào)用CWnd: : GetCurrentMessage可以獲取一個(gè)MSG指針。例如,可以使用ClassWizard將幾個(gè)菜單項(xiàng)處理程

45、序映射到一個(gè)函數(shù)中,然后調(diào)用GetCurrentMessage來(lái)確定所選中的菜單項(xiàng)。 viod CMainFrame : : OnCommmonMenuHandler ( ) /Display selected menu item in debug window . TRACE (Menu item %u was selected . n , GetCruuentMessage ( ) wParam ); 26、 HYPERLINK l A26 如何創(chuàng)立一個(gè)不規(guī)那么形狀的窗口 可以使用新的SDK函數(shù)SetWindowRgn。該函數(shù)將繪畫(huà)和鼠標(biāo)消息限定在窗口的一個(gè)指定的區(qū)域,實(shí)際上使窗口成為指定

46、的不規(guī)那么形狀。 使用AppWizard創(chuàng)立一個(gè)基于對(duì)的應(yīng)用程序并使用資源編輯器從主對(duì)話資源中刪除所在的缺省控件、標(biāo)題以及邊界。 給對(duì)話類(lèi)增加一個(gè)CRgn數(shù)據(jù)成員,以后要使用該數(shù)據(jù)成員建立窗口區(qū)域。 Class CRoundDlg : public CDialog private : Crgn m_rgn : / window region ; 修改OnInitDialog函數(shù)建立一個(gè)橢圓區(qū)域并調(diào)用SetWindowRgn將該區(qū)域分配給窗口: BOOL CRoundDlg : : OnInitDialog ( ) CDialog : : OnInitDialog ( ) ; /Get size

47、 of dialog . CRect rcDialog ; GetClientRect (rcDialog ); / Create region and assign to window . m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) ); SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE ); return TRUE ; 通過(guò)建立區(qū)域和調(diào)用SetWindowRgn,已經(jīng)建立一個(gè)不規(guī)那么形狀的窗口,下面的例子程序是修改OnPain

48、t函數(shù)使窗口形狀看起來(lái)象一個(gè)球形體。voik CRoundDlg : : OnPaint ( ) CPaintDC de (this) ; / device context for painting . /draw ellipse with out any border dc. SelecStockObject (NULL_PEN); /get the RGB colour components of the sphere color COLORREF color= RGB( 0 , 0 , 255); BYTE byRed =GetRValue (color); BYTE byGreen =

49、 GetGValue (color); BYTE byBlue = GetBValue (color); / get the size of the view window Crect rect ; GetClientRect (rect); / get minimun number of units int nUnits =min (rect.right , rect.bottom ); /calculate he horiaontal and vertical step size float fltStepHorz = (float) rect.right /nUnits ; float

50、fltStepVert = (float) rect.bottom /nUnits ; int nEllipse = nUnits/3; / calculate how many to draw int nIndex ; / current ellipse that is being draw CBrush brush ; / bursh used for ellipse fill color CBrush *pBrushOld; / previous brush that was selected into dc /draw ellipse , gradually moving toward

51、s upper-right corner for (nIndex = 0 ; nIndes GetDescendantWindow (AFX_IDW_STUTUS_BAR); /Get pointer to toolbar . CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( ) GetDescendantWindow (AFX_IDW_TOOLBAR); 28、 HYPERLINK l A28 如何使能和禁止工具條的工具提示 如果設(shè)置了CBRS_TOOLTIPS風(fēng)格位,工具條將顯示工具提示,要使能或者禁止工具提示,需要設(shè)置或者去除該風(fēng)格位

52、。下例通過(guò)調(diào)用CControlBar : : GetBarStyle 和CControlBar : : SetBarStyle建立一個(gè)完成此功能的成員函數(shù): void CMainFrame : : EnableToolTips ( BOOL bDisplayTips ) ASSERT_VALID (m_wndToolBar); DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ; if (bDisplayTips) dwStyle =CBRS_TOOLTIPS ; else dwStyle & = CBRS_TOOLTIPS ; m_wndToolBa

53、r.SetBarStyle (dwStyle ); 29、 HYPERLINK l A29 如何設(shè)置工具條標(biāo)題 工具條是一個(gè)窗口,所以可以在調(diào)用CWnd : : SetWindowText來(lái)設(shè)置標(biāo)題,例子如下: int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct ) / Set the caption of the toolbar . m_wndToolBar.SetWindowText (_T Standdard); 30、HYPERLINK l A30如何創(chuàng)立和使用無(wú)模式對(duì)話框 MFC將模式和無(wú)模式對(duì)話封裝在同一個(gè)類(lèi)中,但是

54、使用無(wú)模式對(duì)話需要幾個(gè)對(duì)話需要幾個(gè)額處的步驟。首先,使用資源編輯器建立對(duì)話資源并使用ClassWizard創(chuàng)立一個(gè)CDialog的派生類(lèi)。模式和無(wú)模式對(duì)話的中止是不一樣的: 模式對(duì)話通過(guò)調(diào)用CDialog : : EndDialog 來(lái)中止,無(wú)模式對(duì)話那么是調(diào)用CWnd: : DestroyWindow來(lái)中止的,函數(shù)CDialog : : OnOK和CDialog : : OnCancel調(diào)用EndDialog ,所以需要調(diào)用DestroyWindow并重置無(wú)模式對(duì)話的函數(shù)。 void CSampleDialog : : OnOK ( ) / Retrieve and validate dia

55、log data . if (! UpdateData (TRUE) ) / the UpdateData rountine will set focus to correct item TRACEO ( UpdateData failed during dialog termination .n) ; return ; /Call DestroyWindow instead of EndDialog . DestroyWindow ( ) ; void CSampleDialog : : OnCancel ( ) /Call DestroyWindow instead of EndDialo

56、g . DestroyWindow ( ) ; 其次,需要正確刪除表示對(duì)話的C+對(duì)象。對(duì)于模式對(duì)來(lái)說(shuō),這很容易,需要?jiǎng)?chuàng)立函數(shù)返回后即可刪除C+對(duì)象;無(wú)模式對(duì)話不是同步的,創(chuàng)立函數(shù)調(diào)用后立即返回,因而用戶不知道何時(shí)刪除C+對(duì)象。撤銷(xiāo)窗口時(shí)工作框調(diào)用CWnd : : PostNcDestroy, 可以重置該函數(shù)并執(zhí)行去除操作,諸如刪除this指針。 void CSampleDialog : : PostNcDestroy ( ) / Declete the C+ object that represents this dialog . delete this ; 最后,要?jiǎng)?chuàng)立無(wú)模式對(duì)話。可以調(diào)用C

57、Dialog : : DoModal創(chuàng)立一個(gè)模式對(duì)放,要?jiǎng)?chuàng)立一個(gè)無(wú)模式對(duì)話那么要調(diào)用CDialog: : Create。下面的例子說(shuō)明 了應(yīng)用程序是如何創(chuàng)立無(wú)模式對(duì)話的: void CMainFrame : : OnSampleDialog ( ) /Allocate a modeless dialog object . CSampleDilog * pDialog =new CSampleDialog ; ASSERT_VALID (pDialog) ; /Create the modeless dialog . BOOL bResult = pDialog Creste (IDD_IDAL

58、OG) ; ASSERT (bResult ) ; 31、 HYPERLINK l A31 如何在對(duì)話框中顯示一個(gè)位圖 這要?dú)w功于Win 32先進(jìn)的靜態(tài)控件和Microsoft的資源編輯器, 在對(duì)話框中顯示位圖是很容易的, 只需將圖形控件拖到對(duì)話中并選擇適當(dāng)屬性即可,用戶也可以顯示圖標(biāo)、位圖以及增強(qiáng)型元文件。 32、 HYPERLINK l A32 如何改變對(duì)話或窗體視窗的背景顏色 調(diào)用CWinApp : : SetDialogBkColor可以改變所有應(yīng)用程序的背景顏色。第一個(gè)參數(shù)指定了背景顏色,第二個(gè)參數(shù)指定了文本顏色。下例將應(yīng)用程序?qū)υ捲O(shè)置為藍(lán)色背景和黃色文本。 BOOL CSample

59、App : : InitInstance ( ) /use blue dialog with yellow text . SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ; 需要重畫(huà)對(duì)話或?qū)υ挼淖涌丶r(shí),Windows向?qū)υ挵l(fā)送消息WM_CTLCOLOR,通常用戶可以讓W(xué)indows選擇繪畫(huà)背景的刷子,也可重置該消息指定刷子。下例說(shuō)明了創(chuàng)立一個(gè)紅色背景對(duì)話的步驟。 首先,給對(duì)話基類(lèi)增加一人成員變量CBursh : class CMyFormView : public CFormView private : CBrush m

60、_ brush ; / background brush ; 其次, 在類(lèi)的構(gòu)造函數(shù)中將刷子初始化為所需要的背景顏色。 CMyFormView : : CMyFormView ( ) / Initialize background brush . m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) ) 最后,使用ClassWizard處理WM_CTLCOLOR消息并返回一個(gè)用來(lái)繪畫(huà)對(duì)話背景的刷子句柄。注意:由于當(dāng)重畫(huà)對(duì)話控件時(shí)也要調(diào)用該函數(shù),所以要檢測(cè)nCtlColor參量。 HBRUSH CMyFormView : : OnCtlColor (CDC*

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論