建立對話方塊的類,該類要從
cpropertypage繼承;然後在要新增該對話方塊為屬性頁的類(標頭檔案)裡建立cpropertysheet類的乙個物件m_tabsheet和新建立的對話方塊類的物件m_skatch;最後,在.cpp檔案裡的oninitdialog()之類的函式裡實現如下**:
m_tabsheet.create(this, ws_child | ws_visible, 0);
//使選項卡的按鈕在下面
if(m_tabsheet.m_hwnd)
m_tabsheet.showwindow(sw_maximize);//顯示選項卡
//加入標籤,標籤名由各個子對話方塊的標題欄決定
m_tabsheet.addpage(&m_skatch);
//用create來建立乙個屬性頁
m_tabsheet.create(this, ws_child | ws_visible, ws_ex_controlparent);
rect rect;
m_tabsheet.getwindowrect(&rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
//調整屬性頁的大小和位置
m_tabsheet.setwindowpos(null, 225, 225, width-82, height,swp_noactivate);
屬性頁的新增完成。如果要新增多個屬性頁,則只需要增加多個物件,如下:
m_tabsheet.addpage(&m_skatch1);
m_tabsheet.addpage(&m_skatch2);
. . . . . .
void cprosheet::setpagetitle(int npage, int nimage, cstring strtitle)
cpropertypageimpl
有乙個訊息對映處理
wm_notify
。如果通知**是
psn_*
的值,onnotify()
就會呼叫相應的通知處理函式。這使用了編譯階段虛函式機制,從而使得派生類可以很容易的過載這些處理函式。 由於
wtl 3和wtl 7設計的改變,從而存在兩套不同的通知處理機制。在wtl 3中通知處理函式返回的值與psn_*訊息的返回值不同,例如,wtl 3是這樣處理psn_wizfinish的:
case psn_wizfinish:
lresult = !pt->onwizardfinish();
break;
onwizardfinish()期望返回true結束嚮導,false阻止關閉嚮導。這個方法很簡陋,但是ie5的通用控制項對psn_wizfinish處理的返回值新增了新解釋,他返回需要獲得焦點的視窗的控制代碼。wtl 3的程式將不能使用這個特性,因為它對所有非0的返回值都做相同的處理。
在wtl 7中,onnotify() 沒有改變 psn_* 訊息的返回值,處理函式返回任何文件中規定的合法數值和正確的行為。當然,為了向前相容,wtl 3 仍然使用當前預設的工作方式,要使用wtl 7的訊息處理方式,你必須在中including atldlgs.h一行之前新增一行定義:
#define _wtl_new_page_notify_handlers
編寫新的**沒有理由不使用
wtl 7的訊息處理函式,所以這裡就不介紹wtl 3的訊息處理方式。
cpropertypageimpl 為所有訊息提供了預設的通知訊息處理函式,你可以過載與你的程式有關的訊息處理函式完成特殊的操作。預設的訊息處理函式和相應的行為如下:
int onsetactive() - 允許頁面成為啟用狀態
bool onkillactive() - 允許頁面成為非啟用狀態
void onreset() - 無相應的動作
bool onquerycancel() - 允許取消操作
int onwizardback() - 返回到前乙個頁面
int onwizardnext() - 進行到下乙個頁面
int_ptr onwizardfinish() - 允許嚮導結束
void onhelp() - 無相應的動作
bool ongetobject(lpnmobjectnotify lpobjectnotify) - 無相應的動作
int ontranslateaccelerator(lpmsg lpmsg) - 返回 psnret_noerror 表示訊息沒有被處理
hwnd onqueryinitialfocus(hwnd hwndfocus) -
返回null
表示將按
tab order
順序的第乙個控制項設為焦點狀態 我用
cpropertysheet建立屬性頁,用的cpropertypage物件只有乙個,也就是每個屬性頁的內容一樣.現在的問題是:這樣每個屬性頁的標題都是一樣的,是對話方塊的標題!怎樣動態的改變這個標題,使每個屬性頁的標籤的名稱都不同??
ctabctrl * pctrl = psheet->gettabcontrol();
tcitem tc;
tc.mask = tcif_text;
tc.psztext = "新標題";
pctrl->setitem(0,&tc);//0即是你要改的tab的索引
//去掉help
m_psh.dwflags |= psh_hashelp ;
m_psh.dwflags &= ~psh_hashelp ;
//除掉應用按鈕
積累的VC程式設計小技巧之列印相關
為afx idd preview 這個id建立乙個dialogbar。則系統就會用新建立的dialogbar代替系統預設的那個 1.要列印哪個視就 cmainframe afxgetmainwnd m wndsplitter.setactivepane 要列印的那個視對應的pane 2.有乙個單文件...
VC程式設計小技巧
用vc新建dialog.新增rich edit 後編譯可以通過,執行後自動退出,原因即是沒有初始化的後果。解決方法 解釋 wasatarup 是應用程式呼叫的windows sockets dll的第乙個函式,在呼叫任何winsock api之前,必須呼叫wsastartup 進行初始化,最後呼叫w...
VC程式設計小技巧之樹操作
問題提出 請問treeview控制項和treectrl控制項的用法有何不同呢?向怎麼imagelist控制項中加圖象呀?解決方法 1 hicon hicon 8 m imagelist.create 16,16,0,8,8 for int n 0 n 8 n m imagelist.add hico...