積累的VC編程小技巧之屬性頁
1.屬性頁的添加:
創建對話框的類,該類要從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);
. . . . . .
2.更改屬性頁標題
void CProSheet::SetPageTitle(int nPage, int nImage, CString strTitle)
{
TC_ITEM item;
//item.mask = TCIF_TEXT|TCIF_IMAGE; //設置圖標+文字
item.mask = TCIF_IMAGE; //只設置圖標
item.iImage = nImage;
// item.pszText = strTitle.GetBuffer(0); //設置文字
GetTabControl ()->SetItem (nPage, &item);
//要設置文字時就將上面2行有注釋符的代碼前的注釋符去掉
}
3.屬性頁處理通知消息
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() - 允許頁面成為非激活狀態
int OnApply() - 返回 PSNRET_NOERROR 表示應用操作成功完成
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順序的第一個控件設為焦點狀態
4.屬性頁標題改名
我用CPropertySheet創建屬性頁,用的CPropertyPage對象只有一個,也就是每個屬性頁的內容一樣.現在的問題是:這樣每個屬性頁的標題都是一樣的,是對話框的標題!怎樣動態的改變這個標題,使每個屬性頁的標簽的名稱都不同??
CTabCtrl * pCtrl = pSheet->GetTabControl();
TCITEM tc;
tc.mask = TCIF_TEXT;
tc.pszText = "新標題";
pCtrl->SetItem(0,&tc);//0即是你要改的TAb的索引
5.怎樣去掉屬性頁的Apply與Help按鈕?
//去掉Help
m_psh.dwFlags |= PSH_HASHELP ;
m_psh.dwFlags &= ~PSH_HASHELP ;
//除掉應用按鈕 m_psh.dwFlags|=PSH_NOAPPLYNOW;
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成