Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Bitmap Ecken runden mit Transparenz [erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von AUGE_OHR » Di, 15. Aug 2017 4:58

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.
Zuletzt geändert von AUGE_OHR am Mi, 16. Aug 2017 19:18, insgesamt 1-mal geändert.
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Bitmap Ecken runden mit Transparenz

Beitrag von mikehoffmann » Di, 15. Aug 2017 15:21

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

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 277
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Bitmap Ecken runden mit Transparenz

Beitrag von HaPe » Di, 15. Aug 2017 16:25

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
Dateianhänge
roundform.png
roundform.png (20.6 KiB) 613 mal betrachtet
--
Hans-Peter

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap Ecken runden mit Transparenz

Beitrag von AUGE_OHR » Di, 15. Aug 2017 17:38

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 )
Paperbin_Win7.jpg
Win7 mit runden Ecken
Paperbin_Win7.jpg (3.79 KiB) 607 mal betrachtet
Paperbin_Customdraw.jpg
mein visual Style ohne runde Ecken
Paperbin_Customdraw.jpg (3.04 KiB) 607 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 )
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Bitmap Ecken runden mit Transparenz

Beitrag von mikehoffmann » Mi, 16. Aug 2017 12:42

-- 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

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap Ecken runden mit Transparenz

Beitrag von AUGE_OHR » Mi, 16. Aug 2017 19:16

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
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von mikehoffmann » Do, 17. Aug 2017 14:54

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.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von AUGE_OHR » Do, 17. Aug 2017 18:49

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
gruss by OHR
Jimmy

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12549
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von Jan » Do, 17. Aug 2017 20:54

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von mikehoffmann » Fr, 18. Aug 2017 11:11

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

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 17156
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von Manfred » Fr, 18. Aug 2017 13:00

ach, Jimmy hat bestimmt wieder ein paar Nächte hintereinander durchgearbeitet und ist jetzt ein wenig gestresst... :lol:
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von AUGE_OHR » Sa, 19. Aug 2017 19:45

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" ?
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13903
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von brandelh » Sa, 19. Aug 2017 21:24

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.
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10733
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap Ecken runden mit Transparenz [erledigt]

Beitrag von AUGE_OHR » Mo, 21. Aug 2017 4:24

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
gruss by OHR
Jimmy

Antworten