Salut,
Je suis en train de programmer une petite appli MFC MDI qui consiste à afficher 1 image bitmap en arrière plan. Pour cela, je me suis inspiré des 2 progs svts :
http://www.codeproject.com/dialog/md...asp#xx535306xx
http://www.codeproject.com/dialog/bmpdlg01.asp
Le 1er utilise MFC et Win32, mais le pb c'est que cela ne marche qu'avec l' image de son projet, et dès que l'on prend 1 autre image, le la fonction BitBlt() plante.
Le second prog utilise 1 CDialog.
Partant de là, j'ai redéfini la fonction OnEraseBkgnd(CDC* pDC) de ma classe CMainFrame (fille de CMDIMainFrame), en m'inspirant de ce qui avait été fait ds le 2nd prog (avec la CDialog).
Mais malheureusement, ça marche pas. En effet, 1 fois que Windows a affiché mon image ds l'arrière plan de la CMainFrame, il efface aussitôt l'arrière plan et le redessine ; du coup plus aucune image affichée sur l'arrière plan.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 BOOL CMainFrame::OnEraseBkgnd(CDC* pDC) { CMDIFrameWnd::OnEraseBkgnd(pDC); // TODO: Add your message handler code here and/or call default // m_bitmap : l'image à afficher en arrière plan if(!m_bitmap.m_hObject) return 1; CRect rect; GetClientRect(&rect); CDC dc; dc.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap); int bmw, bmh ; BITMAP bmap; m_bitmap.GetBitmap(&bmap); bmw = bmap.bmWidth; bmh = bmap.bmHeight; int xo=0, yo=0; pDC->StretchBlt(xo, yo, rect.Width(), rect.Height(), &dc, 0, 0,bmw,bmh, SRCCOPY); dc.SelectObject(pOldBitmap); dc.DeleteDC(); return 1; }
J'avoue que je suis 1 peu paumé.
J'ai pourtant bien pris soin de faire retourner à ma fonction
OnEraseBkgnd() la valeur 1, comme il est stipulé ds la doc MSDN :
Qqn a-t-il déjà été confronté à ce pb ? :An overridden OnEraseBkgnd should return nonzero in response to WM_ERASEBKGND if it processes the message and erases the background;
Partager