Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: asdfzxcv
Дата сообщения: 22.07.2008 08:47
Maza Faka - просто ахрененно круто работает галочка в трее!!! ))
даже слов нет

Программа готова!

ps а скажи зачем побитовое сложение делается BitAND(TrayItemGetState($auto), $TRAY_CHECKED) ?
а обычно тут не прокатило был ?
Автор: sproxy
Дата сообщения: 22.07.2008 08:53
Maza Faka:
1)
Цитата:
старайся не использовать функции из Array.au3 UDF

я люблю использовать _ArrayAdd, вот эта функция из Array.au3:


Цитата:
Func _ArrayAdd(ByRef $avArray, $vValue)
    If Not IsArray($avArray) Then Return SetError(1, 0, -1)

    Local $iUBound = UBound($avArray)
    ReDim $avArray[$iUBound + 1]
    $avArray[$iUBound] = $vValue
    Return $iUBound
EndFunc ;==>_ArrayAdd


и если я провишу эту функцию у себя в скрипте и буду использовать уже
как бы "мою" функцию _ArrayAdd - то это ускорит обработку?
=> я правильно понял? или как по другому добовлять элементы в массив?

2)
Цитата:
У меня отработал нормально, за несколько секунд.

Maza Faka, у тебя в системе многа lan, wan ?

у меня 6 сетевых и 3 dialup, как понимаю обробатывая их - так и тормазит,
просто жесть - запуска скрипт и _жду_ пока выдаст список....просто фигею от этого...
Хотя, запускал на виртуальной xp, там мнгновенно выдает список, но там всего
одна сетевуха и все....больше проверить не где...


Добавлено:
а как передать одному скрипту autoit инфо из другого autoit?

сейчас делаю gui к сприпту, который будет постоянно работать
в системе, как обработать если этот скрипт будет запущен
второй раз?

подумал, что сделать обработку - проверять при зауске
не запещн ли уже и если да - то передать в уже запущеный
экземпляр - что он открл gui окно, а второй конечно закрылся.

так вот как же подружить два экземпляра одного и того же
скрипта? можно опрашивать переменную среду...- но может есть и
другие варианты?
Автор: ziherun
Дата сообщения: 22.07.2008 11:50
Подскажите пожалуйста как можно реализовать такое. Запускается например 2 окна игры, но по названию окна они получаются одинаковые как можно привязать скрипт к какому-то определенному окну? Да и вообще сделать типа интерфейса чтобы на нем было видно какие окна запущены и привязать скрипт к соответсвующему окну. Заранее спасибо. Maza Faka спасибо за предыдущий скрипт очень помог
Автор: ViSiToR
Дата сообщения: 22.07.2008 14:18
sproxy 09:53 22-07-2008
Цитата:
как передать одному скрипту autoit инфо из другого autoit?

Уже приводил этот(?) пример вроде... нужно бы в шапку его:


Код: #NoTrayIcon
#include
<GuiConstants.au3>
;

RegisterScriptMsg("SendMessage Test", $CmdLineRaw)

$Gui = GUICreate("SendMessage Test")
GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
Exit
EndSwitch
WEnd

Func
Main_Msg_Function($vsMsg)
MsgBox(0, "", "Recieved message:" & @LF & @LF & $vsMsg)
;Exit
EndFunc

;=====================================
Func RegisterScriptMsg($sTitle, $vMsg)
Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
Local $ERROR_ALREADY_EXISTS = 183

Local $ihWnd = WinGetHandle($sTitle)

Local $hDll = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
_AU3COM_SendData($vMsg, $ihWnd)
Exit
Else
Local Const
$WM_COPYDATA = 0x4A
GUIRegisterMsg($WM_COPYDATA, "_GUIRegisterMsgProc")
EndIf
EndFunc

Func
_GUIRegisterMsgProc($hWnd, $MsgID, $WParam, $LParam)
Local Const $WM_COPYDATA = 0x4A

If $MsgID = $WM_COPYDATA Then
Local
$vsMsg = _AU3COM_RecvData($LParam)
Local $MSGRECVD = DllStructGetData($vsMsg, 1)
;Here is go whatever we need to do with the recieved string ($MSGRECVD)
Call("Main_Msg_Function", $MSGRECVD)
EndIf
EndFunc

Func
_AU3COM_SendData($InfoToSend, $RecvWinHandle)
Local Const $WM_COPYDATA = 0x4A
Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
Local $CDString = DllStructCreate("char var1[256];char var2[256]") ;the array to hold the string we are sending

DllStructSetData($CDString, 1, $InfoToSend)
Local $pCDString = DllStructGetPtr($CDString) ;the pointer to the string
Local $vs_cds = DllStructCreate($StructDef_COPYDATA);create the message struct
DllStructSetData($vs_cds, "var1", 0) ;0 here indicates to the receiving program that we are sending a string
DllStructSetData($vs_cds, "var2", String(StringLen($InfoToSend) + 1));tell the receiver the length of the string
DllStructSetData($vs_cds, "var3", $pCDString) ;the pointer to the string
Local $pStruct = DllStructGetPtr($vs_cds)
DllCall("user32.dll", "long", "SendMessage", "hwnd", $RecvWinHandle, "int", $WM_COPYDATA, "int", 0, "int", $pStruct)

$vs_cds = 0 ;free the struct
$CDString = 0 ;free the struct

Return 1
EndFunc

Func
_AU3COM_RecvData($COM_LParam)
; $COM_LParam = Poiter to a COPYDATA Struct
Local $STRUCTDEF_AU3MESSAGE = "char var1[256];int"
Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
Local $vs_cds = DllStructCreate($StructDef_COPYDATA, $COM_LParam)
; Member No. 3 of COPYDATA Struct (PVOID lpData;) = Pointer to Costum Struct
Local $vs_msg = DllStructCreate($STRUCTDEF_AU3MESSAGE, DllStructGetData($vs_cds, 3))
Return $vs_msg
EndFunc
Автор: IgRo
Дата сообщения: 22.07.2008 21:19
Как перевести на AutoIT с VBA "functionName(Nothing)"
AutoIT не понимает Nothing
Автор: Hackproof
Дата сообщения: 22.07.2008 22:25
Смотря, что имеется ввиду.
Если просто вызов функции без аргументов, то FuncName(). Если в нее передается аргумент, то его можно загнать в переменную, например $arg, и вызвать FuncName($arg).


Код: $textlog="Запуск программы."
writelog($textlog)

func writelog($textlog)
$log=FileOpen ( "c:\scripts\new\log.log", 1)
        $timecur= _NowDate() & " " & _NowTime()
        $logstring=$timecur & " - " & $textlog
        FileWriteLine ($log, $logstring)
FileClose ($log)
endfunc
Автор: IgRo
Дата сообщения: 22.07.2008 23:32
If Not SelComp Is Nothing Then ...
Опять Nothing не понимает
Автор: Hackproof
Дата сообщения: 23.07.2008 02:16
Можно пару строк кода перед условием? А то мне тоже непонятно, что такое SelComp...
Тем более в AutoIt вроде нет оператора Is.
Автор: SysLam
Дата сообщения: 23.07.2008 03:26
Hackproof
имхо не туда копаешь, пайпы прекрасно работают через сеть, смотри настройки приложения (ODBCAD32 в помощь) или SQL (может быть запрет на удаленный доступ из сети)
Автор: Hackproof
Дата сообщения: 23.07.2008 04:47
В SQL рабочих протоколов только два - pipes и tcp. Сетевых подключений к sql нет, значит остается только pipe. Разработчики второго софта однозначно утверждают, что sql должен стоять на той же машине - плюс в сторону pipe. А вот реализовывать работу по сети они не хотят, и убедить их не получается. Имя канала жестко вписано в код программы, и изменить его можно только дизассемблировав модуль, отвечающий за связь, но искать нужное место очень долго, и не факт, что после этого софт заработает.
Автор: Maza Faka
Дата сообщения: 23.07.2008 07:11
asdfzxcv

Цитата:
а скажи зачем побитовое сложение делается BitAND(TrayItemGetState($auto), $TRAY_CHECKED) ?

А затем, что Item может иметь несколько состояний, например: $TRAY_CHECKED; $TRAY_ENABLE; $TRAY_FOCUS; $TRAY_DEFAULT, соответственно, если мы проверим так:

Код:
If TrayItemGetState($auto) = $TRAY_CHECKED Then...
Автор: sproxy
Дата сообщения: 23.07.2008 09:23
ViSiToR, спасибо, за разъяснение.
Еще вопрос, как считать параметры переданные моему скрипту через коммандную строку, т.е. запускаю ярлык exe файла с добавлением /param=1 - это реально?
Автор: Maza Faka
Дата сообщения: 23.07.2008 09:52
sproxy
Help

ViSiToR
Воодушевлённый твоими примерами накарябал примеры синхронизации скриптов.
Автор: sproxy
Дата сообщения: 23.07.2008 10:01
ООООгромное спасибо )) :
Maza Faka и ViSiToR
вы тут как Гуру - оба ...
вопрос такой, AutoIT гууд, но как понимаю,
писать на более серьезных языках - лучше и выгоднее?
С чего начать изучение C? VB...... .NET
Или же, к примеру програмка будильник, реализовать
на AutoIT лучше чем на Си....?

Автор: ziherun
Дата сообщения: 23.07.2008 10:09
А по моему вопросу ничего нельзя написать? Просто пролазил инет и справку ну не могу найти как привязать скрипт к определенному окну. Запускаются несколько окон с одинаковым названием? Я так понял скрипт должен определять ID окна и привязываться к этому номеру?
Автор: ViSiToR
Дата сообщения: 23.07.2008 16:17
IgRo 00:32 23-07-2008
Цитата:
If Not SelComp Is Nothing Then ...
Опять Nothing не понимает

If $SelComp == "" Then ...
Это с учётом того, что SelComp являтся переменной, но суть думаю ясна.

sproxy 10:23 23-07-2008
Цитата:
как считать параметры переданные моему скрипту через коммандную строку

Если имеется в виду считать значение параметра, то для этого тоже есть у меня UDF


Код: ;Example on how to get unknown Command Line...

;If $CmdLine[0] = 0 Then Exit ;Exit the script, because the command line was empty


If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 -File "C:\Program Files\Some App\File.txt" /URL "http://google.com"'

MsgBox(64, "", _
_GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
_GetCmdLine($CmdLineRaw, "/URL") & @LF & _
_GetCmdLine($CmdLineRaw, "-File"))

Func _GetCmdLine($sCmdLine, $sArgument)
Local $sRetCmd = StringRegExpReplace($sCmdLine, '(?i).*?' & $sArgument & '( |)("|)(.*?)("|)( /| -|$).*?$', '\3')

Return StringStripWS($sRetCmd, 3)
EndFunc
Автор: Maza Faka
Дата сообщения: 23.07.2008 17:03
ViSiToR
Спасибо за пример, но ты меня немного не понял Запись в файл это просто для примера, тут суть в том, что бы показать, что такое mutex, а именно ожидание вторым скриптом, момента, когда первый скрипт произведёт запись в файл и только потом второй скрипт произведёт чтение. Скажем если оба скрипта открывают файл для чтения, то дабы не возник "конфликт", второй скрипт будет открывать файл только после того, как первый скрипт закроет файл.

P.S.
Конечно всё это можно реализовать и без mutex-а, но с ним, IMHO будет правильней.
Автор: sproxy
Дата сообщения: 24.07.2008 14:00

Цитата:
ребята! как установить черный (иль зеленый)
цвет шрифта в за`DISABLE`нном Inout`е ??

мож есть еще замечательные функции UDF....


решил так, стил - $ES_READONLY а далее отлично раскрашиватся
GUICtrlSetColor( -1, 0xFF0000)...правда только Progress/Label
Автор: asdfzxcv
Дата сообщения: 24.07.2008 16:42
Скажи Maza Faka, мож есть случайно готовое решение (скрипт) для получения списка процессов с путями к файлам от куда они запущены. (и юудет ли он работать из (юзера или пверюзера)? через wmi мож как то прокатит.
Автор: ViSiToR
Дата сообщения: 25.07.2008 02:31
sproxy 15:00 24-07-2008
Цитата:
как установить черный (иль зеленый)  
цвет шрифта в  за`DISABLE`нном Inout`е   ??

Увы никак, вместо дисейбла можно использовать атрибут (стиль) только для чтения ($ES_READONLY).

asdfzxcv 17:42 24-07-2008
Цитата:
есть случайно готовое решение (скрипт) для получения списка процессов с путями к файлам от куда они запущены

В шапке есть нечто похожее, и вот UDF который я приводил на оф. форуме (пожалуй и он не помешает в шапке)...


Код: #include <Array.au3>

;============= Example with default usage =============
$aProcListEx = _ProcessListEx()

If @error Then
MsgBox(48, "_ProcessListEx - Error", StringFormat("There was an error to get ProcessList (@error = %i)", @error))
Else
_ArrayDisplay($aProcListEx, "_ProcessListEx Demo (All Processes)")
EndIf
;============= Example with default usage =============

;============= Example with Resource Name usage =============

$aAutoItProcList = _ProcessListEx("CompiledScript", "AutoIt", 0)

If @error Then
MsgBox(48, "_ProcessListEx - Error", StringFormat("There was an error to get ProcessList (@error = %i)", @error))
Else
_ArrayDisplay($aAutoItProcList, "_ProcessListEx Demo (AutoIt Processes)")
EndIf
;============= Example with Resource Name usage =============

;===============================================================================
;
; Function Name: _ProcessListEx()
;
; Function Description: Gets Process List with extended info, plus can retrieve only a processes with specific resources strings.
;
; Parameter(s): $sResourceName [Optional] - Resource name of the process filename, i.e. "CompiledScript".
; $sInResString [Optional] - String to check in the resource name.
; $iWholeWord [Optional] - Defines if the $sInResString will be compared as whole string (default is 1).
;
; Requirement(s): None.
;
; Return Value(s): On Success - Return 2-dimentional array, where:
; $aRet_List[0][0] = Total processes (array elements).
; $aRet_List[N][0] = Process Name.
; $aRet_List[N][1] = PID (Process ID).
; $aRet_List[N][2] = Process File Path.
; On Failure - Return '' (empty string) and set @error to:
; 1 - Unable to Open Kernel32.dll.
; 2 - Unable to Open Psapi.dll.
; 3 - No Processes Found.
;
; Author(s): G.Sandler (a.k.a MrCreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================

Func _ProcessListEx($sResourceName="", $sInResString="", $iWholeWord=1)
Local $aProcList = ProcessList()
Local $hKernel32_Dll = DllOpen('Kernel32.dll'), $hPsapi_Dll = DllOpen('Psapi.dll')
Local $aOpenProc, $aProcPath, $sFileVersion, $aRet_List[1][1]

If $hKernel32_Dll = -1 Then Return SetError(1, 0, '')

If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@SystemDir & '\Psapi.dll')
If $hPsapi_Dll = -1 Then $hPsapi_Dll = DllOpen(@WindowsDir & '\Psapi.dll')
If $hPsapi_Dll = -1 Then Return SetError(2, 0, '')

Local $vStruct = DllStructCreate('int[1024]')
Local $pStructPtr = DllStructGetPtr($vStruct)
Local $iStructSize = DllStructGetSize($vStruct)

For $i = 1 To UBound($aProcList)-1
$aOpenProc = DllCall($hKernel32_Dll, 'hwnd', 'OpenProcess', _
'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])

If Not IsArray($aOpenProc) Or Not $aOpenProc[0] Then ContinueLoop

DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', _
'hwnd', $aOpenProc[0], _
'ptr', $pStructPtr, _
'int', $iStructSize, _
'int*', 0)

$aProcPath = DllCall($hPsapi_Dll, 'int', 'GetModuleFileNameEx', _
'hwnd', $aOpenProc[0], _
'int', DllStructGetData($vStruct, 1), _
'str', '', _
'int', 2048)

DllCall($hKernel32_Dll, 'int', 'CloseHandle', 'int', $aOpenProc[0])

If Not IsArray($aProcPath) Or StringLen($aProcPath[3]) = 0 Then ContinueLoop

$sFileVersion = FileGetVersion($aProcPath[3], $sResourceName)

If $sResourceName = "" Or $sFileVersion = $sInResString Or _
(
$iWholeWord = 0 And StringInStr($sFileVersion, $sInResString)) Then

$aRet_List[0][0] += 1
ReDim $aRet_List[$aRet_List[0][0]+1][3]
$aRet_List[$aRet_List[0][0]][0] = $aProcList[$i][0] ;Process Name
$aRet_List[$aRet_List[0][0]][1] = $aProcList[$i][1] ;PID (Process ID)
$aRet_List[$aRet_List[0][0]][2] = $aProcPath[3] ;Process File Path
EndIf
Next


DllClose($hKernel32_Dll)
DllClose($hPsapi_Dll)

If $aRet_List[0][0] < 1 Then Return SetError(3, 0, '')
Return $aRet_List
EndFunc
Автор: Hackproof
Дата сообщения: 25.07.2008 03:59
Уже вперед меня ответили...
Автор: asdfzxcv
Дата сообщения: 25.07.2008 09:46
Спасибо ViSiToR


Скажи а почиму у меня такую ошибку выкидывает я просто скопировал и запустил твой UDF

C:\Documents and Settings\123\??????? ????\AutoIt v3 Script.au3 (69) : ==> "long_ptr", "int_ptr" and "short_ptr" DllCall() types have been deprecated. Use "long*", "int*" and "short*" instead.:
DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', 'hwnd', $aOpenProc[0], 'ptr', $pStructPtr, 'int', $iStructSize, 'int_ptr', 0)
???????????????????????????4‰
->10:41:14 AutoIT3.exe ended.rc:1

У меня версия автоита 3, 2, 11, 2

ДА в шапку бы такую вещь не помешало бы (если всё работать будет)
Автор: sproxy
Дата сообщения: 25.07.2008 11:00
это гениально, ViSiToR, ге-ни-ально-о-о!!
и даже лучше....невнимательный я...эх, блин ... )
Спасибо! дело все лучше и лучше _)
Автор: Maza Faka
Дата сообщения: 25.07.2008 14:43
asdfzxcv
Замени в скрипте все данные вида long_ptr на long* и т.д.
Автор: asdfzxcv
Дата сообщения: 25.07.2008 15:59
а почиму он такую фигню выдаёт непонятно...

я исправил поставил *
DllCall($hPsapi_Dll, 'int', 'EnumProcessModules', _
'hwnd', $aOpenProc[0], _
'ptr', $pStructPtr, _
'int', $iStructSize, _
!!! 'int*ptr', 0)

массив показался всё нормально, а потом выдал в сообщении ошибку #error=3


Скажите мож не под мою версию аутоита?? недумаю что визитор нерабочий пример сделал, пример и сделан что бы он был изночально рабочим. )
Автор: Loopback
Дата сообщения: 25.07.2008 20:12

Цитата:
!!! 'int*ptr', 0)
массив показался всё нормально, а потом выдал в сообщении ошибку #error=3

Тип должен быть просто 'int*', без ptr и без пробелов между типом и *. Этот синтаксис работает в последней релизной версии и последующих бетах, само собой.

Кстати, респект ViSiToR-у за отличную UDF, я уже давно нашел ей применение.
Автор: sproxy
Дата сообщения: 26.07.2008 03:12
Подскажите пожалуйста, как создать два и более элементов Tab
в одном окне? Ниже код, и в нем, все TabItem от Tab2, создаются
в Tab1 ..


Код: #include <GUIConstantsEx.au3>
GUICreate("My GUI Tab")

$tab1 = GUICtrlCreateTab(10, 10, 350, 150)
GUICtrlSetState(-1, $GUI_SHOW)

$tab1_Item1 = GUICtrlCreateTabItem("tab1_Item1")
;~ кнопки tab1_Item1
GUICtrlCreateTabItem("")

$tab1_Item2 = GUICtrlCreateTabItem("tab1_Item2")
;~ кнопки tab1_Item2
GUICtrlCreateTabItem("")

$tab2 = GUICtrlCreateTab(10, 200, 350, 150)
GUICtrlSetState(-1, $GUI_SHOW)

$tab2_Item1 = GUICtrlCreateTabItem("tab2_Item1")
;~ кнопки tab2_Item1
GUICtrlCreateTabItem("")

$tab2_Item2 = GUICtrlCreateTabItem("tab2_Item2")
;~ кнопки tab2_Item2
GUICtrlCreateTabItem("")

GUISetState()
While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
Автор: ViSiToR
Дата сообщения: 26.07.2008 04:18
sproxy 04:12 26-07-2008
Цитата:
как создать два и более элементов  Tab

Сюдя по справке в одном окне никак:


Цитата:
ONLY one Tab control can be created by window.


Но далее сказано:


Цитата:
But a script can creates several windows having a tab in.


Поэтому люди импровизируют:


Код: #include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <TabConstants.au3>
#include <ListViewConstants.au3>

Global $hImageList = 0

$Main_GUI = GUICreate("Tab Sample", 400, 300, -1, -1);, BitOr($GUI_SS_DEFAULT_GUI,$WS_CLIPSIBLINGS))
$OK_Button = GUICtrlCreateButton("OK", 110, 270, 70, 20)
$Cancel_Button = GUICtrlCreateButton("Cancel", 220, 270, 70, 20)
GUISetState()

; Creates the first child window that is implemented into the main GUI
$Child1 = GUICreate("", 370, 215, 15, 40, BitOR($WS_CHILD, $WS_TABSTOP), -1, $Main_GUI)

$child1_tab = GUICtrlCreateTab(0, 0, 370, 215)
$child1_tabitem1 = GUICtrlCreateTabItem("Child1Tab1")
$child1_tabitem2 = GUICtrlCreateTabItem("Child1Tab2")
$child1_tabitem3 = GUICtrlCreateTabItem("Child1Tab3")
GUICtrlCreateTabItem("")

GUISetState()

; Creates the second child window that is implemented into the main GUI
$child2 = GUICreate("", 370, 215, 15, 40, BitOR($WS_CHILD, $WS_TABSTOP), -1, $Main_GUI)

$child3 = GUICreate("", 210, 220, 158, 0, BitOR($WS_CHILD, $WS_TABSTOP), -1, $child2)
$ListView = GUICtrlCreateListView("Col1|Col2", 0, 2, 210, 211, _
BitOR($LVS_NOSORTHEADER, $LVS_SHOWSELALWAYS, $WS_TABSTOP), $WS_EX_CLIENTEDGE)

GUICtrlCreateListViewItem("ItemLong1|ItemLong2", $ListView)
GUICtrlCreateListViewItem("ItemLong3|ItemLong4", $ListView)
GUICtrlCreateListViewItem("ItemLong5|ItemLong6", $ListView)
GUISetState()

GUISwitch($child2)
$child2_tab = GUICtrlCreateTab(0, 0, 156, 215)
$child2_tabitem1 = GUICtrlCreateTabItem("Child2Tab1")
$child2_tabitem2 = GUICtrlCreateTabItem("Child2Tab2")
GUICtrlCreateTabItem("")

; Switch back the main GUI and create the tabs
GUISwitch($Main_GUI)
$main_tab = GUICtrlCreateTab(10, 10, 380, 250)
$main_tabitem1 = GUICtrlCreateTabItem("MainTab1")
$main_tabitem2 = GUICtrlCreateTabItem("MainTab2")
GUICtrlCreateTabItem("")
GUICtrlSetState($main_tabitem1, $GUI_SHOW)

Bind_ImageList($main_tab)

While 1
$msg = GUIGetMsg(1)
Select
Case
$msg[0] = $GUI_EVENT_CLOSE Or $msg[0] = $Cancel_Button
ExitLoop

Case
$msg[0] = $main_tab
$tabidx
= GUICtrlRead($main_tab)

Select
Case
$tabidx = 0
GUISetState(@SW_HIDE, $child2)
GUISetState(@SW_SHOW, $Child1)
Case $tabidx = 1
GUISetState(@SW_HIDE, $Child1)
GUISetState(@SW_SHOW, $child2)
EndSelect
EndSelect
WEnd

DllCall("comctl32.dll", "int", "ImageList_Destroy", "hwnd", $hImageList)

Func ImageList_Create()
$hImageList = DllCall("comctl32.dll", "hwnd", "ImageList_Create", "int", 16, "int", 16, "int", 0x0021, "int", 0, "int", 1)
$hImageList = $hImageList[0]
Return $hImageList
EndFunc ;==>ImageList_Create

Func Bind_ImageList($nCtrl)
$hImageList = ImageList_Create()
GUICtrlSendMsg($nCtrl, $TCM_SETIMAGELIST, 0, $hImageList)

$szIconFile = "shell32.dll"

$tcitem = DllStructCreate("uint;dword;dword;ptr;int;int;int")
DllStructSetData($tcitem, 1, 0x0002)
DllStructSetData($tcitem, 6, 0)
AddImageToTab($nCtrl, 0, $tcitem, $szIconFile, 12)

DllStructSetData($tcitem, 6, 1)
AddImageToTab($nCtrl, 1, $tcitem, $szIconFile, 21)

$tcitem = 0
EndFunc ;==>Bind_ImageList

Func AddImageToTab($nCtrl, $nTabIndex, $nItem, $szIconFile, $nIconID)
$hIcon = DllStructCreate("int")
$result = DllCall("shell32.dll", "int", "ExtractIconEx", "str", $szIconFile, "int", $nIconID, "hwnd", 0, "ptr", DllStructGetPtr($hIcon), "int", 1)
$result = $result[0]
If $result > 0 Then
DllCall("comctl32.dll", "int", "ImageList_AddIcon", "hwnd", $hImageList, "hwnd", DllStructGetData($hIcon, 1))
DllCall("user32.dll", "int", "SendMessage", "hwnd", ControlGetHandle($Main_GUI, "", $nCtrl), "int", $TCM_SETITEM, "int", $nTabIndex, "ptr", DllStructGetPtr($nItem))
DllCall("user32.dll", "int", "DestroyIcon", "hwnd", $hIcon)
EndIf

$hIcon = 0
EndFunc ;==>AddImageToTab
Автор: sproxy
Дата сообщения: 26.07.2008 04:51
это что-то, про Tab, понял.
Спасибо!

А вот с иконками не совсем, пока...подскажешь как
сделать иконки у пунктов меню?

+ про таб - в целом наоборот!
это даже круче - и удобней так организовывать gui!
значит именно так организовывается во многих
конатркуторах элементы типа "панель" и т.д.
Cool! Спасибо большое за помощь!
Как допишу первый раб. вариант - с меня пиво ))
Автор: ViSiToR
Дата сообщения: 26.07.2008 04:59
sproxy 05:51 26-07-2008
Цитата:
как
сделать иконки у пунктов меню?

Есть UDF от одного из разработчиков AutoIt'а (Holger): GUI/Tray Menu with icons and colors

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.