Windows编程DialogBox背景图像

时间:2010-12-09 06:31:49

标签: c++ windows background bitmap dialog

是否有任何好的教程或方法将背景图像添加到Windows DialogBox中?

类似的东西: http://dl.dropbox.com/u/26234/dialogbox_background_image.jpg

My Recourse文件(略微修剪):

#include <afxres.h>
#include "WindowSettings.h" // for IDC_?, IDD_DLG

// Dialog Box Template for IDD_DLG
//
IDD_DLG DIALOGEX 200, 100, 200, 350
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION DLG_NAME
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
    LTEXT           "Display Device", IDC_STATIC, 10, 5, 50, 10
    COMBOBOX        IDC_DIS, 10, 15, 180, 64, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
    LTEXT           "Resolution", IDC_STATIC, 10, 35, 50, 10
    COMBOBOX        IDC_RES, 10, 45, 180, 50, CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
    DEFPUSHBUTTON   "Go", IDC_GO, 40, 205, 50, 15, WS_DISABLED
    PUSHBUTTON      "Cancel", IDCANCEL, 110, 205, 50, 15
END

2 个答案:

答案 0 :(得分:1)

在这里有一个:

how to set background image in a dialog box in vc++6.0

处理WM_ERASEBKGND条消息。

答案 1 :(得分:1)

实际上只有一种实用的方法可以做到这一点。 在资源编辑器中添加静态图像控件很麻烦,因为图像需要调整大小以覆盖整个对话框,使得对话几乎无法编辑,因为所有点击都将出现在图像控件上。

您可以将图像控件的创建推迟到WM_INITDIALOG,但是使用控件的第二个标记是窗口控件在重叠时不会优雅地绘制。

因此,您需要手动执行此操作,在WM_INITDIALOG中加载位图,存储HBITMAP,并将其绘制在WM_ERASEBKGND消息上。

如果你另外将HBITMAP转换为HBRUSH,你可以处理WM_CTLCOLORSTATIC(和其他WM_CTLCOLORxxx)消息并从消息中返回HBRUSH,这将在任何非矩形控件下绘制位图,因此,按照你的“之后“截图,后面的文字将是位图背景上的黑色文字。

你的最后一个问题是,如果对话框可调整大小,它将会闪烁。有一些方法可以尝试解决这个问题,没有一种方法可以100%成功:

  • 将WS_EX_COMPOSITED样式添加到对话框中。在Windows 2000中添加,此样式导致对话框(实际上是任何窗口)在一次传递中将所有子窗口渲染到后备缓冲区,然后将其渲染到屏幕上以消除闪烁。然而,实现Vista的Aero Glass效果的桌面窗口管理器不支持它,因此从Windows 6.0开始,此功能已被破坏。

  • 将WS_CLIPCHILDREN样式添加到对话框中。使用此样式使得无法使用制表符或分组框等控件,因为它们依赖于未剪切的绘制作用以与其他控件合成。