tOk.top;
rectText.bottom = rectOk.bottom;
rectText.right = rectOk.left;//获得所需绘制按钮区窗口逻辑坐标。
CFont * OldFont = dc.SelectObject(&m_fontLogo);//选择所需字体。
COLORREF OldColor = dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT));//设置文本颜色。
dc.DrawText( m_LogoText, rectText + CPoint(1,1), DT_SINGLELINE | DT_LEFT | DT_VCENTER);//显示字符串。
dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
dc.DrawText( m_LogoText, rectText, DT_SINGLELINE | DT_LEFT | DT_VCENTER);//显示字符串3D阴影。
dc.SetTextColor( OldColor);//恢复原文本颜色。
dc.SelectObject(OldFont);//恢复原字体。
}
在这段代码中,首先通过定义一个以thhis指针为变量的CPaintDC变量dc得到当前绘图设备环境。然后是要找出按钮区的具体位置。按钮区操作的位置实际就是属性表的制表控件客户区的最左端直到第一个按钮最左端为此的区域。也就是说,先需要得到属性表制表控件的指针,这可用CPropertySheet类的方法GetTabCtrl()得到。再通过WIN32API函数GetWindowRect()得到控件客户区的屏幕坐标。然后得到用GetDlgItem(IDOK)->GetWindowRect()得到客户区最左OK按钮的屏幕坐标。将它们都转换为窗口逻辑坐标,以控件客户区的左坐标作为操作按钮区的左坐标,以最左OK按钮的上、下坐标作为操作按钮区的上、下坐标,以最左OK按钮的左坐标作为操作按钮区的右坐标。就得到了所需按钮区的具体位置。最后只需再选择字体和文本颜色,用DrawText() 进行显示即可在属性表按钮区绘出字符串。
如果我们要在按钮区显示一幅位图,只须对以上代码作出很少修改,具体代码如下:
CBitmap bmp, *poldbmp;
CDC memdc;
CRect rect;
bmp.LoadBitmap(IDB_BITMAPLOGO); //载入位图资源。
memdc.CreateCompatibleDC(&dc);//生成一个与当前设备环境兼容的内存设备环境。
poldbmp = memdc.SelectObject(&bmp);//将位图写入内存设备环境。
GetClientRect(&rect);//获得属性表客户区的大小
//从内存设备环境向屏幕挎贝位图。
dc.BitBlt(left, rect.bottom - lower, w, h, &memdc, 0, 0, SRCCOPY);
//w,h为位图的宽度和高度。Left为位图距属性页左边框的距离,lower 为位图距下边框的距离。
memdc.SelectObject(poldbmp);
通过引入位图资源,再将其选入内存设备环境,最后用BitBlt函数显示到实际设备环境,我们就在按钮区绘出了所选位图。这一步骤与其它在正常窗口显示位图的方法是基本一致的。
3.实现所需注意问题
需要注意的是,属性表有两种模式,一种是正常属性表模式,另一种是向导模式(Wizard)。我们可以通过加入如下代码检测属性表的模式:
BOOL bWizMode;
//从PROPSHEETHEADER 结构中得到当前属性表的模式。
if( m_psh.dwFlags & PSH_WIZARD )
bWizMode = TRUE; //是向导模式
else
bWizMode = FALSE; // 是正常属性表模式
其中,m_psh是CPropertySheet类的公有成员变量,它是PROPSHEETHEADER结构,可以通过访问该成员变量获取属性表的基本属性。
在正常属性表模式下,上述获取属性表按钮区位置的方法可以正确通过。而在向导模式下,属性表没有制表控件,无法得到制表控件客户区位置。在这时,需要用属性表对话框窖口代替控件客户区。可在原代码中加入如下代码:
if( bWizMode ) {
GetWindowRect(rectTabCtrl); //得到对话框窗口屏幕坐标。
rectTabCtrl.OffsetRect(14,0); // 对窗口位置校正
}
else{
GetTabControl()->GetWindowRect(rectTabCtrl);
}
通过以上代码,我们就能够正确得到属性表按钮区域位置。
4.结论
由上述讨论可知,对于属性表按钮区进行操作,关键是要了解对非窗口客户区进行绘制是不