DrawShadowText - Windows ab XP

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

DrawShadowText - Windows ab XP

Beitrag von hjbremer »

hier mal ein Beispiel für die Api-Funktion DrawShadowText

Laut MSDN soll diese Funktion sich wie DrawText verhalten, aber wie immer bei MS ist das nur die halbe Wahrheit. So funktioniert das nur wenn man bei CompilerOptionen den Unicodemodus einschaltet. Kann auch sein, das ich mit meinem mäßigen Englisch mal wieder nur die Hälfte verstehe.

Aber egal, das Beispiel funktioniert bei mir unter XP + PB 4.2

Code: Alles auswählen

;Compileroptionen : Unicode ein !!!!!!!

Prototype DrawShadowText(hDC,pszText,cch,p,flags,crText,crShadow,ixOffset,iyOffset) 

libnr = OpenLibrary(#PB_Any, "ComCtl32.dll") 
If libnr 
 Global DrawShadowText_.DrawShadowText = GetFunction(libnr, "DrawShadowText") 
Else 
 MessageRequester("Fehler!","Kann ComCtl32.dll nicht öffnen !",#MB_ICONERROR) 
 End 
EndIf 

Procedure CreateFont(size)

   fontid = GetStockObject_(#ANSI_VAR_FONT)      ;Systemfont holen
   GetObject_(fontid,SizeOf(LOGFONT),lg.LOGFONT) ;Eigenschaften holen
   lg\lfHeight = size                            ;Größe setzen
   
   ProcedureReturn CreateFontIndirect_(lg)     ;Font create

EndProcedure


  br = 300: hh = 50
  imgnr = CreateImage(#PB_Any, br, hh) 
  
  hDC = StartDrawing(ImageOutput(imgnr)) 
    
    farbe = #White
    Box(0, 0, br, hh, farbe)

    fonthh = 35
    fontid = CreateFont(fonthh)
    DrawingFont(fontid)
    DrawingMode(#PB_2DDrawing_Transparent)
    
    SetTextAlign_(hDC, #TA_LEFT)  ;muß sein
          
    r.rect
    r\left=0 
    r\top=10 
    r\right=br 
    r\bottom=hh
    
    txt$ = "dies ist ein Test"
    lg = Len(txt$)
    
    flags = #DT_CENTER
    
    shadow_x = 4  ;kann auch negative Werte haben
    shadow_y = 3
    
    hoehe = DrawShadowText_(hDC, @txt$, lg, r, flags, #Blue, #Gray, shadow_x, shadow_y) 
      
  StopDrawing() 
  
OpenWindow(0, 0, 0, 400, 300, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0))
  
  ButtonImageGadget(1, 50,50,br,hh,ImageID(imgnr))

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 

End


Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Kannte ich noch nicht. Nice! 8)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Habe nun herausgefunden wie es ohne Unicode aktivieren geht.
So das man diese Funktion auch in einem normalen Programm nutzen kann :D

Entscheidend sind die Zeilen unicodelg + txtBuffer

Code: Alles auswählen

Prototype DrawShadowText(hDC,pszText,cch,p,flags,crText,crShadow,ixOffset,iyOffset) 

libnr = OpenLibrary(#PB_Any, "ComCtl32.dll") 
If libnr 
 Global DrawShadowText_.DrawShadowText = GetFunction(libnr, "DrawShadowText") 
Else 
 MessageRequester("Fehler!","Kann ComCtl32.dll nicht öffnen !",#MB_ICONERROR) 
 End 
EndIf 

Procedure CreateFont(size)

   fontid = GetStockObject_(#ANSI_VAR_FONT)      ;Systemfont holen
   GetObject_(fontid,SizeOf(LOGFONT),lg.LOGFONT) ;Eigenschaften holen
   lg\lfHeight = size                            ;Größe setzen
   
   ProcedureReturn CreateFontIndirect_(lg)     ;Font create

EndProcedure


  br = 300: hh = 50
  imgnr = CreateImage(#PB_Any, br, hh) 
  
  hDC = StartDrawing(ImageOutput(imgnr)) 
    
    farbe = #White
    Box(0, 0, br, hh, farbe)

    fonthh = 35
    fontid = CreateFont(fonthh)
    DrawingFont(fontid)
    DrawingMode(#PB_2DDrawing_Transparent)
    
    SetTextAlign_(hDC, #TA_LEFT)  ;muß sein
          
    r.rect
    r\left=0 
    r\top=10 
    r\right=br 
    r\bottom=hh
    
    txt$ = "dies ist ein Test"
    lg = Len(txt$)
    
    unicodelg = 2 + lg * 2  
    txtBuffer = AllocateMemory(unicodelg) : PokeS(txtBuffer, txt$, -1, #PB_Unicode)    
    
    flags = #DT_CENTER
    
    shadow_x = 4  ;kann auch negative Werte haben
    shadow_y = 3
    
    hoehe = DrawShadowText_(hDC, txtBuffer, lg, r, flags, #Blue, #Gray, shadow_x, shadow_y) 
      
  StopDrawing() 
  
OpenWindow(0, 0, 0, 400, 300, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0))
  
  ButtonImageGadget(1, 50,50,br,hh,ImageID(imgnr))

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 

End

Edit: unicodelg um 1 erhöht
Zuletzt geändert von hjbremer am 18.12.2008 18:26, insgesamt 1-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Oy!
unicodelg = 1 + lg * 2
heapalarm! Bild

... bei Unicode hat auch der Terminator 2 Byte.

du provozierst nen IMA, mach den buffer 1 byte länger.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Beitrag von KatSeiko »

Wenn man den unter Vista und ohne Unicode ausführt, funktioniert das auch - aber der Text wird irgendwas chinesisches... :D
(Wer weiß, vielleicht steht da "Deine Huhn schmecken wie Hund, der letzte Woche von Lastwagen überfahren.")
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

probier mal unter Vista die 2. Version aus, würde mich interressieren ob die ohne Unicode unter Vista funktioniert
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

Beitrag von Burstnibbler »

Danke für den Code ! :allright:
(kann ich sehr gut für meinen Font-Konverter gebrauchen. :D )

Pure Greetz,
Burstnibbler
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

viele vergessen die Pseudotypen ... wofür hat Fred die wohl eingefüht? :shock:

Code: Alles auswählen

Prototype.i DrawShadowText(hDC.i, pszText.p-unicode, cch.l, *p.RECT, flags.l, crText.l, crShadow.l, ixOffset.l, iyOffset.l) 

libnr = OpenLibrary(#PB_Any, "ComCtl32.dll") 
If libnr 
 Global DrawShadowText_.DrawShadowText = GetFunction(libnr, "DrawShadowText") 
Else 
 MessageRequester("Fehler!","Kann ComCtl32.dll nicht öffnen !",#MB_ICONERROR) 
 End 
EndIf 

Procedure CreateFont(size) 

   fontid = GetStockObject_(#ANSI_VAR_FONT)      ;Systemfont holen 
   GetObject_(fontid,SizeOf(LOGFONT),lg.LOGFONT) ;Eigenschaften holen 
   lg\lfHeight = size                            ;Größe setzen 
    
   ProcedureReturn CreateFontIndirect_(lg)     ;Font create 

EndProcedure 


  br = 300: hh = 50 
  imgnr = CreateImage(#PB_Any, br, hh) 
  
  hDC = StartDrawing(ImageOutput(imgnr)) 
    
    farbe = #White 
    Box(0, 0, br, hh, farbe) 

    fonthh = 35 
    fontid = CreateFont(fonthh) 
    DrawingFont(fontid) 
    DrawingMode(#PB_2DDrawing_Transparent) 
    
    SetTextAlign_(hDC, #TA_LEFT)  ;muß sein 
          
    r.RECT 
    r\left=0 
    r\top=10 
    r\right=br 
    r\bottom=hh 
    
    txt$ = "dies ist ein Test" 
    
    flags.l = #DT_CENTER 
    
    shadow_x.l = 4  ;kann auch negative Werte haben 
    shadow_y.l = 3 
    
    hoehe = DrawShadowText_(hDC, txt$, Len(txt$), r, flags, #Blue, #Gray, shadow_x, shadow_y) 
      
  StopDrawing() 
  
OpenWindow(0, 0, 0, 400, 300, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0)) 
  
  ButtonImageGadget(1, 50,50,br,hh,ImageID(imgnr)) 

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 

End
... und fals ich nix vergessen hab sollte das auch auf x64 funktionieren,
das kann ich aber nicht testen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

du sagst es - vergessen ! vor Jahren gelesen, nicht verstanden und vergessen.

aber warum hdc.i für integer und bei cch.l flags.l usw. ein long ? Gibt es einen Grund ?
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
dige
Beiträge: 1245
Registriert: 08.09.2004 08:53

Beitrag von dige »

mit pb4.30 final gibts einen IMA bei

Code: Alles auswählen

hoehe = DrawShadowText_(hdc, txt$, Len(txt$), r, flags, #Blue, #Gray, shadow_x, shadow_y)
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten