Nächster Schritt - Ein eigener Button
-
Du musst deinen Button erst einmal sichtbar machen, entweder durch ShowWindow oder durch den Style WS_VISIBLE.
-
Dein Programm leaked.
Du musst die Bitmap, die Du zurück bekommst bei SelectObject auch wieder zurück selektieren. Sonst geht diese verloren. Ein typisches GDI-Leak.
-
Hi, erstmal danke für die schnelle Antwort.
@MFK
Stimmt, habe ich voll übersehen. Jetzt sehe ich den Bereich, wo der Button sein muss. Allerdings ist dieser nur weiß.@Martin Richter
Ich habe dich nicht so richtig verstanden, was genau du meinst.
Meinst du, das ich nach dem AufrufSelectObject(hdcMem, hBackground); BitBlt(dis->hDC, 100, 50, 100, 50, hdcMem, 0, 0, SRCCOPY);
SelectObject erneut aufrufen muss, da die Bitmap sonst weg ist?
Meinst du das mit zurück selektieren?
-
Habe gerade noch mal bei der MSDN nachgeschaut unter SelectObject.
The SelectObject function selects an object into the specified device context (DC). The new object replaces the previous object of the same type.
...
...Return value
If the selected object is not a region and the function succeeds, the return value is a handle to the object being replaced.
Ich bekomme ja ein Handle auf das Objekt zurück. Meinst du dieses mit zurück selektieren?
-
Genau! Das ist der relevante Abschnitt in der MSDN.
Sonst wird die Bitmap (1x1 pixel groß), die vei CreateCompatibleDC erzeugt wird nicht wieder freigegeben, weil Du sie wegwirfst. Deine Bitmap wird auch nicht zerstört weil noch in Benutzung...
-
Wie genau müsste ich es dann machen?
Habe den Teil mit zurück selektieren irgend wie noch nicht so ganz verstandenWäre es vielleicht besser, wenn ich CreateCompatibleBitmap mit der entsprechenden Größe nehmen würde?
-
Wäre schön, wenn ich für diesen Teil noch hilfe kriegen würde
-
Remarks
This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.
savedObject = SelectObject(...) ... SelectObject(savedObject)
-
[quote="RED-BARON"]
savedObject = SelectObject(...) ... SelectObject(savedObject)
Das habe ich schon probiert, jedoch passiert nichts. Es bleibt gleich.
-
Ich habe es jetzt wie volgt gemacht und mich dabei an dem Post von Don Carsto(http://www.c-plusplus.net/forum/279713-full) orientiert.
Das sieht dann so aus: http://s1.directupload.net/images/140916/39yszfq8.jpg
Da die Bitmap eine PNG ist, habe ich es mit AlphaBlend gemacht.
Das sieht dann so aus: http://s14.directupload.net/images/140916/gaiux9fh.jpgMan sieht, dass die weisse Fläche stört. Jetzt mal ohne die Bitmap
Das sieht dann so aus: http://s1.directupload.net/images/140916/ozv3y96p.jpgKann mir jemand sagen, wie ich diese weiße Fläche weg bekomme?
-
Hier kurz noch die Code-Stelle:
rapo1 = GetDC(hWnd); rapo2 = CreateCompatibleDC(rapo1); SelectObject(rapo2, hBackground); //BitBlt(rapo1, 100, 50, 100, 50, rapo2, 0, 0, SRCCOPY); //AlphaBlend(rapo1, 100, 50, 100, 50, rapo2, 0, 0, 100, 50, blend); DeleteObject(rapo2); ReleaseDC(hWnd, rapo1);
-
Falsch. Es geht um den Rückgabewert von SelectObject!
-
Martin, weisst du, wie ich dieses weiße Rechteck weg bekomme?
-
Ich habe es jetzt transparent bekommen, indem ich WM_CTLCOLORBTN behandle.
Jetzt ist da nur noch ein Problem.
Jedes mal, wenn ich auf den Button klicke, zeichnet er ihn sozusagen neu auf die Bitmap,
sodass man an dem Rand sehen kann, das die Bitmap "überlappt".
Ich glaube, das kommt von dem, was Martin Richter angesprochen hat.Jedenfalls würde ich mich freuen, wenn da jemand weiter weiss.
-
Hier kurz was ich meine. Hoffe man kann es einigermaßen erkennen.
http://s14.directupload.net/images/140917/7d75k4d2.jpg
Das Bild unten ist nach mehrmaligem klicken.
An den Rändern links-rechts kann man erkennen, das es überlappt.
-
@Martin
Habe gerade ne Antwort von dir in nem anderen Post gelesen.
--->>> http://www.c-plusplus.net/forum/328006Martin Richter schrieb:
Diese Methode hat einen klaren Nachteil, dass Artefakte bleiben, wenn man das Label ändert. Wenn es statisch bleibt ist das OK...
Ich glaube, das genau das bei meinem Problem der Fall ist.
Martin Richter schrieb:
Der "nomale" Weg ist eigentlich, dass dennoch eben der Hintergrund des Parents gezeichnet wird.
Meinst du damit, das vor dem erneuten Zeichnen der Bitmap(in meinem Fall) erst
noch der Hintergrund erneut gezeichnet werden muss, um quasi wieder transparent zu sein?Hoffe du verstehst was ich meine und kannst mir helfen.
-
Naja.
Weg 1: Durch WM_CTLCOLOR... gibt das Parent den korrekten Brush zurück der gezeichnet werden soll im Aufruf von WM_ERASEBKGNBD.
Das ist der korrekte Weg, wenn der Hintergrund mehr oder weniger statisch ist.
Funktioniert auch nicht, wenn das Parent, den Bereich unter dem Control verändert.Weg 2: Das Client fordert das Parent durch WM_EARSEBKGND auf den Hintergrundbereich neu zu zeichnen, dazu setzt man evtl. noch eine Clipping Region....
Grundsätzlich hat man hier das Problem, dass natürlich auch static neu gezeichnet werdenmuss, wenn der Inhalt des Parent darunter sich ändert...
PS: Die Artfakte entstehen, weil durch das Zeichnen des Textes alleine eben der alte Text "transparent übermalt wird" wenn der neu gesetzt wird. Er bleibt eben faktisch auch stehen.
-
Ich sehe gerade Dein Bild: Du willst keine Transparenz! Du willst einen Button, der nicht rechteckig ist....
Such mal nach "non rectangular windows"
Nachtrag: http://www.codeproject.com/Articles/11683/CRoundButton2-A-fancy-graphical-button
-
Danke fürs Antworten.
Zu Weg1
Bei der MSDN steht bei WM_ERASEBKGNBD unter Bemerkung ja folgendesThe DefWindowProc function erases the background by using the class background brush specified by the hbrBackground member of the WNDCLASS structure.
If hbrBackground is NULL, the application should process the WM_ERASEBKGND message and erase the background.
...Jetzt frage ich mich, wann die Funktion den Hintergrund löscht?
Also z.b. bei Veränderung der Größe oder so...?Martin Richter schrieb:
Naja.
Funktioniert auch nicht, wenn das Parent, den Bereich unter dem Control verändert.Das ist in meinem Fall nicht der Fall
Martin Richter schrieb:
PS: Die Artfakte entstehen, weil durch das Zeichnen des Textes alleine eben der alte Text "transparent übermalt wird" wenn der neu gesetzt wird. Er bleibt eben faktisch auch stehen.
Also muss sozusagen der Text erst mit dem Hintergrund "übermalt"(gelöscht) und dann erneut gezeichnet werden, falls ich es richtig verstanden habe.
Oder in meinem Fall halt nicht Text sondern die Bitmap.Martin Richter schrieb:
Ich sehe gerade Dein Bild: Du willst keine Transparenz! Du willst einen Button, der nicht rechteckig ist....
Genau. Im Grunde habe ich es "vom Optischen her" mit AlphaBlend geschafft. Das einzige, was noch zu tun ist, ich muss es irgendwie hinkriegen, das es nicht mehr
als Button gezählt wird, wenn ich in den transparenten Bereich der Bitmap klicke. In dem Fall ja, ich will einen Button, der nicht Rechteckig ist.
Beim Suchen nach "non rectangular windows" fallen einem sofort Regions und der gleichen ins Auge.Jedoch weiss ich nicht genau, wie ich es mit Regions lösen könnte.
Wäre echt super, wenn du mir da noch ein bischen weiter helfen könntest.
-
Siehe mein Link... wenn es nicht um ein nicht rechteckiges Fenster geht...
Dann kannst Du alles andere mit WM_ERASEBKGND vergessen.Ansonsten WM_NCHITTEST HTTRANSPARENT um eine Mauseingabe an das Parent weiterzugeben.