Seite 1 von 1

DrawShadowText - Windows ab XP

Verfasst: 17.12.2008 16:34
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



Verfasst: 17.12.2008 20:16
von Fluid Byte
Kannte ich noch nicht. Nice! 8)

Verfasst: 18.12.2008 01:17
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

Verfasst: 18.12.2008 01:22
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.

Verfasst: 18.12.2008 16:18
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.")

Verfasst: 18.12.2008 18:29
von hjbremer
probier mal unter Vista die 2. Version aus, würde mich interressieren ob die ohne Unicode unter Vista funktioniert

Verfasst: 18.12.2008 19:28
von Burstnibbler
Danke für den Code ! :allright:
(kann ich sehr gut für meinen Font-Konverter gebrauchen. :D )

Pure Greetz,
Burstnibbler

Verfasst: 18.12.2008 19:57
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

Verfasst: 18.12.2008 23:47
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 ?

Verfasst: 19.12.2008 16:37
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)