GELÖSCHT

Anfängerfragen zum Programmieren mit PureBasic.
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Zuletzt geändert von mirca am 17.10.2013 11:06, insgesamt 1-mal geändert.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: HyperLinkGadget - Keine fixe Breite?

Beitrag von rolaf »

Ich würde sagen den gleichen Text mit gleichem Font mit TextWidth() aus den 2DDrawing-Funktionen ausmessen.
Ne Krücke, temporär über nen Image, ich weis, müßte aber gehen.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: HyperLinkGadget - Keine fixe Breite?

Beitrag von RSBasic »

Alternativ wäre es, ein SysLink-API-Control zu verwenden:

Code: Alles auswählen

;Autor: nico
;Nur mit XP-Skin

EnableExplicit

Define EventID
Define LinkHTML$="<a href="+Chr(34)+"http://www.purebasic.fr/german/index.php"+Chr(34)+">PureBoard</a>"
Define SysLinkHandle

#MAX_LINKID_TEXT=48
#L_MAX_URL_LENGTH=2083

Structure LITEM
  mask.l
  iLink.l
  state.l
  stateMask.l
  szID.w[#MAX_LINKID_TEXT]
  szUrl.w[#L_MAX_URL_LENGTH]
EndStructure

Structure NMLINK
  hdr.NMHDR
  item.LITEM
EndStructure

Procedure.s Uni2Ansi(*Unicode.l)
  Protected size.l
  Protected ansi.s
  
  size.l = WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, #Null, #Null, #Null, #Null)
  ansi.s=Space(size)
  WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, @ansi, size, #Null, #Null)
  
  ProcedureReturn ansi 
EndProcedure

Procedure WindowCallback(hwnd,msg,wparam,lparam)
  Protected result
  Protected *nmhdr.NMHDR
  Protected *LINK.NMLINK
  Protected *pointeur
  Protected chaine.s
  
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
       *nmhdr.NMHDR=lParam
       Select *nmhdr\code
        Case #NM_CLICK
          *LINK.NMLINK = lParam

          *pointeur=AllocateMemory(100)
         
          CopyMemory(@*LINK\item\szUrl[0],*pointeur,100)
          chaine=Uni2Ansi(*pointeur)
          Debug chaine
          
          FreeMemory(*pointeur)
         
      EndSelect
  EndSelect
  
  ProcedureReturn result
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SysLinkHandle = CreateWindowEx_(0, "SysLink", LinkHTML$, #WS_CHILD | #WS_VISIBLE, 10, 10, 100, 20, WindowID(0), 2, 0, 0)
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: HyperLinkGadget - Keine fixe Breite?

Beitrag von ts-soft »

Die von RSBasic gepostete Alternative, geändert, so das wirklich Unicode und ASCII funktionieren :wink:
Außerdem wurde dabei gleich dieser seit ewigen Zeiten unnötige Uni2Ascii Quatsch entfernt.

Code: Alles auswählen

;Autor: nico
;Nur mit XP-Skin

EnableExplicit

Define EventID
Define LinkHTML$="<a href=" + Chr(34) + "http://www.purebasic.fr/german/index.php" + Chr(34) + ">PureBoard</a>"
Define SysLinkHandle

#MAX_LINKID_TEXT = 48
#L_MAX_URL_LENGTH = 2083

Structure LITEM
  mask.l
  iLink.l
  state.l
  stateMask.l
  szID.w[#MAX_LINKID_TEXT]
  szUrl.w[#L_MAX_URL_LENGTH]
EndStructure

Structure NMLINK
  hdr.NMHDR
  item.LITEM
EndStructure

Procedure WindowCallback(hwnd, msg, wparam, lparam)
  Protected result
  Protected *nmhdr.NMHDR
  Protected *LINK.NMLINK
 
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
       *nmhdr.NMHDR = lParam
       Select *nmhdr\code
        Case #NM_CLICK
          *LINK.NMLINK = lParam
          Debug PeekS(@*LINK\item\szUrl[0], -1, #PB_Unicode)
       
      EndSelect
  EndSelect
 
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SysLinkHandle = CreateWindowEx_(0, "SysLink", LinkHTML$, #WS_CHILD | #WS_VISIBLE, 10, 10, 100, 20, WindowID(0), 2, 0, 0)
 
  SetWindowCallback(@WindowCallback())
 
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf 
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: HyperLinkGadget - Keine fixe Breite?

Beitrag von RSBasic »

Danke Thomas für die Anpassung. ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Antworten