pixel in bitmaps setzen.
-
Hallo. es gibt zwar schon einige tutorials zum thema, aber aus denen werde ich nicht schlau (bin ein blutiger anfänger in c++ und ms vc++).
habe eine dialogfeldbasierende mfc anwendung, die die mandelbrotmenge zeichnet.
nun möchte ich mit hilfe der maus ein auswahlrechteck zum reinzoomen zeichnen. damit das rechteck beim ziehen keine spuren hinterläßt, muß ich das fertig berechnete bild in einem bitmap ablegen (so hab ichs jedenfalls in delphi gemacht). ausserdem, soll das bild erhalten bleiben, falls es mal von einem anderen fenster überdeckt wurde.
wie zu teufel geht das in vc++? alle tutorials beziehen sich immer auf SDI anwendungen (zb scribble), nicht aber auf simple dialogbasierte. entschuldigt das fluchen, aber vc++ erscheint mir ziemlich konfus (im vergleich zu BCB etwa), leider bin ich aus geschwindigkeitsgründen auf vc++ angewiesen. also: wie erschaffe ich ein bitmapobjekt, wie setzte ich pixel der farbe f an die stelle x,y des bitmap, wie zeige ich dieses dann im aktuellen dialogfenster an, wenn es neuberechnet wurde, das fenster bedeckt wurde oder bevor das zoomrechteck gezeichnet wird)? konkrete beispiele bitte.
-
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap08.htm
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel4.htmSorry für die kurze Antwort.
Grüße Rapha
-
danke für die kurze antwort.
habe das gefundene es einfach mal implementiert, ohne es im detail (im ansatz ;-)) zu verstehn. funktioniert. ich schätze ein nicht geringer teil der leute programmiert so (ohne es zuzugeben). aber ein ungutes gefühl bleibt trotzdem.
-
Hm, gib mal etwas Code, den wir dir erklären sollen...
-
CDC DC; CDC* pDC = GetDC(); CBitmap Bitmap; DC.CreateCompatibleDC(pDC); Bitmap.CreateCompatibleBitmap(pDC, 500, 500); DC.SelectObject(Bitmap); DC.SetPixel(x , y , RGB(255, 0, 0)); pDC->BitBlt( 0, 0, 500, 500, &DC, 0, 0 , SRCCOPY);zeile 3,6,7 sind klar, der rest nicht.
es läuft jetzt einigermaßen, aber irgendwie nicht immer.
das problem ist, das ich von zwei funktionen aus auf dasselbe bitmap zugreifen will und nicht weis (bin totaler anfänger) wie ich das ganze global declarieren soll.
-
Für mich macht der Code ehrlich gesagt macht wenig Sinn.
Du erstellst ein Bitmap 500*500, setzt einen Pixel und zeichnest das Bitmap dann?
Wenn dieser Code z.B. bei WM_MOUSEMOVE aufgerufen wird, ist er ziemlich langsam...Grüße Rapha
ps. Ich würde das Rechteck in der Dialogklasse speichern (CReckt) und in der OnPaint Methode zeichnen (sofern erwünscht).
-
das sind ja nur ausschnitte dessen, was ich an bitmapspezifischen funktionen benutze und kein zusammenhängendes stück code.
-
Nun gut...
Portnoy schrieb:
CDC DC;Hier erstellst du ein (uninitialisiertes) Device Context. Ein Device Context ist eine Art Werkzeugsbox für Grafikausgabe. Ein DC musst du dann mit einem Objekt (z.B. einem Bitmap) verknüfen, damit alle Aktionen, die du auf das DC ausführst, auf das Objekt "übertragen" werden.
Portnoy schrieb:
CDC* pDC = GetDC();Hier erstellst du noch ein DC. Diesesmal ist es jedoch initialisiert.
Es enthält nämlich als Objekt das Fenster (GetDC ist eine Methode von CWnd) und somit dessen (grafischer) Inhalt.Portnoy schrieb:
CBitmap Bitmap;Dieses Objekt repräsentiert das Bitmap.
Portnoy schrieb:
DC.CreateCompatibleDC(pDC);Das 1. DC wird an das DC des Fensters angepasst (z.B. die Farbpalette, usw).
Portnoy schrieb:
Bitmap.CreateCompatibleBitmap(pDC, 500, 500);Das Bitmap wird an das DC des Fenster angepasst (z.B. die Farbpalette, usw.)
Portnoy schrieb:
DC.SelectObject(Bitmap);Das 1. DC wird mit dem Bitmap verknüpft (-> alle Aktionen werden auf das Bitmap übertragen).
Portnoy schrieb:
DC.SetPixel(x , y , RGB(255, 0, 0));Es wird ein Pixel auf das 1. DC (und somit das Bitmap) gezeichnet
Portnoy schrieb:
pDC->BitBlt( 0, 0, 500, 500, &DC, 0, 0 , SRCCOPY);Das 1. DC (BitmapDC) wird auf das 1. DC(FensterDC) "gemalt".
Grüße Rapha