为了最大限度的发挥属性页的效用,首先让我们先从 CPropertySheet 继承一个新类,取名为 CMyPropSheet.
接着便可以进行下面的各种操作:
一、隐藏属性页默认按钮
隐藏掉Apply应用按钮:
1.
propsheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
或隐藏掉Cancel取消按钮:
1.
CWnd *pWnd = GetDlgItem( IDCANCEL );
2.
pWnd->ShowWindow( FALSE );
二、移动属性页按钮
首先,要获取按钮的句柄,然后就可以象对待窗体一样处理它们了. 下面代码先隐藏掉Apply和Help铵钮,再把OK和Cancel按移动到右侧。
01.
BOOL
CMyPropSheet::OnInitDialog ()
02.
{
03.
BOOL
bResult = CPropertySheet::OnInitDialog();
04.
05.
int
ids [] = {IDOK, IDCANCEL};
//, ID_APPLY_NOW, IDHELP };
06.
07.
// Hide Apply and Help buttons
08.
CWnd *pWnd = GetDlgItem (ID_APPLY_NOW);
09.
pWnd->ShowWindow (FALSE);
10.
pWnd = GetDlgItem (IDHELP);
11.
pWnd->ShowWindow (FALSE);
12.
13.
CRect rectBtn;
14.
int
nSpacing = 6;
// space between two buttons...
15.
16.
for
(
int
i =0; i <
sizeof
(ids)/
sizeof
(
int
); i++)
17.
{
18.
GetDlgItem (ids [i])->GetWindowRect (rectBtn);
19.
20.
ScreenToClient (&rectBtn);
21.
int
btnWidth = rectBtn.Width();
22.
rectBtn.left = rectBtn.left + (btnWidth + nSpacing)* 2;
23.
rectBtn.right = rectBtn.right + (btnWidth + nSpacing)* 2;
24.
25.
GetDlgItem (ids [i])->MoveWindow(rectBtn);
26.
}
27.
28.
29.
return
bResult;
30.
}
下面代码移动所有按钮到右侧,并且重新置属性页为合适的大小.
01.
BOOL
CMyPropSheet::OnInitDialog ()
02.
{
03.
BOOL
bResult = CPropertySheet::OnInitDialog();
04.
05.
06.
int
ids[] = { IDOK, IDCANCEL, ID_APPLY_NOW };
07.
08.
CRect rectWnd;
09.
CRect rectBtn;
10.
11.
GetWindowRect (rectWnd);
12.
GetDlgItem (IDOK)->GetWindowRect (rectBtn);
13.
14.
int
btnWidth = rectBtn.Width();
15.
int
btnHeight = rectBtn.Height();
16.
int
btnOffset = rectWnd.bottom - rectBtn.bottom;
17.
int
btnLeft = rectWnd.right - rectWnd.left;
18.
19.
rectWnd.bottom = rectBtn.top;
20.
rectWnd.right = rectWnd.right + btnWidth + btnOffset;
21.
MoveWindow(rectWnd);
22.
23.
rectBtn.left = btnLeft;
24.
rectBtn.right = btnLeft + btnWidth;
25.
26.
for
(
int
i = 0; i <
sizeof
(ids) /
sizeof
(
int
); i++)
27.
{
28.
rectBtn.top = (i + 1) * btnOffset + btnHeight * i;
29.
rectBtn.bottom = rectBtn.top + btnHeight;
30.
GetDlgItem (ids [i])->MoveWindow (rectBtn);
31.
}
32.
33.
return
bResult;
34.
}
三、改变属性页上的标签文字
首先修改TC_ITEM结构,然后用 SetItem 来修改标签文字,如下代码:
1.
TC_ITEM item;
2.
item.mask = TCIF_TEXT;
3.
item.pszText =
"New Label"
;
4.
5.
//Change the label of the first tab (0 is the index of the first tab)...
6.
GetTabControl ()->SetItem (0, &item);
四、改变属性页标签文字的字体属性
代码如下
1.
m_NewFont.CreateFont (14, 0, 0, 0, 800, TRUE, 0, 0, 1, 0, 0, 0, 0, _T(
"Arial"
) );
2.
GetTabControl()->SetFont (&m_NewFont);
五、在属性页标签上显示位图
可以用 CImageList 建立图像. 用 SetItem 来设置,如下代码所示:
01.
BOOL
CMyPropSheet::OnInitDialog ()
02.
{
03.
BOOL
bResult = CPropertySheet::OnInitDialog();
04.
05.
m_imageList.Create (IDB_MYIMAGES, 13, 1, RGB(255,255,255));
06.
CTabCtrl *pTabCtrl = GetTabControl ();
07.
pTabCtrl->SetImageList (&m_imageList);
08.
09.
TC_ITEM item;
10.
item.mask = TCIF_IMAGE;
11.
for
(
int
i = 0; i < NUMBER_OF_TABS; i++)
12.
{
13.
item.iImage = i;
14.
pTabCtrl->SetItem (i, &item );
15.
}
16.
17.
return
bResult;
18.
}
六、在属性页左下角显示位图
如下代码所示:
01.
void
CMyPropSheet::OnPaint ()
02.
{
03.
CPaintDC dc(
this
);
// device context for painting
04.
05.
int
nOffset = 6;
06.
// load IDB_BITMAP1 from our resources
07.
CBitmap bmp;
08.
if
(bmp.LoadBitmap (IDB_BITMAP1))
09.
{
10.
// Get the size of the bitmap
11.
BITMAP bmpInfo;
12.
bmp.GetBitmap (&bmpInfo);
13.
14.
// Create an in-memory DC compatible with the
15.
// display DC we''re using to paint
16.
CDC dcMemory;
17.
dcMemory.CreateCompatibleDC (&dc);
18.
19.
// Select the bitmap into the in-memory DC
20.
CBitmap* pOldBitmap = dcMemory.SelectObject (&bmp);
21.
22.
// Find a bottom-left point for the bitmap in the client area
23.
CRect rect;
24.
GetClientRect (&rect);
25.
int
nX = rect.left + nOffset;
26.
int
nY = rect.top + (rect.Height () - bmpInfo.bmHeight) - nOffset;
27.
28.
// Copy the bits from the in-memory DC into the on-
29.
// screen DC to actually do the painting. Use the centerpoint
30.
// we computed for the target offset.
31.
dc.BitBlt (nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
32.
0, 0, SRCCOPY);
33.
34.
dcMemory.SelectObject (pOldBitmap);
35.
}
36.
37.
// Do not call CPropertySheet::OnPaint() for painting messages
38.
}
七、在属性页右下角显示3D文字Logo
代码如下:
01.
void
CMyPropSheet::OnPaint ()
02.
{
03.
/
04.
//在TAB按钮旁边显示3D文字提示,jingzhou xu
05.
Cstring m_LogoName = “属性页”;
06.
// if(m_LogoName == "")
07.
// return;
08.
09.
GetWindowRect(rect);
10.
ScreenToClient(rect);
11.
12.
LOGFONT logFont;
13.
ZeroMemory((
void
*)&logFont,
sizeof
(logFont));
14.
strcpy
(logFont.lfFaceName,
"宋体"
);
15.
logFont.lfHeight = -12;
16.
logFont.lfWeight = 400;
17.
logFont.lfCharSet = GB2312_CHARSET;
18.
logFont.lfOutPrecision = 3;
19.
logFont.lfClipPrecision = 2;
20.
logFont.lfQuality = 1;
21.
logFont.lfPitchAndFamily = 2;
22.
m_font.CreateFontIndirect(&logFont);
23.
SetFont(&m_font);
24.
CFont *pOldFont = pDC->SelectObject(&m_font);
25.
26.
rect.left += 6;
27.
rect.right -= 6;
28.
rect.bottom -= 1;
29.
rect.top = rect.bottom - ITEMBUTTON_HEIGHT + 1;
30.
31.
32.
CFont m_LogoFont;
33.
CString sLogoString;
34.
35.
m_LogoFont.CreateFont(rect.Height()*4/5, 0, 0, 0, FW_BOLD, 1, FALSE, FALSE,
36.
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
37.
FIXED_PITCH | FF_ROMAN,
"楷体_GB2312"
);
38.
39.
sLogoString = m_LogoName;
40.
41.
RECT m_rDataBox;
42.
CopyRect(&m_rDataBox,&rect);
43.
44.
TEXTMETRIC
tm
;
45.
pDC->GetTextMetrics(&
tm
);
46.
CFont* oldFont = pDC->SelectObject(&m_LogoFont);
47.
CSize sz = pDC->GetTextExtent(sLogoString, sLogoString.GetLength());
48.
//用GetTextExtent来计算字体logo大小,依靠于设备环境,使用logo位于右下角
49.
m_rDataBox.left = m_rDataBox.right - sz.cx -
tm
.tmAveCharWidth/2;
50.
m_rDataBox.top = m_rDataBox.bottom - sz.cy -
tm
.tmHeight/5;
51.
pDC->SetBkMode(TRANSPARENT);
52.
//用3D字体显示,先黑后白,最后再用默认色
53.
COLORREF
oldColor = pDC->SetTextColor(GetSysColor(COLOR_3DDKSHADOW));
54.
pDC->DrawText(sLogoString, sLogoString.GetLength(), &m_rDataBox, DT_VCENTER | DT_SINGLELINE | DT_CENTER);
55.
m_rDataBox.left -=
tm
.tmAveCharWidth;
56.
pDC->SetTextColor(GetSysColor(COLOR_3DHILIGHT));
57.
pDC->DrawText(sLogoString, sLogoString.GetLength(), &m_rDataBox, DT_VCENTER | DT_SINGLELINE | DT_CENTER);
58.
m_rDataBox.left += 3*
tm
.tmAveCharWidth/5;
59.
pDC->SetTextColor(RGB(0,0,255));
60.
pDC->DrawText(sLogoString, sLogoString.GetLength(), &m_rDataBox, DT_VCENTER | DT_SINGLELINE | DT_CENTER);
61.
62.
//释放资源
63.
pDC->SelectObject(oldFont);
64.
pDC->SetTextColor(oldColor);
65.
m_LogoFont.DeleteObject();
66.
//
67.
}
八、在属性页中动态加入其它控件
下面演示如何在左下角加入一Edit控件:
MyPropSheet.h中:
1.
public
:
2.
CEdit m_edit;
MyPropSheet.cpp中:
01.
BOOL
CMyPropSheet::OnInitDialog ()
02.
{
03.
BOOL
bResult = CPropertySheet::OnInitDialog ();
04.
05.
06.
CRect rect;
07.
08.
int
nHeight = 24;
09.
int
nWidth = 120;
10.
int
nOffset = 6;
11.
12.
GetClientRect (&rect);
13.
14.
// Find a bottom-left point for the edit control in the client area
15.
int
nX = rect.left + nOffset;
16.
int
nY = rect.top + (rect.Height() - nHeight) - nOffset;
17.
18.
// finally create the edit control
19.
m_Edit.CreateEx (WS_EX_CLIENTEDGE, _T(
"EDIT"
), NULL,
20.
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
21.
nX, nY, nWidth, nHeight, m_hWnd, 0, 0 );
22.
23.
return
bResult;
24.
}