2010-12-09 59 views
2

Y at-il un bon tutoriel ou moyen d'ajouter une image d'arrière-plan dans Windows DialogBox?Fenêtres de programmation DialogBox background image

Quelque chose de semblable à ceci: http://dl.dropbox.com/u/26234/dialogbox_background_image.jpg

Mon fichier recours (coupé un peu):

#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 
+0

double possible de [comment définir l'image d'arrière-plan dans une boîte de dialogue vC++ 6.0] (http://stackoverflow.com/questions/1429092/how-to-set-background-image-in- a-dialog-box-in-vc6-0) –

Répondre

1

Demandez à un ici:

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

poignée WM_ERASEBKGND message.

+0

Y at-il un moyen simple d'ajouter une image sur WM_INITDIALOG msg? –

+1

Non. Le comportement de "mettre une image de fond sous tout" n'est tout simplement pas là, donc vous devez le faire vous-même. Gardez à l'esprit que ce système de fenêtrage/boîte de dialogue a été conçu au début des années 1980. – mjfgates

1

Il n'y a vraiment qu'un seul moyen pratique de le faire. L'ajout d'un contrôle d'image statique dans l'éditeur de ressources est pénible car l'image doit être redimensionnée pour couvrir toute la boîte de dialogue, rendant la boîte de dialogue pratiquement impossible à modifier car tous les clics seront sur le contrôle d'image.

Vous pouvez reporter la création du contrôle d'image à WM_INITDIALOG, mais la deuxième marque contre l'utilisation d'un contrôle est que les contrôles de fenêtre ne peignent pas élégamment lorsqu'ils se chevauchent. Par conséquent, vous devez le faire manuellement, charger le bitmap dans WM_INITDIALOG, stocker le HBITMAP et le peindre sur vos messages WM_ERASEBKGND. Si vous convertissez en outre le HBITMAP en HBRUSH, vous pouvez gérer les messages WM_CTLCOLORSTATIC (et autres WM_CTLCOLORxxx) et renvoyer le HBRUSH à partir des messages, cela affichera le bitmap sous les contrôles non-rectangulaires ainsi, selon votre " après "capture d'écran, l'après texte serait un texte noir sur un fond de carte bitmap.

Votre dernier problème est que si la boîte de dialogue est redimensionnable, elle scintille. Il y a des façons d'essayer de résoudre ce problème, ne sont 100% de réussite:

  • Ajouter le style WS_EX_COMPOSITED à votre boîte de dialogue. Ajouté dans Windows 2000, ce style a causé des boîtes de dialogue (n'importe quelle fenêtre en fait) pour rendre toutes les fenêtres enfants à un backbuffer en une seule passe, et ensuite le rendre sur l'écran éliminant le scintillement. Le gestionnaire de fenêtres de bureau qui implémente l'effet Aero Glass de Vista ne le prend pas en charge, de sorte que Windows 6.0 a été endommagé.

  • Ajoutez le style WS_CLIPCHILDREN à la boîte de dialogue. L'utilisation de ce style rend impossible l'utilisation de contrôles tels que les onglets ou les zones de groupe, car ils reposent sur des retraits de peinture non clipsés pour être composites avec d'autres contrôles.