下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二部第二部 用戶(hù)界面實(shí)本部分的實(shí)例將把重點(diǎn)放在應(yīng)用程序用戶(hù)界面的各個(gè)方面,這些界面可以由DeveloperStudio、MFC和VisualC++來(lái)創(chuàng)建。用戶(hù)界面開(kāi)發(fā)工具是本部分密切關(guān)注的內(nèi)容,所以該部分第4章應(yīng)用程序和環(huán)境本章的實(shí)例覆蓋了應(yīng)用程序與其所處環(huán)境交互的各個(gè)方面,內(nèi)容包括應(yīng)用程序如何運(yùn)行以及應(yīng)用程序的外觀如何顯現(xiàn)。實(shí)例的范圍包括尋找空間添加標(biāo)識(shí)以及同時(shí)運(yùn)行同一個(gè)應(yīng)用程序等。第5章菜單和控件條這一章的內(nèi)容涉及應(yīng)用程序的菜單和控制條,這也許是用戶(hù)同應(yīng)用程序之間進(jìn)行交互的主要方式。AppWizard自動(dòng)地為應(yīng)用程序添加基本的菜單、和狀態(tài)欄,但是這些菜單和控制條是很簡(jiǎn)單的,連DeveloperStudio的都比不上。自己動(dòng)手費(fèi)點(diǎn)力可以為自己的應(yīng)用程序增加與evelopertudio類(lèi)似的外觀。第6章如果創(chuàng)建SDI或者M(jìn)DI應(yīng)用程序,則此時(shí)應(yīng)用程序的視將是用戶(hù)與應(yīng)用程序,特別是與正在編輯中的屬于應(yīng)用程序的文檔之間進(jìn)行交互的主要方式。本章所有的實(shí)例都與視相關(guān),從創(chuàng)建一個(gè)屬性表、打印視到拖放文件到視中等等。第7章框和框和條用于提示用戶(hù)使用不同類(lèi)型的控件,比如按鈕和列表框等等。MFC和DeveloperStudio自動(dòng)創(chuàng)建框和框類(lèi)。本章探討手工修改框的各種方式,之更加符合用戶(hù)的要求。第8章控件窗口框上添加了按鈕和編輯框等控件窗口(操作系統(tǒng)提供的子窗口)。不僅可以在框中第9章繪圖位圖和圖標(biāo)可以為自己的應(yīng)用程序增加顏色和風(fēng)格。因?yàn)樗械拇翱诮缑娑碱?lèi)似,所以標(biāo)識(shí)符和ssh屏幕才是真正區(qū)別不程序外觀的唯方式。顯而易見(jiàn),繪圖創(chuàng)建自己的控件以及在CAD應(yīng)用程序中顯示圖表也是很重要的。第10章幫助比起閱讀手冊(cè)里的各種命令,有助于大量減少學(xué)習(xí)應(yīng)用程序所需要的時(shí)間和困難,用戶(hù)可以直接查詢(xún)件,本章實(shí)例描了如何實(shí)現(xiàn)3種類(lèi)型的。第11章普通窗口視、框和控制條、控件窗口和等組成了MFC應(yīng)用程序的界面,但它們都是建立在低級(jí)窗口的基礎(chǔ)之上。為什么在其他元素都很復(fù)雜的情況下卻采用這樣類(lèi)型的窗口呢?這是因?yàn)?,在這個(gè)級(jí)別上編寫(xiě)程序可以達(dá)到高級(jí)窗口才能達(dá)到的效果。第12章特定的應(yīng)用程序本章用一些專(zhuān)門(mén)的MFC應(yīng)用程序來(lái)概述全部分。本章的實(shí)例包括一對(duì)簡(jiǎn)單的文本編輯器和兩個(gè)數(shù)據(jù)庫(kù)編輯器。其中一個(gè)實(shí)例提供了創(chuàng)建自己的瀏覽器風(fēng)格應(yīng)用程序的全部?jī)?nèi)容。最后,本章還包括了如何創(chuàng)建簡(jiǎn)單的Wizard第4 本章探討應(yīng)用程序和環(huán)境之間在各方面如何交互。本章的內(nèi)容包括所有應(yīng)用程序的運(yùn)行方式以及它們向用戶(hù)呈現(xiàn)出的外觀表現(xiàn)。這里的實(shí)例有:尋找新地方來(lái)添加標(biāo)識(shí)符,在環(huán)境中添加圖標(biāo)以及防止同時(shí)運(yùn)行兩個(gè)相同的應(yīng)用程序。這些實(shí)例具體包括:實(shí)例1在中添加一個(gè)靜態(tài)標(biāo)識(shí)符,即在中添加一個(gè)程序附屬的,使之一實(shí)例2在中添加一個(gè)動(dòng)態(tài)標(biāo)識(shí)符,即上例中靜態(tài)標(biāo)識(shí)符的動(dòng)態(tài)版本。實(shí)例3只啟動(dòng)一個(gè)實(shí)例,本例將防止同時(shí)運(yùn)行應(yīng)用程序中的多個(gè)實(shí)例。實(shí)例4創(chuàng)建一個(gè)框/MDI混合式應(yīng)用程序,本例將創(chuàng)建這兩類(lèi)標(biāo)準(zhǔn)的應(yīng)用程序類(lèi)型。實(shí)例 統(tǒng)托盤(pán)是一個(gè)位于桌面上的圖標(biāo)集,與時(shí)間顯示相鄰)實(shí)例6 在主窗口標(biāo)題欄上顯示標(biāo)識(shí)符,本例利用應(yīng)用程序的標(biāo)題欄來(lái)顯示標(biāo)識(shí)符或其他位圖。實(shí)例1:在中添加靜態(tài)標(biāo)識(shí)是單控件窗口,可以在其客戶(hù)區(qū)內(nèi)繪制各類(lèi)按鈕。當(dāng)用戶(hù)單擊某個(gè)按鈕時(shí),工具欄就會(huì)根據(jù)該按鈕的圖像來(lái)觸發(fā)相應(yīng)令。這里只是簡(jiǎn)單地給應(yīng)用程序的添加一個(gè)子窗口,而且該子窗口遠(yuǎn)離其他按鈕。所添加的子窗口是一個(gè)普通窗口,它可以顯示一幅位圖,并且隨著尺寸的改變而不斷移動(dòng)。用ClassWizard創(chuàng)建一個(gè)來(lái)自genericCWndCWzdBitmap 在本系列的第一本書(shū)中,
意類(lèi)型的位圖圖4-1 在該類(lèi)中添加一個(gè)CreateBX()成員函數(shù),該函數(shù)將裝入位圖標(biāo)識(shí)符,并同時(shí)在中創(chuàng)建一個(gè)實(shí)際的窗口:voidCWzdLogo::CreateBX(CWnd*pWnd,UINTnBitmapID,UINTnChildID{m_bitmap.LoadBitmapEx(nBitmapID,TRUECRectrect(0,0,0,0 //willberesizingconstantlyCreate(NULL,_T(""),WS_CHILD|WS_VISIBLE,rect,pWnd,nChildID}voidCWzdLogo::MoveLogo(intnWidth,intnHeight{MoveWindow(nWidth-m_bitmap.m_Width,0,m_bitmap.m_Width,nHeight}應(yīng)用ClassWizard添加一個(gè)在窗口中繪制位圖的WM_PAINT消息處理函數(shù)句柄,并以此來(lái)void{CPaintDCdc(this //devicecontextfor//getbitmapcolorsCPalette*pOldPaldc.SelectPalette(m_bitmap.GetPalette(),FALSE);//getdevicecontexttoselectbitmapinto patibleDC(&dc);p.SelectObject(&m_bitmap);//drawdc.BitBlt(0,0,m_bitmap.m_Width,m_bitmap.m_Height, 0,0,SRCCOPY);//reselectolddc.SelectPalette(pOldPal,FALSE}創(chuàng)建一個(gè)包含普通窗口類(lèi)的自定義使用ClassWizard從CToolBarCtrl中創(chuàng)建一個(gè)新類(lèi)。編輯所有生成的h和.cpp文件,以修改所有從CToolBarCtrl到CToolBar的(ClassWizard不允許從CToolBar類(lèi)派生一個(gè)類(lèi))。使用ClassWizard給添加一個(gè)WM_CRET消息處理函數(shù)句柄。用該句柄調(diào)用普通窗口類(lèi)的CreatBX()函數(shù):intCWzdToolbar::OnCreate(LPCREATESTRUCTlpCreateStruct{if(CToolBar::OnCreate(lpCreateStruct)=-1)return-1;m_Logo.CreateBX(this,IDB_LOGO,-1return}再一次使用ClassWizard來(lái)添加一個(gè)WM_SIZE消息處理函數(shù),這里要調(diào)用普通窗口類(lèi)的voidCWzdToolbar::OnSize(UINTnType,intcx,intcy{CToolBar::OnSize(nType,cx,cym_Logo.MoveLogo(cx,cy}在應(yīng)用程序中使用新的現(xiàn)在,在MainFrm.h文件中用新的類(lèi)替換//changeCToolBartoCWzdToolBarCWzdToolbarm_wndToolBar;不幸的是,本實(shí)例對(duì)可??康木筒黄鹱饔昧?。這是因?yàn)榭赏?康膬H僅與它所包括的最后一個(gè)按鈕長(zhǎng)度相同。而該實(shí)例卻依賴(lài)于具有大量額外空間的,以便在結(jié)尾處粘貼普通窗口。因此必須在注釋處將其設(shè)為非??渴?un-dockable,或者在CmainFrame::OnCreat()中刪除以下各列:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct{ //commentoutordeletethese//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY//EnableDocking(CBRS_ALIGN_ANY//DockControlBar(&m_wndToolBarreturn}實(shí)際上,可以利用本實(shí)例在父窗口的任何空白區(qū)粘貼標(biāo)識(shí)符。只要在父窗口的類(lèi)中嵌入這個(gè)窗口,并使用ClassWizard添加一個(gè)WM_CRET消息處理函數(shù)句柄就可以創(chuàng)建標(biāo)識(shí)符窗口。如果想在可??康闹姓迟N一個(gè)標(biāo)識(shí)符,請(qǐng)參考第2章。在第2章中,你會(huì)發(fā)現(xiàn):通過(guò)在CoolBar類(lèi)中重載CalCDynamicLayout()可以擴(kuò)大的尺寸使之包含你的標(biāo)符。無(wú)論如何都要確保提供該標(biāo)識(shí)符的水平和垂直兩個(gè)版本。運(yùn)行隨書(shū)附帶光盤(pán)上的工程時(shí),會(huì)注意到右手方向的上寫(xiě)有Your的程序—標(biāo)識(shí)符#if!definedWZDLOGO_H#defineWZDLOGO_H//WzdLogo.h:header#include//CWzdLogoclassCWzdLogo:public{//ConstructionvoidCreateBX(CWnd*pWnd,UINTnBitmapID,UINTnChildID);voidMoveLogo(intnWidth,intnHeight);////ClassWizardgeneratedvirtualfunction//{{AFX_VIRTUAL(CWzdLogo////Implementationvirtual//Generatedmessagemapafx_msgvoidOnPaint();//}}AFX_MSGCWzdBitmap//WzdLogo.cpp:implementation#include"stdafx.h"#ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE;//{}{}BEGIN_MESSAGE_MAP(CWzdLogo,CWnd//{{AFX_MSG_MAP(CWzdLogo)//}}AFX_MSG_MAP//CWzdLogomessagevoid{CPaintDCdc(this //devicecontextfor//getbitmapCPalette*pOldPal=dc.SelectPalette(m_bitmap.GetPalette(),FALSE);//getdevicecontexttoselectbitmapinto patibleDC(&dc);p.SelectObject(&m_bitmap);//drawdc.BitBlt(0,0, p,0,0,SRCCOPY//reselectoldpalette}voidCWzdLogo::CreateBX(CWnd*pWnd,UINTnBitmapID,UINTnChildID{m_bitmap.LoadBitmapEx(nBitmapID,TRUE);CRectrect(0,0,0,0);Create(NULL,_T(""),WS_CHILD|WS_VISIBLE,rect,pWnd,nChildID}voidCWzdLogo::MoveLogo(intnWidth,intnHeight{MoveWindow(nWidth-m_bitmap.m_Width,0,m_bitmap.m_Width,nHeight}程序—#if!definedWZDTOOLBAR_H#defineWZDTOOLBAR_H//WzdToolbar.h:header#include//CWzdToolbarclassCWzdToolbar:public{//Construction////ClassWizardgeneratedvirtualfunction//////Implementationvirtual//Generatedmessagemapfunctions//afx_msgvoidOnSize(UINTnType,intcx,intcyafx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct//CWzdLogo//WzdToolbar.cpp:implementation#include"stdafx.h"#include"wzd.h"#ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE;//{}{}BEGIN_MESSAGE_MAP(CWzdToolbar,CToolBar//}}AFX_MSG_MAP//CWzdToolbarmessageintCWzdToolbar::OnCreate(LPCREATESTRUCTlpCreateStruct{if(CToolBar::OnCreate(lpCreateStruct)=-1)return-1;m_Logo.CreateBX(this,IDB_LOGO,-1return}voidCWzdToolbar::OnSize(UINTnType,intcx,intcy{CToolBar::OnSize(nType,cx,cym_Logo.MoveLogo(cx,cy}實(shí)例2:在中添加動(dòng)態(tài)標(biāo)識(shí)如圖4-2所示,要在應(yīng)用程序的右上角處一個(gè)AVI文件(動(dòng)態(tài)位圖用工用工具條中該創(chuàng)建自己的,并在其較MFC的CToolBar類(lèi)中產(chǎn)生,并用MFC的CAnitmateCtrl類(lèi)創(chuàng)建動(dòng)給應(yīng)用程序資源添加一個(gè)AVI單擊DeveloperStudio的 圖4-2 和Resources菜單命令,將會(huì)產(chǎn)生InsertResources框。單擊Import并定位要找的VI文件。當(dāng)提示資源類(lèi)型時(shí),輸入VI。該命令會(huì)把指定的VI文件拷貝到項(xiàng)目的\res文件,并同時(shí)在項(xiàng)目資源中添加一個(gè)VI文件夾。使用鼠標(biāo)右鍵單擊資源ID號(hào),給它起一個(gè)恰當(dāng)?shù)拿?。本?shí)IDR_MFC2。創(chuàng)建一個(gè)自定義使用ClassWizard創(chuàng)建一個(gè)來(lái)自CToolBarCtrl的新類(lèi)。用文本編輯器修改所有對(duì)CToolBar的(注意:ClassWizard通常不允許從CToolBar中派生類(lèi))。CAnimateCtrl使用ClassWizard給新的類(lèi)中添加一個(gè)WM_CREART消息處理函數(shù)。使用該句柄創(chuàng)建上一步中要嵌入的動(dòng)畫(huà)控件窗口。同時(shí)裝載前面創(chuàng)建的AVI資源,并將其初始化為三次:intCWzdToolbar::OnCreate(LPCREATESTRUCTlpCreateStruct{if(CToolBar::OnCreate(lpCreateStruct)=-1)return-1;m_AnimateCtrl.Create(WS_CHILD|WS_VISIBLE|ACS_CENTER,CRect(0,0,0,0),this,IDC_ANIMATE_CTRL);m_AnimateCtrl.Open(IDR_MFC2m_AnimateCtrl.y(0,-1,3 //ythreetimesreturn}(CRect(0,0,0,0))。這是因?yàn)槌绦騿T無(wú)論如使用ClassWizard給類(lèi)添加一個(gè)WM_SIZE消息處理函數(shù)。在WM_SIZE消息處理函數(shù)voidCWzdToolbar::OnSize(UINTnType,intcx,intcy{CToolBar::OnSize(nType,cx,cyCRectrect;GetWindowRect(&rect);ScreenTo(&rect);rect.left=rect.right-32;m_AnimateCtrl.MoveWindow(rect}下面還要給添加兩個(gè)輔助函數(shù),以便允許其他類(lèi)來(lái)這個(gè)AVI文件voidCWzdToolbar::{m_AnimateCtrl.y(0,-1,-1}void{}在CMainFrame中使用新的用新的類(lèi)替換當(dāng)前由MainFrame使用的類(lèi)//useCWzdToolbarfortoolbarinMainfrm.hCWzdToolbarm_wndToolBar;同樣必須通過(guò)注釋MainFrm.cpp中的以下程序行將的浮動(dòng)和??啃阅苤脼榻?。否則,將會(huì)自動(dòng)改變其尺寸,使得它僅能包含它自己的按鈕://disabletoolbardockingin//TODO:Deletethesethreelinesifyoudon'twantthetoolbar be//////動(dòng)畫(huà)控件不能擴(kuò)展到控件實(shí)際的邊界。這是因?yàn)榭丶谄渲車(chē)L制了一個(gè)空白邊界。如果想將動(dòng)畫(huà)控件擴(kuò)展到控件的實(shí)際邊界,請(qǐng)參考站點(diǎn) 的WJ5/99中的文章“使MF。AVI文件是由兩個(gè)或多個(gè)已轉(zhuǎn)換成為一個(gè).avi文件框架的位圖文件創(chuàng)建的。進(jìn)行此轉(zhuǎn)換的應(yīng)用程序可以在Internet的共享軟件包中找到。運(yùn)行隨書(shū)附帶光盤(pán)上的工程時(shí),會(huì)注意到右手方向的上正在一個(gè)AVI文件程序—#if!definedWZDTOOLBAR_H#defineWZDTOOLBAR_H//WzdToolbar.h:header//CWzdToolbarclassCWzdToolbar:public{//ConstructionvoidyLogo();void////ClassWizardgeneratedvirtualfunction//{{AFX_VIRTUAL(CWzdToolbar////Implementationvirtual//Generatedmessagemapfunctions//{{AFX_MSG(CWzdToolbarafx_msgvoidOnSize(UINTnType,intcx,intcyafx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct//CAnimateCtrl//WzdToolbar.cpp:implementation#include"stdafx.h"#include"wzd.h"#ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE;//{}{}BEGIN_MESSAGE_MAP(CWzdToolbar,CToolBar//}}AFX_MSG_MAP//CWzdToolbarmessageintCWzdToolbar::OnCreate(LPCREATESTRUCTlpCreateStruct{if(CToolBar::OnCreate(lpCreateStruct)==-1)return-1;m_AnimateCtrl.Create(WS_CHILD|WS_VISIBLE|WS_DLGFRAME|WS_EX_EDGE|A CRect(0,0,0,0),this,IDC_ANIMATE_CTRL);m_AnimateCtrl.Open(IDR_MFC2);m_AnimateCtrl.y(0,-1,3);return}voidCWzdToolbar::OnSize(UINTnType,intcx,intcy{CToolBar::OnSize(nType,cx,cyCRectrect;GetWindowRect(&rect);ScreenTo(&rect);rect.left=rect.right-32;m_AnimateCtrl.MoveWindow(rect}voidCWzdToolbar::{m_AnimateCtrl.y(0,-1,-}void{}實(shí)例3MFC和WindowsAPI通常不支持該功能,因此只能自己“動(dòng)手”來(lái)實(shí)現(xiàn)。微軟推薦的方法是為應(yīng)用程序在系統(tǒng)中創(chuàng)建一些唯一的東西,這些唯一的東西在運(yùn)行之前可以檢查出來(lái)。(mutex)的唯一資源?;コ怏w通常用來(lái)同步兩個(gè)或多59中使用的是封裝互斥體的MFC類(lèi),然而,由于必須在應(yīng)用程序類(lèi)中使用#define定義一個(gè)唯一的名字。保該名字唯一的辦法是用為COM接口提供唯一ID號(hào)的GUID程序發(fā)生器,用戶(hù)可以在VC++的\BIN 下找到一個(gè)名為GUIDGEN.EXE的程序,它就是GUID程序發(fā)生器。使用GUIDGEN.EXE定義唯一的名字的一個(gè)實(shí)例如下: "{F5EFF561-ECB3-11d1-A18D-在InitInstance()中創(chuàng)建互使用上面在應(yīng)用程序類(lèi)的InitInstance()函數(shù)的開(kāi)始處定義的名字來(lái)創(chuàng)建一個(gè)互斥體,并保存該互斥體的句柄—在關(guān)閉互斥體時(shí)還要用到該句柄。如果應(yīng)用程序的另一個(gè)實(shí)例已經(jīng)存在,::CreatMutex()函數(shù)就會(huì)給由其他實(shí)例創(chuàng)建的互斥體返回一個(gè)句柄,而不是再創(chuàng)建一個(gè)新的句柄。為了確定該句柄是否為應(yīng)用程序已經(jīng)運(yùn)行的實(shí)例的互斥體的句柄,可以調(diào)用GetLastError()ERROR_ALREADY_EXISTS錯(cuò)誤??梢酝ㄟ^(guò)退出InitInstance()函數(shù)返回一個(gè)ALSE值來(lái)終止應(yīng)用程序的運(yùn)行。以下代碼說(shuō)明了上述過(guò)程是如何完成的:BOOL{m_hOneInstance=::CreateMutex(NULL,FALSE,UNIQUE_NAME);if(GetLastError()=ERROR_ALREADY_EXISTS){AfxMessageBox("Applicationalreadyrunning!");returnFALSE;}::}使用ClassWizard重載應(yīng)用程序類(lèi)的ExitInstance()int{CloseHandle(m_hOneInstance);returnCWinApp::ExitInstance();}不僅可以顯示應(yīng)用程序的實(shí)例已經(jīng)運(yùn)行的錯(cuò)誤信息,而且還可以向其他的實(shí)例廣播消息,告它們其窗放置臺(tái)怎樣其他用序廣播息,以參實(shí)例49。indows會(huì)自動(dòng)清除它所創(chuàng)建的所有互斥體。這使得這種方法更具有可靠性—如果應(yīng)用程序終止,則它就不會(huì)有機(jī)會(huì)調(diào)用CloseHandle()函數(shù),也就不會(huì)留下應(yīng)用程序再次運(yùn)行的互斥體。另一個(gè)確定應(yīng)用程序是否有其他實(shí)例正在運(yùn)行的方法是使用CWnd::FindWindow()函數(shù)。建一個(gè)唯一但隱藏的普通窗口(參見(jiàn)實(shí)例38),并使該窗口可以被以后的應(yīng)用程序?qū)嵗檎?;或者也可以查找?yīng)用程序的主窗口。如果主窗口沒(méi)有唯一且不變的標(biāo)題,就可以給它起一個(gè)唯一的窗口類(lèi)名以便查找??梢栽贑mainFrame的PreCreatWindow()函數(shù)中創(chuàng)建這個(gè)唯一的窗口類(lèi)名。這種方法的缺點(diǎn)是在創(chuàng)建實(shí)例和創(chuàng)建主窗口之間存在著一定的時(shí)間延遲—這樣應(yīng)用程序的第二個(gè)實(shí)例可能會(huì)逃過(guò)檢查而被啟動(dòng),因此微軟不推薦這種方法。實(shí)例4:創(chuàng)建框/MDI混合式應(yīng)用程創(chuàng)建一個(gè)由命令行標(biāo)志所決定的框 MDI應(yīng)用程序使用AppWizard創(chuàng)建一個(gè)MDI應(yīng)用程序。該應(yīng)用程序會(huì)檢查InitInstance()函數(shù)中/d標(biāo)志,如果該標(biāo)志置位,則創(chuàng)建的將是一個(gè)有模式框,而不是MDI框架窗口。一旦該框關(guān)閉,則使InitInstance()函數(shù)返回一個(gè)引起應(yīng)用程序結(jié)束的FALSE值。使用AppWizard創(chuàng)建一個(gè)MDI應(yīng)用程序。使用框編輯器 使 創(chuàng)建自己 修改InitInstance()來(lái)創(chuàng)建上述兩種應(yīng)用程序中的一種用新的CCommandLineInfo類(lèi)代替原有的應(yīng)用程序類(lèi):mandLine(cmdInfo);如果命令行中出現(xiàn)/d,將使用新的框類(lèi)創(chuàng)建有模式框。在框關(guān)閉時(shí),將//ifuserstartedwith/dflag,startdialogappinsteadif(cmdInfo.m_bDialogFg){returnFALSE;}本實(shí)例的另一類(lèi)型是創(chuàng)建一個(gè)基于命令行選項(xiàng)的MDI或SDI應(yīng)用程序。開(kāi)始時(shí)可以用AppWizard創(chuàng)建一個(gè)MDI應(yīng)用程序,接著再根據(jù)某個(gè)特定標(biāo)志的設(shè)置與否來(lái)定義SDI或MDI文檔模板。特別地,可使用AppWizard創(chuàng)建SDI應(yīng)用程序,并將它的InitInstance()結(jié)合到MDI應(yīng)用程序的InitInstance()中。當(dāng)運(yùn)行光盤(pán)上沒(méi)有/d選項(xiàng)的項(xiàng)目時(shí),就會(huì)出現(xiàn)一個(gè)MDI應(yīng)用程序。使用/d選項(xiàng)程序—CCommandLineInfo#if!defined mandLineInfo.h:header mandLineInfo mandLineInfo:public{//ConstructionBOOLvoidParseParam(constTCHAR*pszParam,BOOLbFlag,BOOLbLast////Implementation mandLineInfo.cpp:implementation#include"wzd.h"#include #ifdef#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=FILE; {m_bDialogFg=} {} mandLineInfo::ParseParam(constTCHAR*pszParam,BOOLbFlag,BOOLbLast){CStringsArg(pszParam);if(bFlag){m_bDialogFg pareNoCase("d"}CCommandLineInfo::ParseParam(pszParam,bFlag,bLast}實(shí)例5在系統(tǒng)托盤(pán)(systemtray)中添加圖標(biāo)(如圖4-3所示,系統(tǒng)托盤(pán)是一個(gè)出現(xiàn)在桌面右下方的圖標(biāo)集合)。使用::S_NotifyIcon()WindowAPI調(diào)用給系統(tǒng)托盤(pán)添加一個(gè)圖標(biāo)。為了在用戶(hù)單擊圖標(biāo)時(shí)能夠接收到從該圖標(biāo)返回的消息,需要?jiǎng)?chuàng)建自己的窗口消息,
圖4-3系統(tǒng)托盤(pán)中的圖系統(tǒng)托盤(pán)圖標(biāo)通過(guò)向應(yīng)用程序窗口發(fā)送窗口消息來(lái)向應(yīng)用程序報(bào)告返回。在MDI或SDI應(yīng)用程序中,系統(tǒng)托盤(pán)圖標(biāo)是一種典型的主窗口。因此,需要給CMainFrame類(lèi)添加自己的系統(tǒng)托盤(pán)邏輯。在框應(yīng)用程序中,使用自己的CDialog類(lèi)。如下所示在CMainFrame或CDialog類(lèi)中的包含文件中定義一個(gè)新的窗口消息。當(dāng)用戶(hù)單擊圖標(biāo)時(shí),這個(gè)消息就會(huì)發(fā)送到該類(lèi)所在的窗口://definenewwindowmessagetoindicateuserhasclickedon insystem#defineWM_SYSTEMTRAY在CMainFrame或CDialog派生類(lèi)中添加以下代碼以創(chuàng)建圖標(biāo)。其中的m_hWnd變量是屬于該類(lèi)的窗口句柄。使用ID編輯器將ID_SYSTEMTRAY加入ID。如果應(yīng)用程序顯示的圖標(biāo)有好幾個(gè),這里就會(huì)用不同的圖標(biāo)來(lái)表示。參見(jiàn)下一步了解如何添加WM_SYSTEMTRAY消息//puticoninsystemtrayNOTIFYICONDATAnid.cbSize=sizeof(NOTIFYICONDATAnid.hWnd= //handleofwindowthatwill messagesfromnid.uID=ID_SYSTEMTRAY; //idforthisiconnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//thenextthreeparametersarenid.uCallbackMessage=//messagethaticonsendswhennid.hIcon=AfxGetApp()->LoadIcon(IDI_SYSTEMTRAY_ICON//strcpy(nid.szTip,"SystemTrayTip"::S_NotifyIcon(NIM_ADD,&nid
//bubblehelpmessagefor在CMainFrame或CDialog派生類(lèi)中手工添加一個(gè)新的消息處理函數(shù)。由于是手工添加,因此必須確保將消息映射宏放在{{}}括號(hào)之外,使ClasWizard不能刪除它:BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd//{{AFX_MSG_MAP(CMainFrame:://ON_MESSAGE(WM_SYSTEMTRAY,OnSystemTray如下所示的代碼用于處理來(lái)自圖標(biāo)的消息。其中//handlesystemtrayLRESULTCMainFrame::OnSystemTray( ram,LPARAM{//ram=thenid.uIDdefined (usefulifyouhavemorethenoneiconin//lParam=mouseif(ram=ID_SYSTEMTRAY{switch(lParam{casecasecase}}return}在應(yīng)用程序結(jié)束之前,確保使用以下代碼從系統(tǒng)托盤(pán)中刪除自己的圖標(biāo)。否則該圖標(biāo)將一直存在,直到用戶(hù)重新啟動(dòng)計(jì)算機(jī)時(shí)才。刪除圖標(biāo)的理想位置是在創(chuàng)建圖標(biāo)的窗口的WM_CLOSE消息處理函數(shù)中,代碼如下所示://deleteiconfromsystemtrayNOTIFYICONDATAnid;nid.cbSize=sizeof(NOTIFYICONDATA);nid.hWnd=m_hWnd;nid.uID=nid.uFlags=::S_NotifyIcon(NIM_DELETE,&nid注意 如果是調(diào)試中終應(yīng)用序,就沒(méi)機(jī)會(huì)除統(tǒng)托盤(pán)的圖。但如果拖動(dòng)鼠標(biāo)光標(biāo)到這個(gè)“流浪的”圖標(biāo)上,系統(tǒng)將會(huì)迅速判定該圖標(biāo)不再需要并將其自動(dòng)除。系統(tǒng)托盤(pán)的典型用途是配置一個(gè)應(yīng)用程序并自己的圖標(biāo),然后使應(yīng)用程序隱藏。為了創(chuàng)建這種應(yīng)用程序,可以使用Appizard來(lái)創(chuàng)建一個(gè)框應(yīng)用程序。如果樂(lè)意的話(huà),還可以將框轉(zhuǎn)換為具有的屬性表—如實(shí)例46所示,但不要設(shè)置Wizard的模式。一旦應(yīng)用程序在系統(tǒng)托盤(pán)中好一個(gè)圖標(biāo),它將使用Show_Window(SW_HIDE)來(lái)使自己隱藏。如果用戶(hù)單擊系統(tǒng)托盤(pán)中的相應(yīng)圖標(biāo),就會(huì)出現(xiàn)一個(gè)彈出式菜單或用ShowWindow(SW_HIDE)產(chǎn)生的應(yīng)用程序框。注意隱藏應(yīng)用程序的主窗口將同時(shí)使主窗口從任務(wù)欄中當(dāng)運(yùn)行隨書(shū)附帶光盤(pán)上的工程時(shí),在系統(tǒng)托盤(pán)中就會(huì)出現(xiàn)一個(gè)新的圖標(biāo)??梢栽贛ainFrame.cpp中的OnSystemTray()中設(shè)置斷點(diǎn),并觀察用鼠標(biāo)單擊圖標(biāo)的動(dòng)作給應(yīng)用程序所報(bào)告的消息。實(shí)例6標(biāo)題欄通常是在窗口收到WM_NCPAINT消息時(shí)由系統(tǒng)繪制的。然而,標(biāo)題欄也可以用來(lái)反映某個(gè)窗口的激活與否—通過(guò)窗口背景顏色由灰到亮的變化來(lái)判斷。因此,必須截獲發(fā)送給主窗口的3個(gè)窗口消息:WM_NCPAINTWM_ACTITE和WM_NCACTITE,
圖4-4標(biāo)題欄中的標(biāo)識(shí)創(chuàng)建一個(gè)較小的位圖—確保背景為灰色,這個(gè)位圖將成為新的標(biāo)題。將該位圖分兩次添加到資源中—一次是作為IDB_ACTIVE_CAPTION_BITMAP,另一次是作為IDB_INACTIVE_CAPTION_BITMAP??梢栽趦蓚€(gè)標(biāo)題中使用同一位圖,這是因?yàn)樯院髮樗鼈兲鎿Q灰色背景。使用位圖類(lèi)CWzdBitmap(面實(shí)例中已經(jīng)介紹過(guò))分兩次裝載該位圖。實(shí)際上,CWzdBitmap所做的只是用位圖的灰色替換裝載位圖時(shí)用戶(hù)自己所指定的顏色。在CWzdBitmapm_bitmapActive;現(xiàn)在分兩次裝載在第一步創(chuàng)建的位圖,告訴CWzdBitmap首先用灰色替換當(dāng)前系統(tǒng)標(biāo)題欄 ::GetSysColor(COLOR_ACTIVECAPTION)m_bitmapInactive.LoadBitmapEx(::GetSysColor(COLOR_INACTIVECAPTION)使用ClassWizard給CMainFrame類(lèi)添加三個(gè)消息處理函數(shù):WM_NCPAINT、WM_ACITIVETA和WM_NCTITE。由于該類(lèi)歸屬于應(yīng)用程序的主窗口,因此它將接收導(dǎo)致主窗口被繪制的消息。如下所示,填充這些消息處理函數(shù)。注意,必須給CMainFrame類(lèi)添加一個(gè)m_bActive變量,以主窗口是否被激活。同時(shí)也要注意用下面所給的方法調(diào)用DrawTitle()輔助函數(shù)來(lái)//WM_NCPAINTmessagehandlervoidCMainFrame::OnNcPaint(){//drawtitle}//WM_ACTIVEmessagevoidCMainFrame::OnActivate(UINTnState,CWnd*pWndOthe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 妊娠期免疫性疾病的個(gè)體化調(diào)節(jié)策略
- 妊娠期急性胰腺炎的病因與治療策略新進(jìn)展
- 安全生產(chǎn)判斷試題及答案
- 大段骨缺損:機(jī)器人3D打印血管化修復(fù)策略
- 大數(shù)據(jù)分析在疼痛預(yù)測(cè)中的模型構(gòu)建
- 科目二考試順序及答案
- 2026年體驗(yàn)農(nóng)業(yè)(開(kāi)發(fā)模式)試題及答案
- 2025年中職第四學(xué)年(制冷系統(tǒng)維修)故障排除階段測(cè)試題及答案
- 2025年高職室內(nèi)設(shè)計(jì)(室內(nèi)裝修設(shè)計(jì))試題及答案
- 2025年高職(航空服務(wù))航空服務(wù)基礎(chǔ)試題及答案
- 人工智能通識(shí)教程 課件 第12章-提示詞工程
- 人工智能+靈活就業(yè)創(chuàng)新模式研究報(bào)告
- 冬季通信工程安全培訓(xùn)課件
- 板換式換熱器施工方案
- 福建省計(jì)算機(jī)專(zhuān)項(xiàng)考評(píng)員試題含答案
- 2025年中遠(yuǎn)海運(yùn)招聘1189人(含社招)筆試參考題庫(kù)附帶答案詳解
- (正式版)DB61∕T 1878-2024 《餐飲業(yè)油煙管道系統(tǒng)清洗規(guī)范》
- 水利水電工程單元工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn) 第4部分:堤防與河道整治工程
- 青鳥(niǎo)纜式線(xiàn)型感溫火災(zāi)探測(cè)器JTW-LD-JBF4310施工指導(dǎo)及調(diào)試注意事項(xiàng)
- 譯林版新高一英語(yǔ)《語(yǔ)法填空》專(zhuān)項(xiàng)練習(xí)題匯編(含答案解析)
- 腎病尿檢知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論