Что нового

Todo-prog: блокнот для быстрых заметок в стиле Aston Shell.

Pelerin

Осваивающий
Сообщения
81
Репутация
23
AutoIt: 3.
Версия: 1.0.0.9 \ 2.0.0.1

Категория: Автоматизация, Разное

Описание: Небольшая программка для быстрых заметок. Просто разместите папку с программой куда вам удобнее, сделайте ссылку на программу для быстрого запуска на рабочем столе, в QuickLaunch или даже дополнительных панелях типа RocketDock и др. Теперь когда надо быстро что-то записать, запустите, запишите и снова переключитесь на прежнее окно. Прога сама закроется и сохранит ваш текст.

Особенности:
- Каждая вкладка - это отдельный текстовый файл.
- При запуске все текстовые файлы в папке с программой отображаются как вкладки. Можно легко оперируя текстовыми файлами добавлять и удалять заметки.
- Количество вкладок бесконечно. Точнее ограничено памятью компа :smile:
- Поддержка UTF-8. Так-что даже китайские иероглифы сохраняются.

Код/Пример: Исходник в архиве. Следовательно я не против модификации ;).
Файл: ToDo-prog_v1 ToDo-prog_v2

Автор: Pelerin

------------------------------------------------------------
Обновил версию до 2.0.0.1
Update list:
В версии 2.0.0.1:
1. Исправлены баги с запоминанием позиции окна
2. Исправлен баг с шифрованием
3. Исправлено еще несколько багов
4. Подчищен код
5. Теперь при сохранении текста, переписывает только модифицированные файлы (ускорено закрытие программы)
6. Добавлена опция "поверх всех окон"
7. Добавлена многоязычность

В версии 2.0.0.0b:
1. Полностью переписан код. Изменена обработка GUI с OnEvent на GuiLoop
2. Изменен стиль интерфейса с кнопок-вкладок на список заметок
3. Поправлен баг с постепенным увеличением размеров окна (при перезапусках).
4. Нормальное поле Edit с вертикальной полосой прокрутки при включеном режиме "перенос строк"
5. Добавлено шифрование заметок
6. Добавлено печать (пока без диалога, сразу на дефолтный принтер)
7. Добавлено сброс параметров
8. Сделаны нормальные хоткеи - только для окна программы (спасибо библиотеке HotKey.au3)

В версии 1.0.0.9:
Исправил "Очепятки" и ошибки :smile:

В версии 1.0.0.8:
1. Исправлены баги отмеченные в этой теме.
2. Несколько мелких фиксов которые я заметил во время правки.
3. Добавлены горячие клавиши и справка по ним (F1).
4. Добавлен таймер для авто-закрытия если окно не активно, а также возможность вообще отключить авто-закрытие. В связи с этим, запретил повторный запуск скрипта.
------------------------------------------------------------
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Pelerin
Хороший вариант.
Понравилась идея: если окно не октивно, то оно само-скрывается.
Думаю было бы еще лучше, если это сделать опционально и организовать
автоскритие без активности по timeout-у.
+ Быстрые клавиши и будет полноценная утилитка )

Повторяите ошибку MS: лучше и удобней всего формировать заголовок окна:
Код:
<название вкладки> - <название программы>
А не наоборот. Т.к. фактическая польза от смены заголовка очень уменьшается.
Пример: На панели задачь 7 кнопок окон, следовательно от названия программы остается только "ToDo.exe-..."

+Кнопки вкладок немного выезжают за правую границу окна, и точно так же edit поле.
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Понравилась идея: если окно не октивно, то оно само-скрывается.
Думаю было бы еще лучше, если это сделать опционально и организовать
автоскритие без активности по timeout-у.
Ок, это идея. Добавлю в следеющей версии

+ Быстрые клавиши
Например? Под какие функции?

<название вкладки> - <название программы>
Не вопрос исправим.

+Кнопки вкладок немного выезжают за правую границу окна, и точно так же edit поле.
А вот тут я не понял :blink:? У меня все нормально... Можно скриншот? (правда у меня XP...)
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Горячие клавиши, ну например, на появление/скрытие окна.

А про баг, у меня win 7. Видать, для красоты, необходимо подгонять отдельно.
(снимок во вложении)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Это потому, что в 7-ке WinGetPos(), да и все другие подобные функции, выдают размер без плюшек Aero. И он получается меньше, чем на самом деле. Реальный размер в Aero можно получить с помощью _WinAPI_DwmGetWindowAttribute(), если Aero выключен, то обычным способом.

Но здесь проблема еще в том, что размер клиентской части окна, та, которая должна задаваться при вызове GUICreate(), определяется как WinGetPos(), а не WinGetClientSize(). Что, как говорится, две большие разницы.

Pelerin

Рекомендую добавить стиль $WS_EX_COMPOSITED для избавления от мерцаний при изменении размеров окна.
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Пошел исправлять баги и писать новую версию с горячими клавишами и др. :smile:
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Yashied
А у меня такого нет $WS_EX_COMPOSITED :'(
Это чего за стиль такой? В справке его нет (у меня). В скрипте когда вставляю пишет: "Я такого не понимать". Но он так делает даже когда стиль знакомый, зато если вставить HEX то все нормально. С какой библиотекой он должен подключаться? Может подскажешь HEX? Версия autoit - 3.3.6.1.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Pelerin
Отличное начинание.
OffTopic:
Побольше бы таких участников форума, которые приходят с идеями в первую очередь, и за вопросами во вторую :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Pelerin сказал(а):
А у меня такого нет $WS_EX_COMPOSITED :'(
Это чего за стиль такой? В справке его нет (у меня). В скрипте когда вставляю пишет: "Я такого не понимать". Но он так делает даже когда стиль знакомый, зато если вставить HEX то все нормально. С какой библиотекой он должен подключаться? Может подскажешь HEX? Версия autoit - 3.3.6.1.
Определен в WindowsConstats.au3

$WS_EX_COMPOSITED = 0x02000000

Это расширенный стиль, т.е. должен идти вторым параметром...

Я очень-очень не рекомендую испоьзовать числовые значения вместо определяющих констант. Это сейчас у тебя сравнительно простой код, а дальше будет в десятки раз больше, и запутаться, что означает то или иное число будет как два...
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Yashied
Определен в WindowsConstats.au3

$WS_EX_COMPOSITED = 0x02000000

Это расширенный стиль, т.е. должен идти вторым параметром...

Я очень-очень не рекомендую испоьзовать числовые значения вместо определяющих констант. Это сейчас у тебя сравнительно простой код, а дальше будет в десятки раз больше, и запутаться, что означает то или иное число будет как два...
Спасибо. На счет запутаться, то я согласен. Просто раньше редко пользовался стилями и лень было рыться - чем что подключается. Теперь потихоньку перехожу на константы.

Кстати все получилось. И с размерами окна тоже. Сейчас думаю как сделать авто-закрытие по таймеру, точнее опцию к нему. Может перенести все настройки в отдельное окно?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Еще насчет изменения размеров. Если ты используешь WS_SIZEBOX (0x00040000), то тебе необходимо позаботиться о всех элементах GUI, т.е. использовать функцию GUICtrlSetResizing() для каждого элемента, а не только для Edit. Сейчас у тебя кнопки ведут себя очень "странно".
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Сейчас у тебя кнопки ведут себя очень "странно".
Это я так заботился о том чтобы они всегда растягивались по ширине окна ;D
А как они на самом деле себя ведут?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Pelerin сказал(а):
А как они на самом деле себя ведут?
Не держут правую и левую границы.

P.S

Может лучше Tab?
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Хотел но не придумал как обработать правый клик по TabItem. Если кто-то подскажет как сделать контекстное меню для каждой вкладки, то можно попытаться переделать... но придется пол кода переписывать..

PS: Даже не контекстное меню, а саму реакцию на правый клик?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Что-то я тут немного увлекся... Но если подойдет, можешь взять этот код за основу. Если что, задавай вопросы...

:smile:

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIEdit.au3>
#Include <GUIMenu.au3>
#Include <GUITab.au3>
#Include <ScrollBarConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $hTab, $Tab, $Edit[2] = [1], $Menu[4], $Msg, $Text, $Index

$hForm = GUICreate('MyGUI', 400, 400, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_TOPMOST)
$Menu[0] = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
$Menu[1] = GUICtrlCreateMenuItem('Delete Tab', $Menu[0])
$Menu[2] = GUICtrlCreateMenuItem('Add...', $Menu[0])
$Menu[3] = GUICtrlCreateMenuItem('Rename...', $Menu[0])
$Menu[0] = GUICtrlGetHandle($Menu[0])
$Tab = GUICtrlCreateTab(10, 10, 380, 380, $TCS_FOCUSNEVER)
$hTab = GUICtrlGetHandle(-1)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlCreateTabItem('Tab1')
$Edit[1] = GUICtrlCreateEdit('', 24, 44, 350, 331)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetState(-1, $GUI_FOCUS)
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_PRIMARYDOWN
			$Index = _TabGetIndex($hTab)
			If $Index = -1 Then
				ContinueLoop
			EndIf
			_TabSetFocus($hTab, $Index)
		Case $GUI_EVENT_SECONDARYDOWN
			$Index = _TabGetIndex($hTab)
			If $Index = -1 Then
				ContinueLoop
			EndIf
			_GUICtrlTab_SetCurFocus($hTab, $Index)
			If _WinAPI_GetFocus() <> $hTab Then
				_TabSetFocus($hTab, $Index)
			EndIf
		Case $GUI_EVENT_SECONDARYUP
			$Index = _TabGetIndex($hTab)
			If $Index = -1 Then
				ContinueLoop
			EndIf
			If _GUICtrlTab_GetCurFocus($hTab) = $Index Then
				$Text = _GUICtrlTab_GetItemText($hTab, $Index)
				GUICtrlSetData($Menu[1], 'Delete "' & $Text & '"')
				If ($Edit[0] = 1) And ($Text = 'Tab1') And (Not GUICtrlRead($Edit[1])) Then
					GUICtrlSetState($Menu[1], $GUI_DISABLE)
				Else
					GUICtrlSetState($Menu[1], $GUI_ENABLE)
				EndIf
				_GUICtrlMenu_TrackPopupMenu($Menu[0], $hForm)
			EndIf
		Case $Tab
			_WinAPI_SetFocus($hTab)
		Case $Menu[1] ; Delete
			If $Edit[0] = 1 Then
				GUICtrlSetData(_GUICtrlTab_GetItemParam($hTab, 0), 'Tab1')
				GUICtrlSetData($Edit[1], '')
			Else
				$Index = _GUICtrlTab_GetCurFocus($hTab)
				GUICtrlDelete(_GUICtrlTab_GetItemParam($hTab, $Index))
				GUICtrlDelete($Edit[$Index + 1])
				For $i = $Index + 1 To $Edit[0] - 1
					$Edit[$i] =  $Edit[$i + 1]
				Next
				ReDim $Edit[$Edit[0]]
				$Edit[0] -= 1
			EndIf
			_TabSetFocus($hTab, _GUICtrlTab_GetCurFocus($hTab))
		Case $Menu[2] ; Add
			$Text = _TabRenameDlg('Add Tab', '', $hForm)
			If Not $Text Then
				ContinueLoop
			EndIf
			$Edit[0] += 1
			ReDim $Edit[$Edit[0] + 1]
			GUICtrlCreateTabItem($Text)
			$Edit[$Edit[0]] = GUICtrlCreateEdit('', 24, 44, _WinAPI_GetWindowWidth($hTab) - 30, _WinAPI_GetWindowHeight($hTab) - 49)
			GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
			$Index = _GUICtrlTab_GetCurFocus($hTab)
			_GUICtrlTab_SetCurFocus($hTab, $Edit[0] - 1)
			_GUICtrlTab_SetCurFocus($hTab, $Index)
			_TabSetFocus($hTab, $Edit[0] - 1)
		Case $Menu[3] ; Rename
			$Index = _GUICtrlTab_GetCurFocus($hTab)
			$Text = _TabRenameDlg('Rename Tab', _GUICtrlTab_GetItemText($hTab, $Index), $hForm)
			If Not $Text Then
				ContinueLoop
			EndIf
			GUICtrlSetData(_GUICtrlTab_GetItemParam($hTab, $Index), $Text)
	EndSwitch
WEnd

Func _TabGetIndex($hWnd)

	Local $tRect, $tPt

	For $i = 0 To _GUICtrlTab_GetItemCount($hWnd)
		$tRect = _GUICtrlTab_GetItemRectEx($hWnd, $i)
		$tPt = _WinAPI_GetMousePos(1, $hWnd)
		If _WinAPI_PtInRect($tRect, $tPt) Then
			Return $i
		EndIf
	Next
	Return -1
EndFunc   ;==>_TabGetIndex

Func _TabRenameDlg($sTitle, $sText, $hParent = 0)

	Local $hDlg, $Msg, $Button, $Input, $Result = ''

	GUISetState(@SW_DISABLE, $hParent)
	$hDlg = GUICreate($sTitle, 320, 90, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), -1, $hParent)
	$Input = GUICtrlCreateInput($sText, 14, 20, 292, 19)
	$Button = GUICtrlCreateButton('OK', 120, 54, 80, 25)
	GUISetState()

	While 1
		$Msg = GUIGetMsg()
		Switch $Msg
			Case 0
				ContinueLoop
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $Button
				$Result = StringStripWS(GUICtrlRead($Input), 3)
				ExitLoop
		EndSwitch

	WEnd

	GUISetState(@SW_ENABLE, $hParent)
	GUIDelete($hDlg)

	Return $Result
EndFunc   ;==>_TabRenameDlg

Func _TabSetFocus($hWnd, $iIndex)
	_GUICtrlTab_SetCurFocus($hWnd, $iIndex)
	_WinAPI_SetFocus(GUICtrlGetHandle($Edit[$iIndex + 1]))
	_GUICtrlEdit_SetSel($Edit[$iIndex + 1], 0, 0)
	_GUICtrlEdit_Scroll($Edit[$iIndex + 1], $SB_SCROLLCARET)
	While GUIGetMsg()
		; Nothing
	WEnd
EndFunc   ;==>_TabSetFocus
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
AZJIO, спасибо за подсказки.
Код:
$tab_name = StringRegExpReplace ($tab_name, '[\\|/?*:<>"]', '')
- да... слона то мы и не заметили... в справке. :smile:

Код:
$m_CRLF = GUICtrlCreateMenuitem ("Перенос по словам", $m_settings)
$m_last_tab = GUICtrlCreateMenuitem ("Запоминать последнюю вкладку", $m_settings)
GUICtrlSetOnEvent ($m_CRLF, "menu_CRLF")
GUICtrlSetOnEvent ($m_last_tab , "menu_last_tab")
- знаю, но мне так удобнее. Я тогда сразу вижу где идет объявление GUI, а где привязка к функции.

Код:
Opt("GUIResizeMode", 2 + 32 + 256 + 512) ; 802
- Что это даст? По-моему это итак дефолтный вариант.
По поводу "2 + 32 + ..." согласен

С координатами я разобрался. Твою функцию WM_GETMINMAXINFO я посмотрел и мне показалось это громоздким. Я просто запретил сохранять координаты если окно свернуто. Поэтому при следующем запуске ставятся те, которые были перед сворачиванием.

Про Hotkeysat () - спасибо за ссылочку. Я взял вариант с установкой скрипту дефолтного языка. По-моему это самый стройный вариант. Все остальное - костыли. Языков ведь дофига! У одного меня только русский, английский, украинский, китайский и арабский :wacko:

Код:
If WinGetState ($win)=7 Then Myexit()
- к этому я и пришел. У дураков мысли сходятся :smile: :beer:

+++++++++++++++++++++++++++++++++++++++++++++++++
Yashied, это у тебя крутой конечно вариант. Я уже почти отфиксил и дополнил свой код. Поэтому пока ничего глобально менять не буду. Если решусь переписывать то конечно возьму его за основу, но тогда это уже будет версия 2.0.0.0 (типа "Revolution") ;D

+++++++++++++++++++++++++++++++++++++++++++++++++++
`p r o x y ,
Как ты и просил, я сделал горячие клавиши. Но для запуска по комбинации вижу только один способ: через свойства ярлыка к скрипту т.к. при закрытии окна скрипт выгружается из памяти, а делать агент вечно висящий в ОЗУ мне не хочется(у меня её и так всего 256 метров).
Огромное спасибо, что помогли отладить и дополнить прогу. Если найдутся еще какие-нибудь баги, пишите сюда или на мыло указанное в справке программы.
 

VladUs

Скриптер
Сообщения
621
Репутация
180
В новой версии, можно добавить в меню "Настройки" пункт "Шифровать".
Данный пукт будет шифровать текст (функция _StringEncrypt () очень хорошо с этим справляется), а то заметки заметками.... но иногда надо записать и не забыть такое, чо другим не надо видеть.... При активации пункта "Шифровать", программа должна запрашивать пароль при запуске.
Прошу рассматривать данное сообщение ни как обнаружение недостатков, а как пожелание по развитию программы!
И за программу заслуженный "+"
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
VladUs
VladUs сказал(а):
В новой версии, можно добавить в меню "Настройки" пункт "Шифровать"
Ок, записал себе в ToDo :smile:



Добавлено:
Сообщение автоматически объединено:

AZJIO [?]
Зачем вызывать WinMove и WinGetPos несколько раз в секунду, когда можно это совершать только в момент перемещения и ресайза окна. Лишняя нагрузка на проц.
согласен этот вариант лучше. Но:
1. По-моему Wingetpos() в главном цикле нужен еще для каких-то вещей. Я уже не очень помню т.к. код порядком запутался при добавлении новых функций и исправлении багов.
2. Т.к. я не программист по образованию, а AutoIt - это просто хобби, я не очень шарю в Dll. Точнее для чего нужны библиотеки функций я знаю, но как устроены конкретно dll - для меня загадка, а соответственно и функция DllCall. Мне бы надо где-нибудь почитать про них по-подробнее и глянуть описание к user32.dll.

В любом случае к следующей версии я планирую:
* Добавить шифрование для каждой вкладки отдельно(свой пароль, своя степень шифрования). Кстати такой вопрос: какую лучше ставить максимальную степень? Что-бы ни мало, ни много не было.
* Добавить кнопку сброса настроек на дефолт.
* Перелопатить код и оптимизировать его. Немного распутать и добавить коментов.
* Возможно изменить концепцию GUI с Button на TabItem, то что писал Yashied.

именно два раза \\
странно у меня и так все работает... Там все-таки запрещенные символы для имени файла, а не для его пути.

Это даст то что стиль будет дефолтным и тогда не придётся всем элементам прописывать правило, а только тем, которые отличаются от установленого дефолтным. 802 - ничего не изменять, а дефолтный изменять согласно пропорциям.
Это да, но у меня там элементов - по пальцам пересчитать. А кнопки вкладок так вообще в цикле делаются. На счет дефолта - да я ошибся.
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Yashied, Ай нид ХЕЛП!! :wall_brake:
Переписываю свой блокнот по образу и подобию твоего кода с TabItem. Возникли проблемы:
1. При построении Tab и Edit в режиме MassageLoop, Edit скрывается под Tab-ом. У тебя все работает, у меня в прошлый раз тоже, но я использовал режим OnEvent. Теперь не хочет. :'( Пробовал играться со стилями и состояниями tab и edit но не помогло. В чем секрет? Как у тебя получилось?
2. При том же построении Tab и Edit перестает работать функция повешенная на
Код:
GUIRegisterMsg ($WM_KILLFOCUS, "Exit_Timer")

Но если закомментировать тестовый кусок кода, то снова работает. :blink:

Вот код:
Код:
; Test include
#include <Array.au3>
;//
; Globals
#Include <GuiTab.au3>
#include "AllConstants.au3" ; подключение всех констант
AutoItSetOption ("TrayIconHide", 1)
Global $winpos[4], $set[20], $gui_set_close=-1
;//

; Проверка повторного запуска
$process = ProcessList (@AutoItExe)
If $process[0][0] > 1 Then
	WinActivate (@ScriptName)
	Exit
EndIf
; //
$set = ReadSettings () ; чтение настроек

; ---------------------------------GUI----------------------------------------
$win = GUICreate(@ScriptName, $Set[2], $Set[3], $Set[0], $Set[1], $GUI_SS_DEFAULT_GUI+$WS_MAXIMIZEBOX+$WS_SIZEBOX, $WS_EX_COMPOSITED)
WinSetDefaultLang (0x0409) ; установка дефолтного языка окну
GUIRegisterMsg ($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING") ; Регистрация функции вызываемой при изменении позиции окна
GUIRegisterMsg ($WM_KILLFOCUS, "Exit_Timer") ; Регистрация функции вызываемой при потере фокуса
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") ; Регистрация функции вызываемой при сворачивании/разворачивании

; Построение меню Файл
$m_file = GUICtrlCreateMenu ("Файл")
$m_addtab = GUICtrlCreateMenuItem ('Добавить вкладку', $m_file)
$m_deltab = GUICtrlCreateMenuItem ('Удалить вкладку', $m_file)
$m_renametab = GUICtrlCreateMenuItem ('Переименовать вкладку', $m_file)
$m_encrypt = GUICtrlCreateMenuItem ('Шифровать вкладку', $m_file)
GUICtrlCreateMenuItem ('', $m_file)
$m_exit = GUICtrlCreateMenuItem ('Выход', $m_file)
;//

; Построение меню Настройки
$m_settings = GUICtrlCreateMenu ("Настройки")
$m_ch_font = GUICtrlCreateMenuitem ("Шрифт", $m_settings)
$m_ch_bgcolor = GUICtrlCreateMenuitem ("Цвет фона", $m_settings)
$m_trans = GUICtrlCreateMenuitem ("Прозрачность окна", $m_settings)
GUICtrlCreateMenuItem ('', $m_settings)
$m_CRLF = GUICtrlCreateMenuitem ("Перенос по словам", $m_settings)
_GUICtrlSwitchState($m_CRLF, $set[17], $GUI_UNCHECKED, $GUI_CHECKED)
$m_last_tab = GUICtrlCreateMenuitem ("Запоминать последнюю вкладку", $m_settings)
_GUICtrlSwitchState($m_last_tab, $set[18], $GUI_UNCHECKED, $GUI_CHECKED)
$m_autocenter = GUICtrlCreateMenuitem ("Всегда по центру", $m_settings)
$set[19]=_GUICtrlSwitchState($m_autocenter, $set[19], $GUI_UNCHECKED, $GUI_CHECKED)
$m_set_close = GUICtrlCreateMenuitem ("Параметры закрытия", $m_settings)
;//

; Построение меню Справка
$m_help = GUICtrlCreateMenu ("Справка")
$m_about = GUICtrlCreateMenuItem ("О программе", $m_help)
$m_hotkeys = GUICtrlCreateMenuItem ("Горячие клавиши", $m_help)
;//

$files = FileListToArray  (@ScriptDir, "*.txt")
If Not IsArray ($files) Then
	Dim $DATA[2][6]
	$DATA[0][0] = 1
	$DATA[1][0] = "Noname.txt" ; или new_tab()!!!!!!!!!!!!
	$DATA[1][1] = ''
Else
	Dim $DATA[$files[0]+1][6]
	$DATA[0][0] = $files[0]
EndIf
;-----------------------------TEST-----------------------------
; не рабочий кусок
$tab_space = GUICtrlCreateTab(5, 5, $Set[2]-10, $set[3]-50)

For $i = 1 to $DATA[0][0]
	$DATA[$i][0]=$files[$i]
	GUICtrlCreateTabItem($DATA[$i][0])
	$DATA[$i][5] = GUICtrlCreateEdit ('', 10, 50, $set[2]-20, $set[3]-100)
Next
;-----------------------------TEST-----------------------------


; Проверка стартовых параметров окна...
if $Set[4] = 1 Then WinSetState ($win, "", @SW_MAXIMIZE) ; ...на развернутость
If $Set[14] <> 0 Then ; ...на прозрачность
	WinSetTrans ($win, '', -255*$Set[14]/100)
EndIf
If $set[19] = $GUI_CHECKED Then ; ...на автоцентрирование
	$winpos = WinGetPos ($win)
	WinMove ($win, '', $winpos[0]+1, $winpos[1]+1)
EndIf
;//

GUISetState (@SW_SHOW)
While 1
	$msg = GUIGetMsg ($win)
	Select
		case $msg = $GUI_EVENT_CLOSE or $msg = $m_exit
			Myexit()
		Case $msg = $m_CRLF
			$set[17]=_GUICtrlSwitchState($m_CRLF, $set[17], $GUI_CHECKED, $GUI_UNCHECKED)
		Case $msg = $m_last_tab
			$set[18] = _GUICtrlSwitchState($m_last_tab, $set[18], $GUI_CHECKED, $GUI_UNCHECKED)
		Case $msg = $m_autocenter
			$set[19] = _GUICtrlSwitchState($m_autocenter, $set[19], $GUI_CHECKED, $GUI_UNCHECKED)
			If $set[19] = $GUI_CHECKED Then
				$winpos = WinGetPos ($win)
				WinMove ($win, '', $winpos[0]+1, $winpos[1]+1)
			EndIf
		Case $msg = $m_set_close
			$gui_set_close = GUICreate (@ScriptName, 275, 160, -1, -1, '', $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
			Dim $gui_set_close_ctrl[8]
			$gui_set_close_ctrl[0]= GUICtrlCreateCheckbox ("Закрывать окно если оно неактивно", 10, 10, 330, 25)
			$gui_set_close_ctrl[1]= GUICtrlCreateGroup ("Таймер: ", 10, 35, 250, 50)
			$gui_set_close_ctrl[2]= GUICtrlCreateLabel ("Min:", 20, 55, 50, 20, 0x01)
			$gui_set_close_ctrl[3]= GUICtrlCreateInput ("0", 80, 50, 50, 25)
			$gui_set_close_ctrl[4]= GUICtrlCreateUpdown ($gui_set_close_ctrl[3])
			$gui_set_close_ctrl[5] = GUICtrlCreateLabel ("Sec:", 130, 55, 50, 20, 0x01)
			$gui_set_close_ctrl[6]= GUICtrlCreateInput ("0", 190, 50, 50, 25)
			$gui_set_close_ctrl[7]= GUICtrlCreateUpdown ($gui_set_close_ctrl[6])
			$gui_set_close_accept = GUICtrlCreateButton ("Океюшки!", 10, 95, 250, 30)

			GUICtrlSetLimit ($gui_set_close_ctrl[4], 59, 0)
			GUICtrlSetLimit ($gui_set_close_ctrl[7], 59, 0)
			GUICtrlSetData ($gui_set_close_ctrl[6], ($set[15]/60000 - Floor ($set[15]/60000))*60)
			GUICtrlSetData ($gui_set_close_ctrl[3], Floor ($set[15]/60000))

			_GUICtrlSwitchState($gui_set_close_ctrl[0], $set[16], $GUI_UNCHECKED, $GUI_CHECKED)
			For $i = 1 to 7
				_GUICtrlSwitchState($gui_set_close_ctrl[$i], $set[16], $GUI_DISABLE, $GUI_ENABLE)
			Next

			GUISetState (@SW_SHOW, $gui_set_close)
			Do
				$msg = GUIGetMsg ($gui_set_close)
				If $msg = $gui_set_close_ctrl[0] Then
					$set[16] = _GUICtrlSwitchState('', $set[16], True, False)
					For $i = 1 to 7
						_GUICtrlSwitchState($gui_set_close_ctrl[$i], $set[16], $GUI_DISABLE, $GUI_ENABLE)
					Next
				EndIf
			Until $msg = $gui_set_close_accept

			$min = GUICtrlRead ($gui_set_close_ctrl[3])
			If StringIsDigit($min)=0 Then $min  = 0
			$sec = GUICtrlRead ($gui_set_close_ctrl[6])
			If StringIsDigit($sec)=0 Then $sec  = 0
			$set[15]= $min*60000+$sec*1000
			GUIDelete ($gui_set_close)
			$gui_set_close=-1
	EndSelect
WEnd
; -------------------------------FUNC------------------------------------------
Func ReadSettings ()
	$ini = StringTrimRight (@ScriptFullPath, 4)&".ini"
	$set[0] = IniRead ($ini, "Settings", "x", -1)
	$set[1] = IniRead ($ini, "Settings", "y", -1)
	$set[2] = IniRead ($ini, "Settings", "w", 640)
	$set[3] = IniRead ($ini, "Settings", "h", 480)
	$set[4] = IniRead ($ini, "Settings", "max", 0)
	$set[5] = IniRead ($ini, "Settings", "font_1", 0)
	$set[6] = IniRead ($ini, "Settings", "font_2", "Arial")
	$set[7] = IniRead ($ini, "Settings", "font_3", 10)
	$set[8] = IniRead ($ini, "Settings", "font_4", 400)
	$set[9] = IniRead ($ini, "Settings", "font_5", 0)
	$set[10] = IniRead ($ini, "Settings", "font_6", 0x000000)
	$set[11] = IniRead ($ini, "Settings", "font_7", 0x000000)
	$set[12] = IniRead ($ini, "Settings", "bgcolor", 0xFFFFFF)
	$set[13] = IniRead ($ini, "Settings", "last_tab", 1)
	$set[14] = IniRead ($ini, "Settings", "trans", 0)
	$set[15] = IniRead ($ini, "Settings", "nonactive_close_timeout", 0)
	$set[16] = IniRead ($ini, "Settings", "nonactive_close", True)
	$set[17] = IniRead ($ini, "Settings", "CRLF", False)
	$set[18] = IniRead ($ini, "Settings", "remember_last_tab", False)
	$set[19] = IniRead ($ini, "Settings", "autocenter", True)
	Return ($set)
EndFunc

Func WinSetDefaultLang($sLayoutID, $hWnd = 0)
    Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)

    If Not @error And $aRet[0] Then
        If $hWnd = 0 Then
            $hWnd = WinGetHandle(AutoItWinGetTitle())
        EndIf

        DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
        Return 1
    EndIf

    Return SetError(1)
EndFunc

Func FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
	Local $hSearch, $sFile, $sFileList, $sDelim = "|"
	$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
	If Not FileExists($sPath) Then Return SetError(1, 1, "")
	If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
	If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
	$hSearch = FileFindFirstFile($sPath & $sFilter)
	If @error Then Return SetError(4, 4, "")
	While 1
		$sFile = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		If ($iFlag + @extended = 2) Then ContinueLoop
		$sFileList &= $sDelim & $sFile
	WEnd
	FileClose($hSearch)
	If Not $sFileList Then Return SetError(4, 4, "")
	Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc

Func _GUICtrlSwitchState($ctrlid, $param, $true, $false)
	If IsBool($param) Then $param=Number($param)
    If not StringIsDigit($param) Then
        Switch $param
            Case "True", "+" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $false
            Case "False", "-" ; сюда можно добавлять другие СТРОКОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    Else
        Switch $param
            Case 1,  $GUI_CHECKED, $GUI_ENABLE, $GUI_SHOW, $GUI_FOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $false
            Case 0, $GUI_UNCHECKED, $GUI_DISABLE, $GUI_HIDE , $GUI_NOFOCUS ; сюда можно добавлять другие ЧИСЛОВЫЕ значения
                $param = $true
            Case Else
                Return -1
        EndSwitch
    EndIf
    If $ctrlid > 0 Then GUICtrlSetState ($ctrlid, $param)
    Return $param
EndFunc

Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam)
	If $set[19] = 1 Then
		Local $stRect = DllStructCreate("int;int;int;int")
		Local $stWinPos = DllStructCreate("uint;uint;int;int;int;int;uint", $lParam)
		DllCall("User32.dll", "int", "SystemParametersInfo", "int", 0x30, "int", 0, "ptr", DllStructGetPtr($stRect), "int", 0)
		Local $nRight  = DllStructGetData($stRect, 3) - DllStructGetData($stWinPos, 5)
		Local $nBottom = DllStructGetData($stRect, 4) - DllStructGetData($stWinPos, 6)
		If $nRight/2<>DllStructGetData($stWinPos, 3) Then DllStructSetData($stWinPos, 3, $nRight/2)
		If $nBottom/2<>DllStructGetData($stWinPos, 4) Then DllStructSetData($stWinPos, 4, $nBottom/2)
	EndIf
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
	#forceref $iMsg, $wParam
	If $hWnd = $win Then
		Local $tMINMAXINFO = DllStructCreate("int;int;" & _
				"int MaxSizeX; int MaxSizeY;" & _
				"int MaxPositionX;int MaxPositionY;" & _
				"int MinTrackSizeX; int MinTrackSizeY;" & _
				"int MaxTrackSizeX; int MaxTrackSizeY", _
				$lParam)
		DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 240) ; минимальные размеры окна
		DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 160)
	EndIf
EndFunc

Func MyExit()
	GUIDelete ($win)
	Exit
EndFunc

Func Exit_Timer()
	$set[16] = _GUICtrlSwitchState('', $set[16], False, True)
	If $set[16] = True And $gui_set_close=-1 Then
		$timer = TimerInit ()
		Do
			Sleep(250)
			If WinGetState ($win) <> 7 Then ExitLoop
		Until TimerDiff ($timer) >= $set[15]
		If	WinGetState ($win) = 7 Then Myexit()
	EndIf
EndFunc


Посмотри, пожалуйста.
 
Верх