Iconauswahl-Dialog [WinAPI]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Iconauswahl-Dialog [WinAPI]

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: Iconauswahl-Dialog [WinAPI]

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Iconauswahl-Dialog [WinAPI]

Beitrag von RSBasic »

@Mr.L
Vielen Dank für das Anpassen :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Iconauswahl-Dialog [WinAPI]

Beitrag 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
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
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Austria

Re: Iconauswahl-Dialog [WinAPI]

Beitrag 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
Antworten