Liste wird vom Hinergrundbild übermalt

MrFlow1

Grünschnabel
Guten abend zusammen,

ich habe in meinem Dialog ein Problem mit einer CListControl Liste und dem Hintergrund bild.

Ich erzeuge beides in der OnInitDialog Funktion:

Code:
m_bmBackground.LoadBitmap(IDB_BG_ADDSONGS);
m_stBackground.Create(NULL, SS_BITMAP | WS_VISIBLE, CRect(0,0,800,600), this,
 IDC_BG_ADDSONGS);
m_stBackground.SetBitmap(m_bmBackground);

m_List.Create(WS_VISIBLE | ES_READONLY | LVS_REPORT | LVS_NOCOLUMNHEADER
 | LVS_SHOWSELALWAYS, CRect(5,10,795,510), this, IDC_LIST);
m_List.SetBkColor(RGB(0,0,0));
m_List.InsertColumn(0, "Name", LVCFMT_LEFT, 790);
m_List.SetFont(font, false);

Wenn der Focus jetzt in der Liste ist, ich dann ein anderes Fenster aktiviere, das meinen Dialog verdeckt, und ich dann meinen Dialog wieder aktiviere, ist die Liste komplett verschwunden und wird erst wieder Stück für Stück sichtbar, wenn ich die einzelnen Zeilen auswähle.
Wenn der Focus vorher nicht in der Liste ist oder ich kein Hintergrundbild gesetzt habe, bleibt die Liste sichtbar.

Hat jemand eine Idee, wie die Liste dauerhaft sichtbar bleibt?

Danke und schönen Gruß

MrFlow
 

MCoder

Erfahrenes Mitglied
Hallo,

ich nehme an das Hintergrundbild soll für den ganzen Dialog sein? Mit zwei konkurrierenden Controls (ListControl und PictureControl) an der selben Position funktioniert das nicht. Du musst stattdessen entweder für WM_PAINT oder WM_ERASEBKGND einen Messagehandler installieren und das Bild dort zeichnen.

Gruß
MCoder
 

MrFlow1

Grünschnabel
Hi MCode,

ja, das Hintergrundbild ist für den ganzen Dialog.

Wenn ich das Bild über einen der beiden von dir erwähnten Messagehandler erzeuge, wird es dann automatisch im Hintergrund oder als erstes gezeichnet?

Und brauch ich da in der Handler-Funktion noch eine bestimmt Vorgehensweise?

Danke

MrFlow
 

MCoder

Erfahrenes Mitglied
Wenn ich das Bild über einen der beiden von dir erwähnten Messagehandler erzeuge, wird es dann automatisch im Hintergrund oder als erstes gezeichnet?
Das Bild ist dann immer im Hintergrund.
Und brauch ich da in der Handler-Funktion noch eine bestimmt Vorgehensweise?
Du musst halt nur das Bild zeichen, Beispiel WM_PAINT:
C++:
void CMyDialog::OnPaint() 
{
    CPaintDC dc(this); // device context for painting

    CBitmap bitmap;
    BITMAP  bm;
    bitmap.LoadBitmap(IDB_BG_ADDSONGS);
    bitmap.GetBitmap(&bm);
    
    CDC memDC;
    memDC.CreatCompatibleDC(&dc);
    CBitmap *pOldBmp = memDC.SelectObject(&bitmap);
   
    CRect rcDlg;
    GetClientRect(&rcDlg);
        
    dc.StretchBlt( 0,
                   0,
                   rcDlg.Width(),
                   rcDlg.Height(),
                   &memDC,
                   0,
                   0,
                   bm.bmWidth,
                   bm.bmHeight,
                   SRCCOPY );
     
     memDC.SelectObject(pOldBmp);
}
Gruß
MCoder