Seite 1 von 1

Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Di, 15. Aug 2017 4:58
von AUGE_OHR
hi,

beim Windows Ownerdraw/Customdraw habe ich keinen Pressspace oPS (Object) sondern ein hDC (Device Context)
ich brauche also eine API Function für ein hDC und nicht für o:gethWnd()

ich benutze die DrawText API Function zur Anzeige von Text.
https://msdn.microsoft.com/en-us/librar ... s.85).aspx

das Icon hole ich mir direkt aus der Imagelist zu Anzeige mit ImageList_DrawEx().
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

als Hintergrund zeige ich nun besagtest Bitmap an ... welche runde Ecken (transparent) bekommen soll.

nun dachte ich das es die DrawEdge API Function machen würde ... aber das kann man nur paar Konstanten angeben.
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

da es ein hDC ist kann ich nicht eine "Region" API Function verwenden um das zu "maskieren". oder :?:
wer hat noch eine Idee :idea:

Nachtrag : mit @GDI32:SetPixel(nHDC.aPos[1],aPos[2]) die Pixel in den Ecken gesetzt.

Re: Bitmap Ecken runden mit Transparenz

Verfasst: Di, 15. Aug 2017 15:21
von mikehoffmann
Charles Petzold, Programming Windows 5th. Edition, Chapter 14.
Bleibt aber noch das Problem, dass das Fensterlein unter Deinem den unbepinselten Platz befüllen muss (oder Du Dich speziell darum kümmerst).
Außerdem hege ich grundsätzliche Zweifel daran, dass Deine Mischung xb/win32 fehlerfrei funktioniert, weil Du Dich wahrscheinlich nicht an die korrekten Paint-Verfahren hältst.
Michael

Re: Bitmap Ecken runden mit Transparenz

Verfasst: Di, 15. Aug 2017 16:25
von HaPe
Hallo Jimmy !

Vielleicht hilft dir das etwas: http://news2news.com/vfp/?example=126 bzw. http://news2news.com/vfp/?example=143
Das letzte sieht bei mir so aus:
Bild

Re: Bitmap Ecken runden mit Transparenz

Verfasst: Di, 15. Aug 2017 17:38
von AUGE_OHR
hi,

Danke für eure Antworten.

@Hape : die Links gehen in Richtung "Form" ( XbpDialog ) was ein "Top-Window" ist und mit o:gethWnd() arbeitet.
ich möchte aber ein "Teil" in einem Fenster "malen" wobei ich eine hDC statt PressSpace habe.

@Mike : warum behauptest du immer wieder das ich nicht "sauber" mit der API umgehe ... :boxing:
klar habe ich wie jeder Newbie Problem mit "neuen" Sachen egal ob Xbase oder Windows API aber man lernt ja dazu.

überhaupt geht es um die Idee z.b. das iTaskList Interface vom Progressbar. das hat zwar gedauert aber nun funktioniert es. so nun auch die Idee mit Listview und (echten) Customdraw weil bei LVS_ICON (echtes) Ownerdraw nicht funktioniert.

nun gehört visual Style dazu aber im LVS_ICON Modus "wirkt" er nicht wie im LVS_REPORT Style ... "Focus" ist nicht transparent. wie der visual Style aussehen soll kennt jeder vom Windows 7 Desktop. und so sieht mein Code aus

Code: Alles auswählen

   nhDC   := @user32:GetWindowDC(::hLv)
   // Memory DC anfordern
   hMemDC := @Gdi32:CreateCompatibleDC(nhDC)

   // Platz für Text berechnen
   @UxTheme:GetThemeTextExtent(::hTheme  ,;
                               hMemDC    ,;
                               iPartId   ,;
                               iStateId  ,;
                               Str2Unicode(cName),;
                               -1        ,;
                               nOr(DT_CENTER, DT_BOTTOM,DT_WORDBREAK,DT_WORD_ELLIPSIS),;
                               aRect2    ,;
                               rcText     )
     
   // Memory Bitmap erstellen
   hMemBM := @Gdi32:CreateCompatibleBitmap (hMemDC, aSize[1], aSize[2] )
   oldBmp := @Gdi32:SelectObject(hMemDC, hMemBM)

   // alles im Memory 
   nRet := @UxTheme:IsThemeBackgroundPartiallyTransparent(::hTheme, iPartId, iStateId)
   IF .NOT. EMPTY(nRet)
      nRet := @UxTheme:DrawThemeParentBackground(::hLv,hMemDC, aRect2)
   ENDIF

   IF nRet = S_OK
      nRet := @UxTheme:DrawThemeBackground( ::hTheme  ,;
                                            hMemDC    ,;
                                            iPartId   ,;
                                            iStateId  ,;
                                            aRect2    ,;
                                            rcText )
   ENDIF

   ...   

   // AlphaBlend in den "echten" Customdraw DC
   //
   nRet := @Msimg32:AlphaBlend(;
                    pDC, aRect2[1], aRect2[2], aSize[1], aSize[2],;
                    hMemDC, 0, 0, aSize[1], aSize[2], nblend )
Win7 mit runden Ecken
Win7 mit runden Ecken
Paperbin_Win7.jpg (3.79 KiB) 9394 mal betrachtet
mein visual Style ohne runde Ecken
mein visual Style ohne runde Ecken
Paperbin_Customdraw.jpg (3.04 KiB) 9394 mal betrachtet
ich nehme also den Visual Style als Bitmap. was mir noch fehlt sind "nur" noch die "runden" Ecken.

p.s. unter Windows 10 ist es wieder obsolet denn da sind es normale Ecken und fast keine transparenz ( nur Rahmen )

Re: Bitmap Ecken runden mit Transparenz

Verfasst: Mi, 16. Aug 2017 12:42
von mikehoffmann
-- snip ---
warum behauptest du immer wieder das ich nicht "sauber" mit der API umgehe
--- snap ---

So etwas würde ich nie so einfach behaupten. Ich habe sogar geschrieben, wo ich die Probleme sehe.

Viele Grüße
Michael

Re: Bitmap Ecken runden mit Transparenz

Verfasst: Mi, 16. Aug 2017 19:16
von AUGE_OHR
mikehoffmann hat geschrieben: Di, 15. Aug 2017 15:21 Außerdem hege ich grundsätzliche Zweifel daran, dass Deine Mischung xb/win32 fehlerfrei funktioniert, weil Du Dich wahrscheinlich nicht an die korrekten Paint-Verfahren hältst.
ich bin mir sehr wohl bewusst wie (echtes) Ownerdraw und (echtes) Customdraw funktioniert
ich sehe nicht das die NMLVCUSTOMDRAW in Cockpit definiert ist ... nur NMCUSTOMDRAW

die Frage ist also ob du weisst welches Paint Verhalten hier gefragt ist ?

---

ich habe keine grundsätzlichen Problem mit ot4xb oder Windows API
... wenn frage ich Pablo und nicht hier im Forum

wenn ich ein Problem habe dann mit Xbase++ da es "anders" ist als Windows es fordert.

ich habe als letztes an AlphaBlend() gearbeitet. die Structure BLENDFUNCTION sieht so aus
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Code: Alles auswählen

typedef struct _BLENDFUNCTION {
  BYTE BlendOp;
  BYTE BlendFlags;
  BYTE SourceConstantAlpha;
  BYTE AlphaFormat;
} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
wenn man die nun mit Xbase++ "Werten" auffüllt kommt bei Alphablend() Mist raus.

Frage : wer weiss warum :?:

p.s. "ich" habe die Lösung. es soll nur verdeutlichen welche Problem Xbase++ User haben.

p.s.p.s. habe das Problem mit @GDI32:SetPixel() gelöst

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Do, 17. Aug 2017 14:54
von mikehoffmann
Du verwendest die Ownerdraw-Notifications eines Listview Controls an das Parentwindow dieses Listviews um einen halbdurchsichtigem Mülleimer mit runden Ecken zu malen? Einfacher geht es wirklich nicht.

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Do, 17. Aug 2017 18:49
von AUGE_OHR
mikehoffmann hat geschrieben: Do, 17. Aug 2017 14:54 Du verwendest die Ownerdraw-Notifications ...
Nein, Ownerdraw functioniert nicht mit LVS_ICON ... ich benutzte Customdraw.

aber das ist egal denn es geht NICHT um das Paint Verhalten sondern um die runden Ecken wo ich machbaren keinen Vorschlag erhalten habe. ich habe nun mit @GDI32:SetPixel() je 3 Pixel in die Ecken gesetzt und bis damit zufrieden.

p.s. es geht hier im Forum um Lösungen und nicht um Belehrungen, Danke

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Do, 17. Aug 2017 20:54
von Jan
AUGE_OHR hat geschrieben: Do, 17. Aug 2017 18:49p.s. es geht hier im Forum um Lösungen und nicht um Belehrungen, Danke
Das seh ich aber etwas anders.

Jan

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Fr, 18. Aug 2017 11:11
von mikehoffmann
Hallo Jimmy,
bitte lies nochmal meine erste Antwort. Wo belehre ich da? Ich schreibe Dir ganz genau, wie Du die Lösung für Dein Problem findest und worauf Du dann noch achten mußt. Außerdem äußere ich Bedenken, dass Du die richtigen Verfahren anwendest. Bitte besorg Dir das Buch von Chales Petzold und arbeite es durch. Das gibt's bei Ebay für einen Apple und ein I. Dann weisst Du genau, welche Begriffe wichtig sind, was sie genau bedeuten und wofür man sie fälschlicherweise verwendet, weil Mr Mc Microsoft Mc Bean es so vorgibt. Vielleicht verstehe danach sogar ich trotz hohen Alters, was Du schreibst, wenn Du über Deine API-Erfahrungen und Erkenntnisse berichtest. Und vielleicht verstehst Du auch, was ich so schreibe und findest nicht mehr alles zu kompliziert. Das Windows API und GUI ist ein Scheinriese. Wenn man genau hinsieht, wird alles ganz einfach. Aber dieses Genau-Hingucken dauert Zeit und das kann einem keiner abnehmen. Alles andere is Fake News.
Liebe Grüße
Michael

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Fr, 18. Aug 2017 13:00
von Manfred
ach, Jimmy hat bestimmt wieder ein paar Nächte hintereinander durchgearbeitet und ist jetzt ein wenig gestresst... :lol:

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Sa, 19. Aug 2017 19:45
von AUGE_OHR
hi,
mikehoffmann hat geschrieben: Fr, 18. Aug 2017 11:11 ... das Buch von Chales Petzold
Ich habe das Buch seit 9 Jahren sowie andere Bücher die ich in den letzten Jahren durchgearbeitet habe.
ich habe ein konkrete Frage gestellt aber keine direkte Antwort (Link, Code etc.) bekommen.

also wenn du an dem Code den ich veröffentlicht habe was zu meckern hast bitte ich um Klarstellung.

es wird von dir der Eindruck erweckt das alles doch so schwierig sei und nur wenige Leute was davon verstehen.
es ist wie einige von Alaska die sich ebenfalls so darstellen als wenn die etwas besseres wären als die (dummen) User.

jeder User hat mal als Newbie angefangen und auch Profis machen jeden Tag Fehler.

ich bin kein C Profi und ich will es auch nicht werden ... obwohl meine harbour Apps würde ich gerne "selbst" erweitern.
klar ist es für einen C Profi sicherlich nicht so schwer eine API Function wie Alphablend() zu nutzen ...

aber wie kann das ein Xbase++ User ... oder sieht keiner das "Problem" ?

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Sa, 19. Aug 2017 21:24
von brandelh
Welches Problem meinst du denn. Dass wir keinen Byte Datentyp haben, oder das der gui thread neben Main abläuft ?
Pablo hat für beides Lösung. 4 Byte in eine long in oder 4 Zeichen string unterbringen ist auch alt ... BAB.
Oder ein anderes Problem?
Ich hab keine Lust auf Rätselraten und die meisten wollen sich um sowas auch nicht kümmerk müssen.

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Verfasst: Mo, 21. Aug 2017 4:24
von AUGE_OHR
brandelh hat geschrieben: Sa, 19. Aug 2017 21:24 Dass wir keinen Byte Datentyp haben
YUP
brandelh hat geschrieben:Pablo hat für beides Lösung. 4 Byte in eine long in oder 4 Zeichen string unterbringen ist auch alt ... BAB.
kann das Newsforum z.Z. nicht erreichen und nach der Lösung fragen den die "eingebaute" BLENDFUNCTION Structure in ot4xb funktioniert "so" nicht"

Code: Alles auswählen

               blend    := BLENDFUNCTION():New()
               blend:BlendOp     := AC_SRC_OVER   // 0
               blend:BlendFlags  := 0
               blend:SourceConstantAlpha := 127
               blend:AlphaFormat := 0
brandelh hat geschrieben:Ich hab keine Lust auf Rätselraten und die meisten wollen sich um sowas auch nicht kümmerk müssen.
habe einen extra Thread fpr die Alphablend() API Function aufgemacht.
https://xbaseforum.de/viewtopic.php?f=27&t=9923