Start Menu requester
Posted: Sun Oct 17, 2010 1:10 pm
I wanted something a little fancier than your run of the mill input requester so I put this together:
It makes used of the CreateAlignedStringGadget function I've posted as well:
http://www.purebasic.fr/english/viewtop ... 30#p336730

It makes used of the CreateAlignedStringGadget function I've posted as well:
http://www.purebasic.fr/english/viewtop ... 30#p336730



Code: Select all
Procedure.s StartMenuRequester(Value.s, hParent=0)
Protected NonClientMetrics.NONCLIENTMETRICS
Protected *GrpIconDir.GRPICONDIR
Protected Flags
Protected WindowID
Protected StringGadget
Protected ButtonOk
Protected ButtonCancel
Protected hFont
Protected hLib
Protected LibID
Protected *IconImage.ICONIMAGE
Protected IconID
Protected ImageIcon
Protected InvalidChars.s
Protected Event
Protected FolderName.s
Protected IsInvalid
Protected i
Protected n
Protected lPEB.i
Protected lOSMa.i
Protected lOSMi.i
Protected lOSPlat.i
Protected OSVersion
Protected BitCount
Protected IsThemeActive
Static hIcon
Static Ptr
Flags=#PB_Window_WindowCentered
If Not IsWindow_(hParent)
Flags=#PB_Window_ScreenCentered
EndIf
WindowID=OpenWindow(#PB_Any,0,0,246,83,"Specify Start Menu Folder",Flags|#PB_Window_TitleBar,hParent)
If Not WindowID
ProcedureReturn ""
EndIf
StringGadget=CreateAlignedStringGadget(#PB_Any,56,13,178,22,Value.s)
ButtonOk=ButtonGadget(#PB_Any,78,48,75,23,"OK")
ButtonCancel=ButtonGadget(#PB_Any,159,48,75,23,"Cancel")
;/ Get the default system message window font
NonClientMetrics\cbSize=SizeOf(NONCLIENTMETRICS)
SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,SizeOf(NONCLIENTMETRICS),@NonClientMetrics,0)
hFont=CreateFontIndirect_(@NonClientMetrics\lfMessageFont)
SetGadgetFont(ButtonOk,hFont)
SetGadgetFont(ButtonCancel,hFont)
If Not StringGadget Or Not ButtonOk Or Not ButtonCancel
ProcedureReturn ""
EndIf
If Not hIcon And Not *GrpIconDir
hLib=LoadLibraryEx_("shell32.dll",0,#LOAD_LIBRARY_AS_DATAFILE)
*GrpIconDir=LoadResource_(hLib,FindResource_(hLib,40,#RT_GROUP_ICON))
EndIf
;/ Get the OS version
lPEB=PeekI(NtCurrentTeb_()+$30)
lOSMa=PeekI(lPEB+$A4)
lOSMi=PeekI(lPEB+$A8)
lOSPlat=PeekI(lPEB+$B0)
OSVersion=Val(Str(lOSPlat)+Str(lOSMa)+Str(lOSMi))
;/ Is XP/Vista themes active?
If Not Ptr
LibID=OpenLibrary(#PB_Any,"uxtheme.dll")
Ptr=GetFunction(LibID,"IsThemeActive")
EndIf
If Ptr
IsThemeActive=CallFunctionFast(Ptr)
EndIf
;/ If the OS is less than vista and the user is not using the XP theme then use the old
;/ style start menu icon
If OSVersion<260 And Not IsThemeActive
BitCount=4
Else
BitCount=32
EndIf
If *GrpIconDir
For i=0 To *GrpIconDir\idCount
If *GrpIconDir\idEntries[i]\wBitCount=BitCount And *GrpIconDir\idEntries[i]\bHeight=32
IconID=*GrpIconDir\idEntries[i]\nID
Break
EndIf
Next i
*IconImage=LoadResource_(hLib,FindResource_(hLib,IconID,#RT_ICON))
If *IconImage
hIcon=CreateIconFromResource_(*IconImage,*IconImage\icHeader\biBitCount,1,$00030000)
EndIf
EndIf
If hLib
FreeLibrary_(hLib)
EndIf
If hIcon
ImageIcon=ImageGadget(#PB_Any,13,13,32,32,hIcon)
EndIf
InvalidChars.s="\/:*?<>|"+#DQUOTE$
Repeat
Event=WaitWindowEvent(1)
FolderName.s=GetGadgetText(StringGadget)
;/ Validate folder characters
IsInvalid=#False
For i=1 To Len(FolderName.s)
For n=1 To Len(InvalidChars.s)
If Mid(FolderName.s,i,1)=Mid(InvalidChars.s,n,1)
IsInvalid=#True
EndIf
Next n
Next i
If Not Trim(FolderName.s) Or IsInvalid
DisableGadget(ButtonOk,#True)
Else
DisableGadget(ButtonOk,#False)
EndIf
If Event=#PB_Event_Gadget
Select EventGadget()
Case ButtonOk
Break
Case ButtonCancel
FolderName.s=""
Break
EndSelect
EndIf
ForEver
FreeAlignedStringGadget(StringGadget)
FreeGadget(ButtonOk)
FreeGadget(ButtonCancel)
If IsGadget(ImageIcon)
FreeGadget(ImageIcon)
EndIf
CloseWindow(WindowID)
ProcedureReturn Trim(FolderName.s)
EndProcedure