Seite 1 von 1

Prototype oder Import, was ist besser bzw. richtig

Verfasst: 03.01.2013 22:41
von hjbremer
Da ich bisher meine Programme ohne Unicode Unterstützung geschrieben habe und ich für ein großes Programm Vista Funktionen nachträglich einbauen will, habe ich mir die Unicode Stringumwandlung für SendMessage_() zu vereinfachen versucht. Zwecks dessen habe ich SendMessage_() importiert.

Nun habe ich 2 Möglichkeiten gefunden, im Code als Version1 bzw. 2 gekennzeichnet

Frage: welche ist besser bzw. korrekter

Frage 2: Und wie ändert man den Font von so einem Command Button

Code: Alles auswählen

;PB  4.4, 4.6, 5.1 Windows Vista 32Bit x86 
;mit/ohne Unicode Option beim Compilieren
;XP Skin Option einschalten !!!

Enumeration
   #window   
   #button1
   #button2
   #liste1
EndEnumeration

;Version 1
Prototype P_BCM_SETNOTE(hwnd, msg, wparam, text.p-unicode)

OpenLibrary(0, "User32.dll")  
Global BCM_SETNOTE.P_BCM_SETNOTE = GetFunction(0, "SendMessageA")
CloseLibrary(0)

Macro ButtonGadgetSetNote(nr, text)      
   BCM_SETNOTE(GadgetID(nr), #BCM_SETNOTE, 0, text)
EndMacro

;Version 2
Import "User32.lib"
   SendMessageA_BCM_SETNOTE(hwnd, msg, wparam, text.p-unicode) As "_SendMessageA@16"
EndImport

Macro ButtonGadgetSetNote2(nr, text)      
   SendMessageA_BCM_SETNOTE(GadgetID(nr), #BCM_SETNOTE, 0, text)
EndMacro

;LV
Import "UxTheme.lib"
   SetWindowTheme(hwnd, AppName.p-unicode, IdList)
EndImport

#BCM_SETNOTE = $00001609
#BS_COMMANDLINK  = $0000000E
#BS_DEFCOMMANDLINK = $000000F

OpenWindow(#window, 150, 100, 600, 300, "")

ButtonGadget(#button1, 20, 20, 211, 50, "#BS_COMMANDLINK", #BS_COMMANDLINK)
ButtonGadgetSetNote(#Button1, "mehr Bla")

ButtonGadget(#button2, 20, 90, 241, 55, "#BS_DEFCOMMANDLINK", #BS_DEFCOMMANDLINK)
ButtonGadgetSetNote2(#Button2, "noch mehr Bla")

flags = #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection ;|#PB_ListIcon_GridLines
ListIconGadget(#liste1, 280, 20, 280, 260, "0", 40, flags)
SetGadgetColor(#liste1, #PB_Gadget_BackColor, $A9F3c8)

SetWindowTheme(GadgetID(#liste1), "Explorer", 0)

For j = 1 To 3
   AddGadgetColumn(#liste1, j, Str(j), 80)
Next   
For j = 0 To 27      
   AddGadgetItem(#liste1, -1, Str(j)+#LF$+"Hans"+#LF$+"Meier"+#LF$+Str(Random(999)))              
Next 

Repeat: event = WaitWindowEvent()                 
Until event = #PB_Event_CloseWindow 
PS: Weiß jemand was man gegen die dicken senkrechten Linien machen kann, bei eingeschaltetem Style

Re: Prototype oder Import, was ist besser bzw. richtig

Verfasst: 04.01.2013 01:11
von STARGÅTE
Mich wunder es das Variante Funktionieren soll, denn wenn du die Library sofort wieder schließt, kannst du ja nicht mehr auf die Funktion zugreifen.

OpenLibrary/CloseLibrary öffnet die Ressourcen extern und der Zugriff ist auch extern.
Bei Import wird die Funktion direkt in die EXE mit einkompiliert.
Das sind also zwei völlig unterschiedliche Sachen, wo du entscheiden musst, was du eigentlich ahben willst.

Re: Prototype oder Import, was ist besser bzw. richtig

Verfasst: 04.01.2013 10:17
von ts-soft
Import oder OpenLibrary ist eigentlich leicht zu beantworten.
Immer, wenn sichergestellt ist, das die Function beim start der Exe zur Verfügung steht,
ist bei den meisten APIs gegeben, aber z.B. UxTheme.dll wird auf Win9x nicht existieren,
ist der Import vorzuziehen.

Ist dies nicht sichergestellt, sollte man OpenLibrary verwenden um Fehlermeldung vom OS und
nicht starten der Exe zu vermeiden. Nur bei OpenLibrary kann man auf den Fehler reagieren.

@STARGÅTE
Die User32.dll, genauso wie die Kernel32.dll werden von PB sowieso immer geladen. Er setzt durch
CloseLibrary() dieser DLLs lediglich den Referenzzähler um eins herunter. Sollte man aber besser
nicht so machen :wink:

Gruß
Thomas

Re: Prototype oder Import, was ist besser bzw. richtig

Verfasst: 04.01.2013 11:33
von hjbremer
Vielen Dank für die Antworten, werde also Import benutzen :allright: