Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows编程对话框背景图像_C++_Windows_Background_Bitmap_Dialog - Fatal编程技术网

C++ Windows编程对话框背景图像

C++ Windows编程对话框背景图像,c++,windows,background,bitmap,dialog,C++,Windows,Background,Bitmap,Dialog,有什么好的教程或方法可以将背景图像添加到Windows对话框中吗 类似于此: 我的追索权文件(稍微修剪): #包括 #包括“WindowSettings.h”//用于IDC、IDD和DLG //IDD_DLG的对话框模板 // IDD_DLG DIALOGEX 200、100、200、350 样式DS|u SETFONT | DS|u MODALFRAME | WS|u弹出| WS|u字幕| WS|u系统菜单 标题DLG_名称 字体8,“MS无衬线”,0,0,0x0 开始 LTEXT“显示设备

有什么好的教程或方法可以将背景图像添加到Windows对话框中吗

类似于此:

我的追索权文件(稍微修剪):

#包括
#包括“WindowSettings.h”//用于IDC、IDD和DLG
//IDD_DLG的对话框模板
//
IDD_DLG DIALOGEX 200、100、200、350
样式DS|u SETFONT | DS|u MODALFRAME | WS|u弹出| WS|u字幕| WS|u系统菜单
标题DLG_名称
字体8,“MS无衬线”,0,0,0x0
开始
LTEXT“显示设备”,IDC_静态,10,5,50,10
组合框IDC_DIS,10,15,180,64,CBS_DROPDOWNLIST | WS_VSCROLL | WS|u TABSTOP
LTEXT“分辨率”,IDC_静态,10,35,50,10
组合框IDC_RES,10,45,180,50,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS|TABSTOP
除霜按钮“Go”,IDC_Go,40,205,50,15,WS_禁用
按钮“取消”,IDCANCEL,110,205,50,15
结束
这里有一个:


处理
WM_ERASEBKGND
消息

要做到这一点,实际上只有一种切实可行的方法。 在资源编辑器中添加静态图像控件是一件痛苦的事情,因为图像需要调整大小以覆盖整个对话框,使得对话框几乎不可能编辑,因为所有单击都将在图像控件上进行

您可以将图像控件的创建推迟到WM_INITDIALOG,但反对使用控件的第二个标志是窗口控件重叠时绘制不美观

因此,您需要手动执行此操作,在WM_INITDIALOG中加载位图,存储HBITMAP,并在WM_橡皮擦BKGND消息上绘制它

如果您另外将HBITMAP转换为HBRUSH,您可以处理WM_CTLCOLORSTATIC(和其他WM_CTLCOLORxxx)消息并从消息返回HBRUSH,这将在任何非矩形控件下绘制位图,因此,根据“after”屏幕截图,after文本将是位图背景上的黑色文本

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

  • 将WS_EX_合成样式添加到对话框中。添加到Windows 2000中,该样式使对话框(实际上是任何窗口)一次将所有子窗口渲染到backbuffer,然后将其渲染到屏幕上以消除闪烁。但是,实现Vista Aero Glass效果的桌面窗口管理器不支持它,因此在Windows 6.0中,此功能已被破坏

  • 将WS_CLIPCHILDREN样式添加到对话框中。使用此样式将无法使用选项卡或分组框等控件,因为它们依赖于未剪裁的绘制矩形与其他控件合成


是否有简单的方法在WM_INITDIALOG msg上添加图像?否。“把背景图片放在所有东西下面”的行为根本不存在,所以你必须自己做。请记住,这个窗口/对话框系统是在20世纪80年代早期设计的。
#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