MFC单文档绘图(二)——TabCtrl和CPropertySheet

界面如下:

MFC单文档绘图(二)——TabCtrl和CPropertySheet_第1张图片


关于TabCtrl和Sheet折腾了几天,开始时在分割出来的窗口上使用TabCtrl发现tab页按钮和编辑框都无响应(原因为TabCtrl控件的父窗口Style类型为child,如果是Popup或Overlapped均正常),必须最大化或者最小化等操作之后才可以操作,并且在视图窗口中更新(调用UpdateAllView)后又出现同样的情况。(目前没有找到比较合适的办法,对窗口的内部机制理解还不够,有知道的望告知),最后决定用Sheet,具体过程如下:


添加基于CPropertySheet基类的CPageSheet类,创建两个对话框(Style为Child),并基于CPropertyPage基类创建对应的类CDrawPage和CScanPage,在CPageSheet中创建上述两个类对应的成员变量。

class CPageSheet : public CPropertySheet
{
	DECLARE_DYNAMIC(CPageSheet)
public:
	CDrawPage m_drawPage;
	CScanPage m_scanPage;

public:
	CPageSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
	CPageSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
	virtual ~CPageSheet();

protected:
	DECLARE_MESSAGE_MAP()
};

并在CPageSheet的构造函数中增加初始化页面的代码。

CPageSheet::CPageSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
	:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{

}

CPageSheet::CPageSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
	:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
	AddPage(&m_drawPage);
	AddPage(&m_scanPage);
	SetActivePage(&m_scanPage);
}
我使用的是多字符集(vs2010),编译运行后发现page的背景全变成了白色。

MFC单文档绘图(二)——TabCtrl和CPropertySheet_第2张图片

搜索无果,于是想到跟换背景颜色,在page也的类中添加OnCtlColor和OnEraseBkgnd函数对对话框的背景进行绘制。让没有控件的地方为默认背景色,有控件的地方设置为透明模式。

HBRUSH CPage2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CPropertyPageEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	if (nCtlColor == CTLCOLOR_EDIT || nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SetBkMode(TRANSPARENT);
		//return (HBRUSH)::GetStockObject(NULL_BRUSH);
	}
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

BOOL CPage2::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect(0,0,0,0);
	GetClientRect(&rect);
	CBrush brush;
	brush.CreateSolidBrush(GetSysColor(COLOR_3DFACE));
	pDC->FillRect( &rect, &brush);
	return TRUE;
	//return CPropertyPageEx::OnEraseBkgnd(pDC);
}
MFC单文档绘图(二)——TabCtrl和CPropertySheet_第3张图片
可以解决,但是效果不是很理想。折腾了好久以后发现当我把Unicode取消注释之后,界面恢复正常了,虽然变回老版本的样式,但是比较自然。也就是虽然是多字符集的项目,但是不注释Unicode定义(stdafx.h)。

#ifdef _UNICODE
……
#endif




你可能感兴趣的:(MFC,C++)