版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1. 如何獲取應(yīng)用程序的實(shí)例句柄?應(yīng)用程序的實(shí)例句柄保存在cwinappim hlnstance中,可以這么調(diào)用 afxgetlnstancdhandle 獲得句柄.example: handle htnstance=afxgettnstancehandle();2. 如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針?主窗口的 指針保存在cwinthread: :m_pmainwnd中,調(diào)用afxgetmainwnd實(shí)現(xiàn)。afxgetmainwndo ->showwi ndow (sw_showaxmtzed) ; /使程序最大化.3. 如何在程序中獲得其他程序的圖標(biāo)? 兩種方法:(1) sdk 函
2、數(shù) shgetfilelnfo 或使用 extracticon 獲得圖標(biāo)資源的 handle,(2) sdk函數(shù)shgetfilelnfo獲得有關(guān)文件的很多信息,如大小圖標(biāo),屬性,類 型等.example(1):在程序窗口左上角顯示notepad圖標(biāo). void csampleview: ondraw(cdc * pdc)if ( : shgetfilelnfo(_t(z,c:pwin95notepad. exe), 0, &stfileinfo, sizcof (stfildnfo), shgfi_ic0n)pdc ->drawicon(10, 10, stfilelnfo.
3、hlcon);example(2):同樣功能,use extractlcon functionvoid csampleview: ondraw(cdc *pdc)htcon hlcon=: extracttcon(afxgettnstancehandle(), _t ("notepad. exe"), 0);if (hlcon &&hicon!=(hicon)-l) pdc->drawicon(10, 10, hlcon);說(shuō)明:獲得notepad, cxc的路徑正規(guī)上來(lái)說(shuō)用gctwindowsdircctory函數(shù)得到, 如果是調(diào)用win95下的畫(huà)筆
4、,應(yīng)該用訪問(wèn)注冊(cè)表的方法獲得其路徑,要作成一個(gè) 比較考究的程序,考慮應(yīng)該全面點(diǎn).4. 如何編程結(jié)束應(yīng)用程序?如何編程控制windows的重新引導(dǎo)? 這是個(gè)很簡(jiǎn)單乂是編程中經(jīng)常要遇到的問(wèn)題.第一問(wèn),向窗口發(fā)送wm_cl0se消息,調(diào)用cwnd: :0nclose成員函數(shù).允許對(duì)用戶 提示是否保存修改過(guò)的數(shù)據(jù).example: afxgetmainwindow()->sendmessage(wm close);還可以創(chuàng)建一個(gè)自定義的函數(shù)terminate windowvoid terminate window(lpcstr pcaption)cwnd *pwnd=cwnd:findwindo
5、w(null, pcaption);if (pwnd)pwnd ->sendmessage(w_close);說(shuō)明:findwindow函數(shù)不是提倡的做法,因?yàn)樗鼰o(wú)法處理標(biāo)題欄自動(dòng)改變,比 如我們要檢測(cè)notepad是不是已運(yùn)行而事先不知道notepad的標(biāo)題欄,這吋 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è),就不
6、再提了。5. 怎樣加載其他的應(yīng)用程序?我記得這好象是岀場(chǎng)頻度很高的問(wèn)題。三個(gè) sdk 函數(shù) wincxcc, shellcxccutc, crcatcproccss 可以使用。winexec最簡(jiǎn)單,兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式后一個(gè)參 數(shù)值得說(shuō)一下,比如泥用sw_showmaxmized方式去加栽一個(gè)無(wú)最大化按鈕的程 序,呵呵就是netcrm, calc等等,就不會(huì)出現(xiàn)正常的窗體,但是己經(jīng)被加到任務(wù)列表 里toshellexecute較winexex靈活一點(diǎn),可以指定工作目錄,下面的example就是 直接打開(kāi)c:tcmpl.txt,而不用加栽與txt文件關(guān)聯(lián)的應(yīng)用程序,很多安
7、裝程序完 成后都會(huì)打開(kāi)一個(gè)窗口,來(lái)顯示readme or faq,就是這么作的啦.shell execute (null, null, _t ( 1. txt"), null, _t (c: temp,z), sw_showmaxmize d);createprocess最復(fù)雜,一共有十個(gè)參數(shù),不過(guò)大部分都可以用null代替,它 可以指定進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等來(lái)看個(gè)很簡(jiǎn)單的example:startupinfo stinfo; /啟動(dòng)窗口的信息process info proc info; /進(jìn)程的信息createprocess(null, _t("not
8、epad. exe),null, null. false,normal_priority_class, null, null, &stinfo, &procinfo);6. 確定應(yīng)用程序的路徑前些天好象有人問(wèn)過(guò)這個(gè)問(wèn)題.use gctmodulcfilenamc獲得應(yīng)用程序的路徑,然后去掉可執(zhí)行文件名。example:tchar exefullpathmax_path ; / max_path 在 api 中定義了吧,好象是 128 getmodulef訂ename(null, exefullpath, max_path)7 獲得各種目錄信息windows 目錄:use z,g
9、etwindowsdirectory “windows 下的 system 目錄:use ,zgetsysteindirectory/ztemp 目錄:use gettemppath "當(dāng)前 目錄:use ,getcurrentdirectory,z請(qǐng)注意前兩個(gè)函數(shù)的第一個(gè)參數(shù)為目錄變量名,后一個(gè)為緩沖區(qū);后兩個(gè)相反.8. 如何自定義消息也有人問(wèn)過(guò)的,其實(shí)不難。(1) 手工定義消息,可以這么寫(xiě) #define wm_my_message(wm_user+100), ms 推 薦的至少是wm_user+100;(2) 寫(xiě)消息處理函數(shù),用wparam, lparam返回lresult.l
10、result cmainframe:onmymessage(wparam wparam, lparam 1param)加入你的處理函數(shù)(3) 在類的afxj1sg處進(jìn)行聲明,也就是常說(shuō)的宏映射9. 如何改變窗口的圖標(biāo)? 向窗口發(fā)送wm_sectton消息。example:hicon hicon=afxgctapp() ->loadicon(idi icon);assert (hlcon);afxgetmainwnd0 ->sendmessage(wm_section, true, (lparam) hlcon);10. 如何改變窗口的缺省風(fēng)格?重栽cwnd: prccrcatcwi
11、ndow并修改createstruct結(jié)構(gòu)來(lái)指定窗口風(fēng)格和其 他創(chuàng)建信息.example: dele te "max" button and set original window's pos it ion and sizebool cmainframe: precreatewindow (createstruct &cs) cs.style &="ws_maxtntzemox;cs. x=cs y=0;cs. cx=getsystemmetrics (sm cxscreen/2);cs.cy=getsystemmetrics(sm cys
12、creen/2);rcturn cmdiframcwnd :prccrcatcwindow(cs);11. 如何將窗口居中顯示?easy, call function cwnd: ccnter windowsexample(1): center window( ); /relative to it,s parent/ relative to screenexample(2) : center window(cwnd: getdesktopwindow(); /relative to application's mainwindowafxgetmainwnd( ) -> cente
13、r window();12. 如何讓窗口和mdi窗口一啟動(dòng)就最大化和最小化? 先說(shuō)窗口。在initstemcc函數(shù)屮設(shè)定m_ncmdshow的 取值. m_ncmdshow=sw_showmaxm!zed ; /最大化 m_ncmdshow=sw_showminmized ; /最小化 m_ncmdshow=sw_shomrmal ; 正常方式mdi 窗口:如果是創(chuàng)建新的應(yīng)用程序,可以用mfc appwizard的advanced按鈕并 在mdi子窗口風(fēng)格組中檢測(cè)最大化或最小化;還可以重載mdi window的 precreatewindow 函數(shù),設(shè)置 wsj1axmize or wsjii
14、nmize;如果從cmdtchi idwnd派生,調(diào)用onlnitialupdate函數(shù)中的 cwnd: :show, window 來(lái)指定 mdi child window 的 風(fēng)格。13. 如何使程序保持極小狀態(tài)?很有意思的問(wèn)題這么辦:在恢復(fù)程序窗體大小吋,windows會(huì)發(fā)送w_query-open消息, 用 classwizard 設(shè)置成員函數(shù) onqueryopen() , add following code: bool cmainframe: onqueryopen()return false;14. 如何限制窗口的大???也就是fixeddialog形式。windows發(fā)送wm_
15、getmaxmininfo消息來(lái)跟蹤 ,響應(yīng)它,在ongetmaxmtntnfo中寫(xiě)代碼:15. 如何使窗口不可見(jiàn)?很簡(jiǎn)單,用sw hide隱藏窗口,可以結(jié)合findwindow, showwindow控制.16. 如何使窗口始終在最前方??jī)煞N途徑.bringwindowtotop (handle);setwindowpos函數(shù),指定窗口的 最頂風(fēng)格,用ws_ex_topmost擴(kuò)展窗口的 風(fēng)格example:void toggletopmost ( cwnd *pwnd)assert_valid(pwnd);pwnd ->setwindowpos(pwnd-> getstyle(
16、 ) &ws_ex_t0pm0st)? &wndnotopmost: &wndtopmost, 0, 0, 0, 0, ssp_nosize,vsp_nomove);17、如何創(chuàng)建一個(gè)字回繞的ceditview重載 cwnd : : precreatewindow 和修改 createstruct 結(jié)構(gòu),關(guān)閉 ceditview 對(duì)彖的 es aut0hscr0ll 和 ws hscr0ll 風(fēng)格位, 由于 ceditview : precreatewindow顯示設(shè)置cs. style,調(diào)用基類函數(shù)后要修改csstyle。bool csampleeditview :
17、: precreatewindow (createstruct&cs)/first call basse class function bool bresutl =ceditview : : precreatewindow (cs);/ now specify the new window style .cs. style &二 (es_autoi1scroll i wsj1scr0ll);return bresult :18、通用控件的顯tjk窗口mfc提供了幾個(gè)cvicw派生的視窗類,封裝了通用控件的功能,但仍然使用工 作框文檔顯示窗口體系結(jié)構(gòu):ceditview圭寸裝了編
18、輯控件,ctreeview保持了樹(shù) 列表控件,clistview封裝了列表顯示窗口控件,cricheditview可以處理多種編 輯控件。19、移動(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 window .setwindowpos (null, 100 , 100 , 0 , 0 , swp_nos1ze i swp_n0a0rder);20、重置
19、窗口的大小調(diào)用 cwnd: : setwindowpos 并指定 swp_n0m0ve 標(biāo)志,也可調(diào)用 cwnd : movewindow但必須指定窗口的位置。/ get the size of the window .crect rewindow ;getwindowrect (rewindow );/make the window twice as wide emd twice as tall setwindowpos (null ,0,0, rewindow . width ( ) *2, rewindow height () * 2,swp nomove i swp nozorder
20、);21、如何創(chuàng)建一個(gè)不規(guī)則形狀的窗口可以使用新的sdk函數(shù)setwindowrgno該函數(shù)將繪畫(huà)和鼠標(biāo)消息限定在窗口的 一個(gè)指定的區(qū)域,實(shí)際上使窗口成為指定的不規(guī)則形狀。使用appwizard創(chuàng)建一個(gè)基于對(duì)的應(yīng)用程序并使用資源編輯器從主對(duì)話資源中 刪除所在的缺省控件、標(biāo)題以及邊界。給對(duì)話類增加一個(gè)crgn數(shù)據(jù)成員,以后要使用該數(shù)據(jù)成員建立窗口區(qū)域。class crounddlg : public cdialog private :crgn m_rgn : / window region 修改ontnitdialog函數(shù)建立一個(gè)橢圓區(qū)域并調(diào)用setwindowrgn將該區(qū)域分配給 窗口:boo
21、l crounddlg : : onlnitdialog ()cdialog : : onlnitdialog ()/get size of dialog crect rcdialog ;getclientrect (rcdialog );/ create region emd assign to window m_rgn createellipticrgn (0,0, rcdialog.width ( ) , rcdialog height ();setwindowrgn (getsafehwnd ( ) , (hrgn) m_ rgn , true );return true ;通過(guò)建立區(qū)
22、域和調(diào)用setwindowrgn,已經(jīng)建立一個(gè)不規(guī)則形狀的窗口,下面 的例子程序是修改onpaint函數(shù)使窗口形狀看起來(lái)象一個(gè)球形體。voik crounddlg : : onpaint ()cpaintdc de (this) ; / device context for painting /draw ellipse with out any borderde. selecstockobject (xullpen);/get the rgb colour components of the sphere colorcolorref color= rgb( 0 , 0 , 255);byte
23、byred =getrvalue (color);byte bygreen 二 getgvalue (color);byte byblue 二 getbvalue (color);/ get the size of the view windowcrect rect ;getclientrect (rect);/ get minimun number of unitsint nunits =min (rect.right , rect. bottom );/calculate he horiaontai and vertical step size float fitstephorz 二(fl
24、oat) rect. right /nunits ; float fitstepvcrt 二(float) rect. bottom /nunits ;int nellipse = nunits/3; / calculate how many to drawint nlndex ; / current ellipse that is being drawcbrush brush ; / bursh used for ellipse fill colorcbrush pbrushold; / previous brush that was selected into de/draw ellips
25、e , gradually moving towards upper-right cornet for (nlndex 二 0 ; ntndes < + nel1 ipse ; ntndes +)/creat solid brushbrush . creatsolidbrush (rgb ( ( (nlndex *byred ) /nellipse ).(ntndex * bygreen ) /nel1 ipse ), ( (ntndex * byblue) /nellipse );/select brush into depbrushold二 de .selectobject (&am
26、p;brhsh);/draw ellipsede . ellipse ( (int) fltstephorz * 2, (int) fltstepvert * nlndex , rect. right -( (int) fltstephorz * nlndex )+ 1,rect . bottom -( (int) fltstepvert * (nlndex *2) ) +1);/deletc the brushbrush.delecteobject ();最后,處理wm_nciiittest消息,使當(dāng)擊打窗口的任何位置時(shí)能移動(dòng)窗口。u1nt crounddlg : : onnchittest
27、 (cpoint point )/let user move window by clickign anywhere on the window .utnt nhittest 二 cdialog : : onnchittest (point); rerurn (nhittest = = iitclient)? iitcaption: nllittcst ;22、如何在代碼中獲取工具條和狀態(tài)條的指針缺省吋,工作框創(chuàng)建狀態(tài)條和工具條吋將它們作為主框窗口的子窗口,狀態(tài) 條有一個(gè)afx_idw_status_bar標(biāo)識(shí)符,工具條有一個(gè)afx_idw_t00lbar標(biāo)識(shí)符, 下例說(shuō)明 了女u何通過(guò)一起調(diào)
28、用 cwnd: : getdescendantwindow 和 afxgetmainwnd 來(lái)獲取這些子窗口的指針:/gct pointer to status bar cstatusbar * pstatusbar =(cstatusbar *) afxgetmainwnd ( ) 一 getdescendantwindow(afx idw stutus bar);/gct pointer to toolbar ctoolbar * ptoolbar =(ctoolbar * ) afxgetmainwnd ( ) 一 getdescendantwindow (afx_idw_toolbar
29、);23、如何使能和禁止工具條的工具提示如果設(shè)置了 cbrs_tooltips風(fēng)格位,工具條將顯示工具提示,要使能或者禁止 工具提示,需要設(shè)置或者清除該風(fēng)格位。下例通過(guò)調(diào)用ccontrolbar : getbarstyle和ccontrolbar : : setbarstyle建立一個(gè)完成此功能的成員函數(shù): void cmainframe : : enabletooltips ( bool bdisplaytips ) assert_vaijd (m_wndtoolbar);dword dwstyle = m _wndtoolbar. getbarstyle ();if (bdisplayti
30、ps)dwstyle i =cbrs_toolttps ;elsedwstyle &二 cbrs_toolt1ps ;m_wndtoolbar. setbarstyle (dwstyle );"24、如何設(shè)置工具條標(biāo)題工具條是一個(gè)窗口,所以可以在調(diào)用cwnd : : setwindowtext來(lái)設(shè)置標(biāo)題,例 子如下:int cmainframe : : oncreate (lpcreatestruct ipcreatestruct )/ set the caption of the toolbar .m wndtoolbar. setwindowtext (_t ,zstan
31、ddard,z);25、如何創(chuàng)建和使用無(wú)模式對(duì)話竈mfc將模式和無(wú)模式對(duì)話封裝在同一個(gè)類中,但是使用無(wú)模式對(duì)話需要兒個(gè)對(duì) 話需要幾個(gè)額處的步驟。首先,使用資源編輯器建立對(duì)話資源并使用classwizard創(chuàng)建一個(gè)cdialog的派生類。模式和無(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 csampl
32、cdialog : : onok ()/ retrieve and validate dialog data if (! updatedata (true)/ the updatedata rountine will set focus to correct item traceo (,z updatedata failed during dialog termination n") return ;/call destroywindow instead of enddialog destroywindow ();void csamplcdialog : : oncemcel ()/
33、call destroywindow instead of enddialog .destroywindow ();其次,需要正確刪除表示對(duì)話的c+對(duì)彖。對(duì)于模式對(duì)來(lái)說(shuō),這很容易,需要 創(chuàng)建函數(shù)返回后即可刪除c+對(duì)象;無(wú)模式對(duì)話不是同步的,創(chuàng)建函數(shù)調(diào)用后立 即返回,因而用戶不知道何時(shí)刪除c+對(duì)象。撤銷窗口時(shí)工作框調(diào)用cwnd : postncdestroy,可以重置該函數(shù)并執(zhí)行清除操作,諸如刪除this指針。void csampledialog : : postncdestroy ()/ declete the c+ object that represents this dialog .de
34、letc this ;最后,要?jiǎng)?chuàng)建無(wú)模式對(duì)話??梢哉{(diào)用cdialog : : domodal創(chuàng)建一個(gè)模式對(duì)放,要?jiǎng)?chuàng)建一個(gè)無(wú)模式對(duì)話則要調(diào)用cdialog: : createo下面的例了說(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 二 pdia
35、log > creste (iddidalog) assert (bresult );26、如何一個(gè)創(chuàng)建三態(tài)下壓按鈕可以使用新的bs pushbutton風(fēng)格位和檢測(cè)框以及按鈕來(lái)創(chuàng)建一個(gè)三態(tài)下壓 按鈕。這很容易,只需將檢測(cè)框和按鈕拖拉到對(duì)話中并指定屬性pushlike即 可o不用任何附加程序就可以成為三態(tài)下壓按鈕。27、如何動(dòng)態(tài)創(chuàng)建控件分配一個(gè)控件對(duì)象的實(shí)例并調(diào)用其create成員函數(shù)。開(kāi)發(fā)者最容易忽略兩件 事:忘記指定ws_visble標(biāo)簽和在棧中分配控件對(duì)象。下例動(dòng)態(tài)地創(chuàng)建一個(gè)下壓 按鈕控件:/in class declaration ( ii file )private :cbut
36、ton* m pbutton ;/tn class implementation (. epp file ).m_pbutton 二new cbutton ; assert_val1d (m_pbutton);m_pbutton >create (_t ("button title ) , ws_child i ws_visible ibs_pushbuttoncrcct ( 0, 0, 100 , 24) , this , i dc j1ybutt0n )28、如何限制編輯框中的準(zhǔn)許字符如果用戶在編輯控件中只允許接收數(shù)字,可以使用一個(gè)標(biāo)準(zhǔn)的編輯控件并指 定新的創(chuàng)建標(biāo)志es_n
37、umbers,它是windows 95新增加的標(biāo)志,該標(biāo)志限制 編輯 控件只按收數(shù)字字符。如果用戶需要復(fù)雜的編輯控件,可以使用microsoft的屏 蔽編輯控件,它是一個(gè)很有用的ole定制控件。如果希望不使用ole定制控件自己處理字符,可以派生一個(gè)cedit類并處理 wm_char消息,然后從編輯控件中過(guò)濾出特定的字符。首先,使用classwizard建 立一個(gè)cedit的派生類,其次,在對(duì)話類中指定一個(gè)成員變量將編輯控件分類 在ontnitdialog 中調(diào)用 cwnd: : subclassdlgttem ./in your dialog class declaration (h file
38、 )private :cmyedit mwndedit ; / instanee of your new edit control ./in you dialog class implcmcntation (. cpp file )bool csampledialog : : onlnitdialog ()/subclass the edit lontrod m wndedit . subclassdlgltem (idc edit,this );使用classwizard處理wm_char消息,計(jì)算nchar參量并決定所執(zhí)行的操作,用 戶可以確定是否修改、傳搖字符。下例說(shuō)明了如何顯示字母字符
39、,如果字符是字 母字符,則調(diào)用cwnd ; onchar,否則不調(diào)用onchar./only display alphabetic dharacters .void cmyedit : : onchar (uint nchar , uint nrcpcnt , uitn nflags )/determine if nchar is an alphabetic character .if (: ischaralpha ( ( tchar) nchar )cedit : : onchar (nchar, nrepcnt , nflags );如果要修改字符,則不能僅僅簡(jiǎn)單地用修改過(guò)的nchar調(diào)用
40、cedit : onchar,然后 cedit: : onchar 調(diào)用 cwnd: : default 獲取原來(lái)的 wparam 和 1 param 的 值,這樣是不行的。要修改一個(gè)字符,需要首先修改nchar,然后用修改過(guò)的nchar 調(diào)用cwnd: : defwindowproco下例說(shuō)明了如何將字符轉(zhuǎn)變?yōu)榇髮?xiě):/make all characters uppercasevoid cmyedit : : onchar (uint nchar , uint nrepcnt , uint nflags )/make sure character is uppercase if (: : is
41、charalpha (tchar) nchar)nchar=: : charupper (nchar );/bypass default onchar processing and directly cal 1/default window procdefwindproc (wm_char, nchar , makelparam (nrepcnt , nflags );29、如何改變控件的顏色有兩種方法。其一,可以在父類屮指定控件的顏色,或者利用mfc4.0新的消 息反射在控件類中指定顏色。當(dāng)控件需要重新著色時(shí),工作框調(diào)用父窗口(通常是對(duì)話框)的cwnd:oncrtlcolor,可以在父窗口類
42、中重置該函數(shù)并指定控件的新的繪畫(huà)屬性。例如,下述代碼將對(duì)話中的所有編輯控件文本顏色改為紅色:hbrusi1 caboutdig : : onctlcolor (cdc * pdcm , cwnd * pwnd , uint nctlcolor)hbrush hbr 二 cdialog : : onctlcolor (pdc, pwnd , nctlcolor );/draw red text for all edit controls if (nctlcolor= = ctlcolor_edit ) pdc > settextcolor (rgb (255 ,0,0,) rcturn h
43、br ;然而,由于每個(gè)父窗口必須處理通知消息并指定每個(gè)控件的繪畫(huà)屬性,所以,這種方法不是完全的面向?qū)ο蟮姆椒???丶幚碓撓⒉⒅付ɡL畫(huà)屬性更合情 合理。消息反射允許用戶這樣做。通知消息首先發(fā)送給父窗口,如果父窗口沒(méi)有處 理則發(fā)送給控件。創(chuàng)建一個(gè)定制彩色列表框控件必須遵循下述步驟。首先,使用classwizard創(chuàng)建一個(gè)cijstbox的派生類并為該類添加下述數(shù)據(jù) 成員。class cmylistbox ; publilc clistbox private;colorref m_clrfor ; / foreground color colorref m_clrback ; /backgroun
44、d color cbrush mbrush ; /background brush其次,在類的構(gòu)造函數(shù)中,初始化數(shù)據(jù)中。cmylistbox : : cmylistbox ()/initializc data members m_clrfore 二rgb (255 , 255 , 0) ; / yellow text m_clrback=rgb (0,0, 255) ; / blue background m brush . createsolidbrush (m clrback );最后,使用classwizard處理反射的wm_ctlc0l0r(=wm_ctlc0l0r)消息并指定新 的繪
45、畫(huà)屈性。hbrush cmylistbox : : ctlcolor (cdc* pdc, uint nctlcolor )pdc>settextcolor (mclrfore);pdc一>sctbkcolor (m_clrback);return (hbrush) m brush. getsafehandle ()現(xiàn)在,控件可以自己決定如何繪畫(huà),與父窗口無(wú)關(guān)。30、當(dāng)向列表框中添加多個(gè)項(xiàng)時(shí)如何防止閃爍調(diào)用cwnd: setredraw清除重畫(huà)標(biāo)志可以禁止cli stbox (或者窗口)重畫(huà)。 當(dāng)向列表框添加幾個(gè)項(xiàng)時(shí),用戶可以清除重畫(huà)標(biāo)志,然后添加項(xiàng),最后恢復(fù)重畫(huà) 標(biāo)志。為確保重畫(huà)
46、列表框的新項(xiàng),調(diào)用setredraw (true)之后調(diào)用cwnd:invalidateo/disable redrawing.plistbox->sctredraw (false);/fill in the list box gere/enable drwing and make sure list box is redrawn.plistbox-setredraw (true);plistbox->invdlideitc ();31、如何向編輯控件中添加文本由于沒(méi)有cedi t: : appendtext函數(shù),用戶只好自己做此項(xiàng)工作。調(diào)用cedit: sctscl移動(dòng)到編輯控件
47、末尾,然后調(diào)用cedit: rcplacesel添加文本。下例是 appendtext的一種實(shí)現(xiàn)方法:void cmyedit: appendtext (lpcstr ptext)int nlcn二getwindowtcxtlcngth ();setfocus ();setsel (nlen, nlen);replacesel (ptext);32、如何訪問(wèn)預(yù)定義的gdi對(duì)象可以通過(guò)調(diào)用cdc: slectstockobject使用windows的幾個(gè)預(yù)定義的對(duì)象,諸 如刷子、筆以及字體。下例使用了 windows預(yù)定義的筆和刷子gdi對(duì)象在視窗中 畫(huà)一個(gè)橢圓。/draw ellipse us
48、ing stock black pen and gray brushvoid csampleview: ondraw (cdc* pdc)/determine size of view.crect review;getclientrect (review);/use stock black pen and stock gray brush to draw ellipse pdc->selectstockobject (blackpen);pdc->selectstockobject (gray_brush) /draw the el 1 ipse.pdc->ellipsc (
49、review);也可以調(diào)用新的sdk函數(shù)getsyscolorbrush獲取一個(gè)系統(tǒng)顏色刷子,下例用背 景色在視窗中畫(huà)一個(gè)橢圓:void csampleview: ondraw (cdc* pdc)/determine size of view.crect review;getclientrect (review);/use background color for tooltips brush cbrush * porgbrush=pdc->se1ectobject (cbrush:fromhandle (:getsyscolorbrush (colorinfobk);/draw th
50、e el 1 ipse. pdc->ellipsc (review);/restore original brush. pdc>selectobject (porgbrush);33、如何獲取gdi對(duì)象的屬性信息可以調(diào)用gdiobject: getobjecto這個(gè)函數(shù)將指定圖表設(shè)備的消息寫(xiě)入到緩 沖區(qū)。下例創(chuàng)建了幾個(gè)有用的輔助函數(shù)。/dctcminc if font is boldbool isfontbold (const cfont&font)logfont stfont;font. getobject (sizeof (logfont), &stfont);
51、return (stfont. lfbold)? true: false;/return the size of a bitmap.csize getbi tmapsize (const cbi tmap&bitnmp)bitmap stbitmap; bitmap. getobject (sizeof (bitmap), festbitmap);return csize (stbitmap. bmwidth, stbitmap. bmheight);/create a pen with the same color as a brush.bool createpenfrombrush
52、 (cpen&pen, cost cbrush&brush)logbrusii stbrush;brush.getobject (sizeof (logbrush), &stbrush); return pen. createpen (pssolid, 0, stbrush. ibcolor); "34、如何實(shí)現(xiàn)一個(gè)橡皮區(qū)矩形crecttracker是一個(gè)很有用的類,可以通過(guò)調(diào)用crecttracker:trackrubberband響應(yīng)wm_lbutt0nd0wn消息來(lái)創(chuàng)建一個(gè)橡皮區(qū)矩形。下例表明 使用crecttracker移動(dòng)和重置視窗屮的藍(lán)色橢圓的大小
53、是很容易的事情。首先,在文件檔中聲明一個(gè)crecttracker數(shù)據(jù)成員: class csampleview : public cview public :crecttracker mtracker; ;其次,在文檔類的構(gòu)造函數(shù)中初始化crecttracker對(duì)象: csampledoc: csampledoc ()/initializc tracker position, size emd stylc. m_tracker. m_rect. setrect (0, 0, 10, 10);m tracker. m_nstyle=crecttracker: resizeinsidecrectt
54、racker: dottedline;然后,在ondraw函數(shù)屮畫(huà)橢圓和蹤跡矩形:void csampleview: ondraw (cdc* pdc)csampledoc* pdoc二getdocument ();assert_vaijd (pdoc);/select blue brush into device contextcbrush brush (rgb (0, 0, 255);cbrush* p01dbrush=pdc->selectobject (febrush);/draw ellipse in tracking rectanglecrect rcellipse;pdoc
55、->m_tracker. gettruerect (rcellipse); pdc->ellipse (rcellipse);/draw tracking rectangle. pdoc->m_tracker. draw (pdc);/select blue brush out of device context.pdc>selectobject (poldbrush);最后,使用classwizard處理wm.lbuttondown消息,并增加下述代碼。該段代 碼根據(jù)鼠標(biāo)擊鍵情況可以拖放、參動(dòng)或者重置橢圓的大小。void csampleview:onlbuttondo
56、wn (uimt nflags, cpoint point)/get pointer to document.csampledoc* pdoc=getdocument ();assert_valid (pdoc);/tf clicked on el 1 ipse, drag or resize it. otherwise create a /rubbcr-band rectanglc nd create a new ellipsebool bresult=pdoc->m_tracker. hittest (point)!=crecttracker:hitnothing;/tracker rectangle changed so update views.if (brcsult)pdoc->m_tracker. track (this,point, true); pdoc>setmodi f i edf1ag ();pdoc_>updateal1 vi ews (null);elsepdoc->m-tracker. trackrubberband (this,point,true);cview: onlbuttondown (nflags,point);35、如何更新翻轉(zhuǎn)背景顏色的文本調(diào)用cdc: setb
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度水陸聯(lián)運(yùn)貨物保險(xiǎn)及運(yùn)輸合同
- 二零二五年度新能源儲(chǔ)能技術(shù)聘用合同8篇
- 二零二四年度信息化設(shè)備融資租賃管理合同3篇
- 課件:正確認(rèn)識(shí)高職院校內(nèi)部質(zhì)量保證體系診斷與改進(jìn)
- 二零二五年度牧草生物質(zhì)能項(xiàng)目合作協(xié)議4篇
- 2025版農(nóng)家樂(lè)民宿租賃管理服務(wù)合同2篇
- 二零二五版年薪制勞動(dòng)合同:房地產(chǎn)企業(yè)銷售精英激勵(lì)方案4篇
- 第三單元 資產(chǎn)階級(jí)民主革命與中華民國(guó)的建立(解析版)- 2023-2024學(xué)年八年級(jí)歷史上學(xué)期期中考點(diǎn)大串講(部編版)
- 2025年度個(gè)人家政服務(wù)分期支付合同范本2篇
- 二零二五年度地鐵車站安全門(mén)系統(tǒng)采購(gòu)合同
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 人教版初中語(yǔ)文2022-2024年三年中考真題匯編-學(xué)生版-專題08 古詩(shī)詞名篇名句默寫(xiě)
- 2024-2025學(xué)年人教版(2024)七年級(jí)(上)數(shù)學(xué)寒假作業(yè)(十二)
- 山西粵電能源有限公司招聘筆試沖刺題2025
- ESG表現(xiàn)對(duì)企業(yè)財(cái)務(wù)績(jī)效的影響研究
- 醫(yī)療行業(yè)軟件系統(tǒng)應(yīng)急預(yù)案
- 使用錯(cuò)誤評(píng)估報(bào)告(可用性工程)模版
- 《精密板料矯平機(jī) 第2部分:技術(shù)規(guī)范》
- 黑枸杞生物原液應(yīng)用及產(chǎn)業(yè)化項(xiàng)目可行性研究報(bào)告
- 2024年黑龍江省政工師理論知識(shí)考試參考題庫(kù)(含答案)
- 四年級(jí)上冊(cè)脫式計(jì)算300題及答案
評(píng)論
0/150
提交評(píng)論