将CDialog分为两个不同背景的区域(内部目标的图片)
Dividing a CDialog in two areas with different backgrounds (picture of the objective inside)
我需要构建一个设计成这样的窗口(它在白色区域内有控件,但目前与此无关):
http://dl.dropbox.com/u/3432167/example.png
我的问题是用不同的背景来定义这两个独立的"领域"
我得到的最接近预期的外观是用一个空的ListBox表示白色区域,但结果不一样(这是一个糟糕的破解)。
关于如何实现这一点,有什么想法吗?
如果对话框不需要调整大小,最简单的方法是创建一个具有所需背景的bmp(如果可以使用CDialogEx而不是CDialog,则非常容易-只需要调用SetBackgroundImage)。
如果不能使用位图,则必须创建自己的控件来绘制此背景。
经过一番挖掘,我发现实现这一点的一个好方法是重写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();
}
}
解决方案最终非常简单,但我想无论如何分享都很有用。
相关文章:
- 如何在全屏模式下(在OpenGL中)使背景透明
- 使用窗口中的QSlider更改背景音量
- 将QGraphicsItem的移动区域限制在多边形区域内
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- SDL2 透明背景
- 提升区域设置规范化带状字符,但不规范化重音
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 英特尔将指令存储在重叠的内存区域
- 如何给主窗口区域DKGRAY_BRUSH?
- 矢量擦除多个区域,2 x 擦除与单个分配?
- 错误:创建对象后无法分配区域
- 是否有任何区域设置会影响宽字符编码?
- GTKMM:拍摄绘图区域的屏幕截图?
- GTKMM:如何将键盘事件附加到绘图区域?
- 在 mmap'ed 区域上使用 memcpy 崩溃,for 循环不会
- 在 Visual C++ 中以编程方式更改按钮的背景图像
- 将CDialog分为两个不同背景的区域(内部目标的图片)