我需要构建一个设计为与此完全相同的窗口(它具有白色区域内的控件,但与现在不相关):将CDialog划分为不同背景的两个区域(内部物镜图片)
http://dl.dropbox.com/u/3432167/example.png
我的问题是定义这两个不同背景的独立“区域”。
最接近我预期的样子是用一个空的ListBox来代表白色区域,但结果是不一样的(这是一个糟糕的黑客攻击)。
关于如何实现这一点的任何想法?
我需要构建一个设计为与此完全相同的窗口(它具有白色区域内的控件,但与现在不相关):将CDialog划分为不同背景的两个区域(内部物镜图片)
http://dl.dropbox.com/u/3432167/example.png
我的问题是定义这两个不同背景的独立“区域”。
最接近我预期的样子是用一个空的ListBox来代表白色区域,但结果是不一样的(这是一个糟糕的黑客攻击)。
关于如何实现这一点的任何想法?
经过一番挖掘,我发现一个很好的方法是覆盖OnPaint函数。
以下是用于上述问题的对话框的示例。矩形维度是硬编码的,因为此特定对话框不可调整大小。
不要忘记将ON_WM_PAINT()添加到消息映射中。
void CTestDlg::OnPaint()
{
if (IsIconic())
{
(...)
}
else
{
CPaintDC dc(this); // device context for painting
dc.FillSolidRect(0,0,612,376, RGB(255,255,255));
dc.FillSolidRect(0,376,612,60, ::GetSysColor(COLOR_3DFACE));
CDialog::OnPaint();
}
}
该解决方案结束了很简单,但我想分享无论如何有用。
如果对话框不需要调整大小,最简单的方法就是创建一个具有所需背景的bmp(如果您可以使用CDialogEx而不是CDialog - 只需调用SetBackgroundImage,则很容易)。
如果你不能使用位图,那么你将不得不创建自己的控件来绘制这个背景。
我可以!谢谢你,先生,那美妙地服务我的目的。 – baderous 2012-01-16 22:56:29
尝试此解决方案后,我遇到了一些问题。它需要在所有控件插入“覆盖它”但高于原始背景的位置下维护位图。这是一种额外的不必要的资源;这是一个“肮脏”的解决方案...我已经发布了一个解决方案的答案,以更“自然”的方式解决问题。谢谢! – baderous 2012-01-17 21:14:15
我还没有尝试过自己,但我真的不认为你的解决方案更好或更自然。如果你需要更复杂的背景怎么办?你打算用GDI来画吗?你甚至没有使用双缓冲区,所以你会有闪烁的问题。但我很高兴知道你找到了解决问题的办法。 – 2012-01-18 08:02:52