mehrere Bilder auf die Form malen?!
-
Moin,
ich beschäftige mich jetzt seit ... nichteinmal 24h mit MFC und bekomme schon das kalte Grausen, leider habe ich aber aktuell keine andere Wahl - auch bei der Entwicklungsumgebung muss ich auf... VC++ 6.0 zurückgreifen
Es geht um folgendes: ich möchte mehrere Bilder auf der Form anzeigen. Nebeneinander usw... beliebige Positionen. Und ich möchte die Bilder auch anklicken können.
Dafür jetzt das vorgegebene BILD-Element zu nehmen ist natürlich eine Möglichkeit, aber ich will, dass während der Laufzeit bestimmt werden kann, wieviele Bilder angezeigt werden sollen und ich habe nicht wirklich große Lust, jetzt 100 Elemente auf der Form anzuordnen.
Ich habe Erfahrungen mit QT und dort konnte man sehr leicht ein neues Objekt im Code erstellen. Bei MFC suche ich auch sowas in der Art, aber ich scheitere schon daran, dass ich das BILD Element noch nichteinmal verschieben kann. Immerhin: Ich kann bei Klick auf dem BILD-Element andere Bilder darstellen, aber ... das ist nicht so ganz Sinn der Sache, da ich dann mehrere dieser Elemente bräuchte.
Kann sein, dass ich da an den totalen Basics scheitere oder den Wald vor lauter Bäumen nicht sehe, aber irgendwie... nuja...
Wenn da jemand ein kurzes, knackiges Beispiel parat hat (nein, keine voll ausprogrammierte Lösung!), wie man N Bilder an beliebige Positionen auf die Form malen kann: wäre echt super
Achja:
die Bitmaps habe ich in der Klasse der Form private angelegt:
CStatic *myPic;
und im Konstruktor:
this->myPic=new CStatic[100]; myPic[0].SetBitmap(BMP1); ...
Und nun?
Es muss doch irgendeine einfache "mal mir ein bild an Position XY"-Funktion geben?! O.o Entweder für die Form selbst oder für irgendein Element, dass man auf die Form legt (picturebox oder so).
-
na bevor du mit SetBitmap drauf los gehen kannst, ist es vielleicht erstmal Sinnvoll das Control zu erstellen mit Create. Das sollte dann deine restlichen Fragen eigentlich auch lösen, nur achte darauf das du die richtigen styles benutzt und zum ende das alles auch wieder aufräumst, sonst haste nen speicherleak
-
Ah danke das bringt mich schonmal weiter... manchmal reicht nur der richtige anfang
Aber:
CMemoryDlg::CMemoryDlg(CWnd* pParent /*=NULL*/) : CDialog(CMemoryDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMemoryDlg) // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pAutoProxy = NULL; this->myBmp=new CBitmap[100]; this->myPic=new CStatic[100]; myBmp[0].LoadBitmap(BACK); myPic[0].Create(_T("myPic"),WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(10,10,150,50),???); myPic[0].SetBitmap(myBmp[0]); }
Die ??? sind noch das Problem und pParent ist nicht der Joker
-
na der parent is ist der zeiger auf deinen Dialog also im normalfall this, aber du kannst die Statics nicht im Konstruktor deines Dialoges erstellen. Um die zu erstellen gibt es InitDialog und da kannst du alle sachen erstellen und einstellen, die sichtbar sein sollen, weil im konstruktor ist dein Dialog ja noch nicht erstellt.
schaust du hier zu OnInitDialog, da ist dann die richtige stelle um
this->myBmp=new CBitmap[100]; this->myPic=new CStatic[100]; myBmp[0].LoadBitmap(BACK); myPic[0].Create(_T("myPic"),WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(10,10,150,50),???); myPic[0].SetBitmap(myBmp[0]);
einzufügen.
-
wow vielen Dank! Es klappt
Jetzt wäre das nächste Problem, dass man die Bilder anklicken können soll... aber da fummel ich mich dann mal in ruhe ein, nachdem das Eis gebrochen ist
-
schau dir mal die Styles an besonders SS_NOTIFY das bewirkt das du eine nachricht beiom klicken auf das bild erhälst, jetzt noch den Handler hinzufügen und schon sollte dein Problem gelösst sein. eigentlich. Denn so einfach ist das dann wieder nicht, denn du musst jeden deiner Statics eine eindeutige ID geben und dann einen Handler für eine Message Range einrichten, aber da solltest du dich hier mal weiter belesen.
-
Okay für das erste wird es reichen, den linksklick auf die Form zu erkennen und anhand der Mausposition herauszufinden, welches Bild das wohl sein wird (hoffe ich
).
Aber mal ganz abseits dessen: seit 5 minuten funktioniert intellisence nicht mehr und es ist dann sehr fummelig, wenn this->laaange Liste nicht mehr geht
-
da nutz mal die forensuche, da musste nur ein zwei dateien in deimen projektordner löschen dann geht das wieder, aber welche das sind hab ich jetzt net im kopf
und du brauchst keine klick-position weil du die vorher zugeordnete ID geliefert bekommst und weist welches bild geklickt wurde, also nicht komplizierter machen als es ist
-
Okay, habs eben gerade durchschaut.
Der Anwender kann bestimmen, wieviele Bilder dargestellt werden sollen und beim anklicken wird die Funktion aufgerufen und sagt mir auch direkt brav, welches Bild angeklickt wurde.
Danke für die Hilfe, das war genau das, was ich für den Einstieg brauchte, der Rest sollte jetzt nach und nach kommen