Bilder (Bitmap) in StaticFeld Anzeigen? Dynamisch?

Du hast ja ein Static zum Anzeigen. Das sollte den Stil OwnerDraw (Benutzerzeichnung! sch***-Übersetzer!) haben.

Das erledigst du innerhalb OnInitDialog bei einem Dialog oder OnCreate bei einem normalen Fenster.

meinStatic.ModifyStyle( 0, SS_OWNERDRAW );


Trenne das Laden und das Darstellen (ein CBitmap als Member, wo die einzelnen Bilder reingeladen werden können). Die CBitmap in deiner Dialog-Klasse als Member einsetzen.

CBitmap m_Bitmap;

Das Laden läuft ja genau gleich: m_Bitmap.LoadBitmap.

Damit nach einem Ladevorgang die Bitmap direkt angezeigt wird, einfach m_meinStatic.Invalidate();


Lass dir vom AppWizard bzw. Klassenassistenten eine OnDrawItem von der Static anlegen. Dort packst du die reine Darstellung rein.

Code:
void CMeinDialog::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )
{
  if ( nIDCtl == ID_MEIN_STATIC )
  {
    HDC    hdcImage = CreateCompatibleDC( lpDrawItemStruct->hDC );

    HBITMAP hbmOld = ::SelectObject( hdcImage, m_Bitmap );

    BitBlt( lpDrawItemStruct->hDC, 100,100, 400, 400, hdcImage, 0, 0, SRCCOPY );

    SelectObject( hdcImage, hbmOld );
    DeleteDC( hdcImage );

    return;
  }
}


Das sollte eigentlich funktionieren.
 
Danke für deine Antwort.
eine frage habe ich noch ..das aufrufen von OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct ) erwartet 2 Parameter .das 1 ist ID_MEIN_STATIC aber was ist das 2.?
 
OnDrawItem rufst du NICHT selbst auf. MFC macht das für dich, wenn du m_meinStatic.Invalidate() aufrufst.

Das LPDRAWITEMSTRUCT ist ein Pointer auf eine Struct, das alle möglichen Daten für das Zeichnen enthält.
 
So habe ich auch gemacht befor ich die Letzte Frage stelle. also ich hbae zum testen einen Button1 erstellt und wenn ich drauf clicke dann passirt das:
m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_st1.Invalidate();

beim ausführen wird nichts angezeigt und bekomme eine Windows Fehlermeldung "Debug assertion Failed...."
habe ich das richtig gemacht?
 
Sieht richtig aus.

Aus welchem Grund assertiert das? Ist ein HWND (vom Static) evtl. NULL? Bei der Debug Assertation müsste der Debugger auf einen Code innerhalb MFC zeigen.

Oder der andere, beliebte Grund: In OnDrawItem NICHT die Basisklasse-OnDrawItem aufrufen! Das soll ein Sicherheitsmechanismus sein, damit bei einem Benutzeritem auch tatsächlich was getan wird. Die Basis-Klasse-OnDrawItem hat ein Assert eingebaut.

Falls es das auch nicht ist, könntest du das Projekt irgendwie zippen und hier reinhängen, dann gugg ich mal drüber.
 
Hmm, meine zweite Vermutung: Das OnDrawItem solltest du nicht per Hand anlegen, sondern über den Klassenassistenten anlegen lassen. Die Funktion selbst funktioniert einwandfrei, nur wusste der Dialog nichts davon. Ändere in der Bitmaptest2Dlg.cpp die MessageMap so ab:

Code:
BEGIN_MESSAGE_MAP(CBitmaptest2Dlg, CDialog)
	//{{AFX_MSG_MAP(CBitmaptest2Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_DRAWITEM()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Die Messagemap gibt es bereits, du musst nur die eine Zeile ON_WM_DRAWITEM() dazufügen, dann klappt dein Programm auf Anhieb.


[edit: TABs und deren Benutzer gehören erschossen]
 
Vielen vielen Dank es hatt funktioniert.
OnDrawItem habe ich per hand angelegt weil ich dich falsch verstanden habe, und versucht OnDrawItem per Assistent nur für den Static anzulegen was nicht von der Assistent angeboten war. Also habe ich es per Hand angelegt.


nochmal Vielen Dank
 

Neue Beiträge

Zurück