積累的VC程式設計小技巧之屬性頁

2021-04-25 19:07:28 字數 2758 閱讀 9153

建立對話方塊的類,該類要從

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...