2012-01-16 34 views
0

我需要构建一个设计为与此完全相同的窗口(它具有白色区域内的控件,但与现在不相关):将CDialog划分为不同背景的两个区域(内部物镜图片)

http://dl.dropbox.com/u/3432167/example.png
我的问题是定义这两个不同背景的独立“区域”。
最接近我预期的样子是用一个空的ListBox来代表白色区域,但结果是不一样的(这是一个糟糕的黑客攻击)。

关于如何实现这一点的任何想法?

回答

0

经过一番挖掘,我发现一个很好的方法是覆盖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(); 
    } 
} 

该解决方案结束了很简单,但我想分享无论如何有用。

1

如果对话框不需要调整大小,最简单的方法就是创建一个具有所需背景的bmp(如果您可以使用CDialogEx而不是CDialog - 只需调用SetBackgroundImage,则很容易)。

如果你不能使用位图,那么你将不得不创建自己的控件来绘制这个背景。

+0

我可以!谢谢你,先生,那美妙地服务我的目的。 – baderous 2012-01-16 22:56:29

+0

尝试此解决方案后,我遇到了一些问题。它需要在所有控件插入“覆盖它”但高于原始背景的位置下维护位图。这是一种额外的不必要的资源;这是一个“肮脏”的解决方案...我已经发布了一个解决方案的答案,以更“自然”的方式解决问题。谢谢! – baderous 2012-01-17 21:14:15

+0

我还没有尝试过自己,但我真的不认为你的解决方案更好或更自然。如果你需要更复杂的背景怎么办?你打算用GDI来画吗?你甚至没有使用双缓冲区,所以你会有闪烁的问题。但我很高兴知道你找到了解决问题的办法。 – 2012-01-18 08:02:52