Seite 1 von 1

Iconauswahl-Dialog [WinAPI]

Verfasst: 04.03.2011 16:55
von RSBasic
Mit diesem Code kann das Iconauswahl-Fenster geöffnet werden, so dass der Anwender ein bestimmtes Icon aus einer DLL-Datei selber auswählen kann:
Bild

Code: Alles auswählen

;Hinweis: Die Compiler-Einstellung "Unicode-Executable erstellen" muss aktiviert sein!

EnableExplicit

Define IcoLibPath$ = "C:\Windows\System32\shell32.dll"
Define DlgResult
Define hWnd=0
Define DefaultIconID = 5

DlgResult = PickIconDlg_(hWnd,@IcoLibPath$,Len(IcoLibPath$),@DefaultIconID)
If DlgResult=0
  MessageRequester("","Kein Icon ausgewählt.",0)
Else
  MessageRequester("","Icon wurde ausgewählt und kann nun z.B. mit ExtractIcon_() extrahiert werden. Icon-Nummer: "+Str(DefaultIconID),0)
  
EndIf

;PickIconDlg: http://msdn.microsoft.com/en-us/library/bb776481%28v=vs.85%29.aspx

Re: Iconauswahl-Dialog [WinAPI]

Verfasst: 05.03.2011 11:13
von Mr.L
Wenn man den Psudotype "p-unicode" verwendet, braucht man die Compiler-Einstellung nicht zu verändern:

Code: Alles auswählen

EnableExplicit

Define IcoLibPath$ = "C:\Windows\System32\shell32.dll"
Define DlgResult
Define hWnd=0
Define DefaultIconID = 5

If OpenLibrary(0,"Shell32.dll")
	Prototype.l PickIconDlg(hwnd,pszIconPath.p-unicode,cchIconPath,piIconIndex)
	Define PickIconDlg.PickIconDlg = GetFunction(0,"PickIconDlg")	
	
	DlgResult = PickIconDlg(hWnd,IcoLibPath$,Len(IcoLibPath$),@DefaultIconID)
	If DlgResult = 0
	  MessageRequester("","Kein Icon ausgewählt.",0)
	Else
	  MessageRequester("","Icon wurde ausgewählt und kann nun z.B. mit ExtractIcon_() extrahiert werden. Icon-Nummer: "+Str(DefaultIconID),0)
	 
	EndIf
	
	;PickIconDlg: http://msdn.microsoft.com/en-us/library/bb776481%28v=vs.85%29.aspx
EndIf

Re: Iconauswahl-Dialog [WinAPI]

Verfasst: 05.03.2011 13:26
von RSBasic
@Mr.L
Vielen Dank für das Anpassen :allright:

Re: Iconauswahl-Dialog [WinAPI]

Verfasst: 05.03.2011 16:16
von hjbremer
Das mit Prototype macht aber nur dann Sinn wenn man den Namen der Datei weiß.

Wenn nicht, dann Nullstring übergeben und Path ausgeben lassen. Vor allem, wenn man dann doch eine andere Datei im Dialog auswählt.
Wer sicher gehen will kann auch #MAX_PATH * 2 nehmen, bin mir nicht sicher ob das sein muß. Bei mir zumindest nicht.

Code: Alles auswählen

EnableExplicit

Define IcoLibPath.s{#MAX_PATH} = ""
Define IconID 

If PickIconDlg_(0, @IcoLibPath, #MAX_PATH, @IconID)
   Debug PeekS(@IcoLibPath,-1,#PB_Unicode)  
   MessageRequester("","Icon wurde ausgewählt und kann nun z.B. mit ExtractIcon_() extrahiert werden. Icon-Nummer: "+Str(IconID),0)
EndIf

Re: Iconauswahl-Dialog [WinAPI]

Verfasst: 26.10.2013 05:46
von chi
Ascii/Unicode Executables, Mit oder Ohne Pfad...

Code: Alles auswählen

EnableExplicit

#MaxPath = 1024

Procedure.s ExpandEnvironmentStrings(string$)
  Protected size = ExpandEnvironmentStrings_(string$, "", 0)
  Protected ret$ = Space(size)
  ExpandEnvironmentStrings_(string$, ret$, #MaxPath)
  ProcedureReturn ret$
EndProcedure

Define IconPath.s{#MaxPath}
Define IconId = 0

PokeS(@IconPath, ExpandEnvironmentStrings("%windir%\explorer.exe"), -1, #PB_Unicode)
;PokeS(@IconPath, "C:\Windows\System32\shell32.dll", -1, #PB_Unicode)
;PokeS(@IconPath, "", -1, #PB_Unicode)

If PickIconDlg_(0, @IconPath, #MaxPath, @IconID)
  Debug "Icon: " + Str(IconId)
  Debug "Path: " + ExpandEnvironmentStrings(PeekS(@IconPath, -1, #PB_Unicode))
EndIf