Must AutoIt
Сообщения: 3054
Благодарности: 1009
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
amel27,
Спасибо огромное!
Получилось и то и другое:
Код: 
$hWnd = WinGetHandle("")
$sFilter = "Text File (*.txt)|*.txt|AutoIt v3 Script (*.au3)|*.au3|All (*.*)|*.*"
$Ret = _FileSaveDialog("Save as", "C:\", $sFilter, 18, "New Script", 2, $hWnd)
If Not @error Then MsgBox(64, "Results", StringFormat("Saved as: %s\n\nSelected Filter Index: %d", $Ret, @extended))
Func _FileSaveDialog($sTitle, $sInitDir, $sFilter='All (*.*)', $iOpt=0, $sDefFile='', $iDefFilter=1, $hWnd=0)
Local $iFileLen = 65536 ; Max chars in returned string
; API flags prepare
Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))
; Filter string to array convertion
Local $asFLines = StringSplit($sFilter, '|')
Local $i, $suFilter = ''
For $i = 1 To $asFLines[0] Step 2
If $i < UBound($asFLines) Then _
$suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i+1]) + 1 & '];'
Next
; Create API structures
Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
Local $usFilter = DllStructCreate($suFilter & 'byte')
Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
Local $usExtn = DllStructCreate('char[1]')
For $i = 1 To $asFLines[0]
DllStructSetData($usFilter, $i, $asFLines[$i])
Next
; Set Data of API structures
DllStructSetData($usTitle, 1, $sTitle)
DllStructSetData($usInitDir, 1, $sInitDir)
DllStructSetData($usFile, 1, $sDefFile)
DllStructSetData($usExtn, 1, "")
DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
DllStructSetData($uOFN, 2, $hWnd)
DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
DllStructSetData($uOFN, 7, $iDefFilter)
DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
DllStructSetData($uOFN, 9, $iFileLen)
DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
DllStructSetData($uOFN, 14, $iFlag)
DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))
; Call API function
Local $aRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))
If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(1, 0, "")
;Return Results
Local $sRet = StringStripWS(DllStructGetData($usFile, 1), 3)
Return SetExtended(DllStructGetData($uOFN, 7), $sRet) ;@extended is the 1-based index of selected filer
EndFunc
Я убрал параметр $sDefaultExt, в функции он установлен как пустое значение, чтобы если не присвоено расширение, подставлялось именно то, которое указано в выбранном фильтре.
Вместо этого параметра добавлен параметр $iDefFilter, указывает умолчальный фильтр (по индексу).
|