Что нового

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

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Версия AutoIt
3.3.16.0
Версия
2.0.0.3
Категория: Автоматизация, Разное

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

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

Код/Пример: Исходник в архиве. Следовательно я не против модификации ;).
Скачать: mega.nz
Автор: Pelerin
------------------------------------------------------------
Обновил версию до 2.0.0.3
Update list:
v 2.0.0.3
1. Код портирован и пересобран с версии AutoIt v3.2 на v3.3.16.0
2. Шифрование заметок переведено с метода "_StringEncrypt" на "_Crypt_(Encrypt/Decrypt)Data"
3. Выделен модуль Globals.au3
4. Пофикшен баг когда при удалении последней заметки ее контент перезаписывал предыдущую заметку
5. Пофикшен лейаут в меню "About"
6. Добавлено закрытие дочерних окон по нажатию на "Esc"
7. Пофикшен баг когда при добавлении новой заметки через хоткеи не сохранялся текст текущей заметки
8. Увеличен дефолтный размер окна с 640х480 до 800х600

v 2.0.0.2
1. Улучшена многоязыковая поддержка.
2. Пару мелких фиксов

v 2.0.0.1
1. Исправлены баги с запоминанием позиции окна
2. Исправлен баг с шифрованием
3. Исправлено еще несколько багов
4. Подчищен код
5. Теперь при сохранении текста, переписывает только модифицированные файлы (ускорено закрытие программы)
6. Добавлена опция "поверх всех окон"
7. Добавлена многоязычность
8. Исправлен баг при удалении заметок (терялся текст соседней)
9. Подшаманен интерфейс (удалены лишние кнопки "ok" в диалогах)
10. Поправлен перевод на руский и украинский
11. Справка по горячим клавишам теперь тоже переводится

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

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

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

Вложения

  • ToDo-prog_v1.0.0.9.zip
    458.6 КБ · Просмотры: 0
  • ToDo-prog_v2.0.0.2.zip
    471.5 КБ · Просмотры: 1
  • ToDo-prog_v2.0.0.3.zip
    870.5 КБ · Просмотры: 15
Последнее редактирование:

`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,724
Это потому, что в 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
Репутация
626
Pelerin
Отличное начинание.
OffTopic:
Побольше бы таких участников форума, которые приходят с идеями в первую очередь, и за вопросами во вторую :whistle:
 

Yashied

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

Pelerin

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

Yashied

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

Не держут правую и левую границы.

P.S

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

Pelerin

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

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

Yashied

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

: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
Репутация
181
В новой версии, можно добавить в меню "Настройки" пункт "Шифровать".
Данный пукт будет шифровать текст (функция _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


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