国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
為對(duì)話框程序添加工具條和狀態(tài)欄
摘要:本文介紹了在對(duì)話框程序基礎(chǔ)上通過程序控制來動(dòng)態(tài)添加工具條和狀態(tài)條的實(shí)現(xiàn)過程和方法。
   一、 引言
   對(duì)于不需要文檔/視圖結(jié)構(gòu)支持的程序一般都采用對(duì)話框做為程序的基礎(chǔ)框架。雖然在對(duì)話框程序上可以通過修改其屬性來添加系統(tǒng)菜單,但對(duì)比SDI和MDI程序的工具條和狀態(tài)欄未免使界面顯得簡(jiǎn)單、單調(diào)。雖然在Visual Basic 中提供有獨(dú)立的工具條和狀態(tài)欄標(biāo)準(zhǔn)控件可以直接在對(duì)話框上使用,但Visual C++ 6.0所提供的26種基本W(wǎng)indows標(biāo)準(zhǔn)控件卻沒有將它們包含其中。因此要在對(duì)話框程序中實(shí)現(xiàn)工具條和狀態(tài)欄只能通過編程來動(dòng)態(tài)實(shí)現(xiàn)。
   二、 工具條的實(shí)現(xiàn)過程
   MFC對(duì)于工具條和狀態(tài)欄分別提供了CToolBar和CStatusBar兩個(gè)基本類庫,但由于在實(shí)現(xiàn)時(shí)MFC對(duì)其做了過多的封裝,以至無法了解內(nèi)部的一些核心技術(shù)。因此本文在實(shí)現(xiàn)過程中放棄了相對(duì)比較方便的CToolBar和CStatusBar類的使用,而是通過SDK(Software Developers Kit,軟件開發(fā)工具箱)式的WinAPI應(yīng)用程序接口來實(shí)現(xiàn)的。在API函數(shù)中經(jīng)常需要用到對(duì)話框的窗口句柄和當(dāng)前的實(shí)例句柄,在SDK程序設(shè)計(jì)中以上兩個(gè)句柄可以直接從入口函數(shù)WinMain()中引出,而在MFC下也對(duì)其做了封裝,不能直接獲取。但MFC也為其留有接口:CWnd窗口類提供的GetSafeHwnd()可以返回對(duì)話框的窗口句柄;函數(shù)AfxGetInstanceHandle()則可以獲取當(dāng)前應(yīng)用程序的實(shí)例句柄。由于對(duì)話框和狀態(tài)欄屬于程序界面的一部分,需要程序啟動(dòng)時(shí)就顯示出來,因此獲取句柄的代碼和后面創(chuàng)建顯示工具條、狀態(tài)欄的全部代碼都應(yīng)當(dāng)放在對(duì)話框初始化消息WM_INITDIALOG的響應(yīng)函數(shù)OnInitDialog()中進(jìn)行:
HWND hDlg=GetSafeHwnd();
HINSTANCE hInstance=AfxGetInstanceHandle();
   對(duì)于待添加的工具條按鈕可以根據(jù)情況細(xì)分為兩種:
   一種是Windows標(biāo)準(zhǔn)的一些工具條按鈕比如打開文件、打印預(yù)覽、在線幫助等等,這類工具條按鈕可以直接使用預(yù)定義好的按鈕圖標(biāo)的ID號(hào),在VC自帶的CommCtrl.h頭文件中有詳細(xì)定義;
   另一種就是用戶自己添加的工具欄按鈕,只能由用戶在資源視圖中為其指定相應(yīng)的圖標(biāo)。不論是那種工具條按鈕的創(chuàng)建都是通過對(duì)TBBUTTON結(jié)構(gòu)的設(shè)置來決定每一個(gè)工具條按鈕的狀態(tài),對(duì)于第一個(gè)填充好的工具條按鈕可以用CreateToolbarEx()來直接將其加入到工具條上,并返回指向工具條的窗口句柄,而對(duì)于以后工具條按鈕的添加則只能通過向工具條發(fā)送TB_ADDBUTTONS消息來實(shí)現(xiàn):
……
//填充工具條按鈕結(jié)構(gòu):
TBBUTTON ptoolbar[30]={{STD_HELP, //指定Windows的標(biāo)準(zhǔn)幫助圖標(biāo)
MU_ONE, //工具條按鈕的ID
TBSTATE_ENABLED, //可用狀態(tài)
TBSTYLE_BUTTON, //指定創(chuàng)建一個(gè)可以下按的按鈕
0, //保留,由應(yīng)用程序定義該參數(shù)意義
0}, //按鈕字串索引
//創(chuàng)建一個(gè)分割按鈕用的豎線
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0}};
//在對(duì)話框上動(dòng)態(tài)創(chuàng)建工具條,并添加工具條按鈕:
HWND hToolsWindow=::CreateToolbarEx(hDlg, //指定對(duì)話框?yàn)楦复翱冢瑢⒐ぞ邨l創(chuàng)建在對(duì)話框上
WS_CHILD|WS_VISIBLE|TBSTYLE_WRAPABLE|TBSTYLE_TOOLTIPS|
TBSTYLE_FLAT|CCS_ADJUSTABLE,//指定工具條的創(chuàng)建風(fēng)格
IDB_TOOLBAR,//預(yù)定義的工具條資源ID
30,HINST_COMMCTRL, //包含圖片資源的可執(zhí)行文件的實(shí)例句柄
IDB_STD_SMALL_COLOR,//圖片的資源ID
ptoolbar, //待添加的按鈕
2, //加入到工具條的按鈕的個(gè)數(shù)
0,0,0,0,sizeof(TBBUTTON));
……
//從IDR_TOOLBAR1資源中裝載按鈕圖標(biāo)到對(duì)話框的工具條上
TBADDBITMAP tab;
tab.hInst=hInstance;
tab.nID=IDR_TOOLBAR1;
iBmp=::SendMessage(hToolsWindow,TB_ADDBITMAP,(WPARAM)3,(LPARAM)&tab);
   向工具條添加工具條按鈕的關(guān)鍵在于對(duì)TBBUTTON數(shù)據(jù)結(jié)構(gòu)的填充,該數(shù)據(jù)結(jié)構(gòu)也是在CommCtrl.h頭文件中定義的,原形為:
typedef struct _TBBUTTON {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
DWORD dwData;
int iString;
} TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON;

   該結(jié)構(gòu)的數(shù)據(jù)成員包含了處在工具條里的按鈕的相關(guān)信息:成員iBitmap是從0開始記數(shù)的按鈕圖象的索引;idCommand標(biāo)識(shí)了匹配的按鈕,當(dāng)按鈕被按下產(chǎn)生WM_COMMAND消息的時(shí)候會(huì)用到該標(biāo)識(shí);fsState指定了按鈕的狀態(tài)標(biāo)志,可以是以下8種標(biāo)志的邏輯組合TBSTATE_CHECKED、TBSTATE_ELLIPSES、TBSTATE_ENABLED、TBSTATE_HIDDEN、TBSTATE_INDETERMINATE、TBSTATE_MARKED、TBSTATE_PRESSED、TBSTATE_WRAP。至于以上各標(biāo)志的具體含義在MSDN的在線幫助中有詳細(xì)說明;fsStyle成員指定了按鈕的風(fēng)格;dwData是應(yīng)用程序定義的值,通常為0;iString為從0開始技術(shù)的按鈕字串的索引。下面這段代碼用于向工具條添加自定義的工具條按鈕:
TBBUTTON tb;
tb.iBitmap=iBmp+0;
tb.idCommand=MU_TWO;
tb.fsState=TBSTATE_ENABLED;
tb.fsStyle=TBSTYLE_BUTTON;
tb.dwData=0;
tb.iString=0;
   完成對(duì)TBBUTTON結(jié)構(gòu)的設(shè)置后可以通過窗口句柄hToolsWindow向工具條發(fā)送TB_ADDBUTTONS消息來添加按鈕到工具條,如想添加按鈕之間的分割條,只需將TBBUTTON結(jié)構(gòu)的fsStyle成員變量取值為TBSTYLE_SEP即可:
::SendMessage(hToolsWindow,TB_ADDBUTTONS,(WPARAM)1,(LPARAM)&tb);
   三、 狀態(tài)欄的實(shí)現(xiàn)
   狀態(tài)欄的實(shí)現(xiàn)與工具條的實(shí)現(xiàn)相比非常簡(jiǎn)單,只需在CreateStatusWindow()函數(shù)中對(duì)其參數(shù)進(jìn)行設(shè)置即可實(shí)現(xiàn):
HWND hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER,
TEXT("狀態(tài)欄"),//顯示在狀態(tài)欄上的信息
hDlg, //父窗口句柄
IDS_STATUS); //預(yù)定義的資源ID
   此時(shí)創(chuàng)建的狀態(tài)欄只是一個(gè)位于對(duì)話框底部的長(zhǎng)條,如需要將其分割為幾部分可以在數(shù)組中設(shè)定好分割點(diǎn)的X坐標(biāo),然后通過向狀態(tài)欄發(fā)送SB_SETPARTS消息即可,該消息的wParam參數(shù)指定了要將狀態(tài)欄分割為幾部分,lParam參數(shù)指定了各分割點(diǎn)的坐標(biāo)值:
int pint[4]={110,250,300,-1};//110,250,300設(shè)定間隔
::SendMessage(hStatusWindow,SB_SETPARTS,4,(LPARAM)pint);
   如需向分割后的狀態(tài)欄內(nèi)填寫信息,可以通過hStatusWindow向狀態(tài)條發(fā)送消息SB_SETTEXT來完成,該消息的兩個(gè)參數(shù)分別用來標(biāo)識(shí)在第幾個(gè)窗格顯示和待顯示的信息內(nèi)容:
::SendMessage(hStatusWindow,SB_SETTEXT,1,(LPARAM)TEXT("信息一"));
……
   小結(jié):本文以SDK的方式實(shí)現(xiàn)了在MFC對(duì)話框程序下工具條和狀態(tài)欄的動(dòng)態(tài)添加,使普通的對(duì)話框程序也可以象SDI和MDI程序一樣擁有自定義風(fēng)格的工具條和狀態(tài)欄。全部實(shí)現(xiàn)過程的重點(diǎn)是在對(duì)相關(guān)結(jié)構(gòu)的設(shè)置和消息的發(fā)送以及控件的動(dòng)態(tài)創(chuàng)建。至于本文所涉及到的結(jié)構(gòu)和函數(shù)的詳細(xì)內(nèi)容請(qǐng)參閱Microsoft 的MSDN Library 6.0。本文所述程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
工具欄 Without MFC(非MFC)
VC MFC工具欄(CToolBar)控件
MFC給按鈕添加圖片
《電腦使用技巧》第三篇
Dll中的Dialog中有個(gè)按鈕,彈出對(duì)話框,在析構(gòu)中KillTimer, 窗口句柄不存在了
CAD從入門到繪圖全過程無條件分享!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服