Что нового

Задача: шаблон программы с GUI интерфейсом

Aleksandr Prilutskiy

Знающий
Сообщения
29
Репутация
9
Приветствую всех! (это моя первая тема на этом форуме, поэтому заранее извиняюсь, если по каким либо причинам я не впишусь в ваше сообщество)
Я занимаюсь AutuIt-ом 4 года. И обнаружил, что при создании любой новой задачи приходится сначала тратить время на создание оболочки программы.
Процесс этот рутинный, и хуже всего то, что часто пока делаешь окошки может потеряться основная идея приложения.
Для решения этой задачи я неоднократно пробовал создавать "шаблоны" программ, на основе которых можно быстро создать новое приложение с привычным интерфейсом и базовыми возможностями.
У меня возникла идея поделиться тем, что у меня получилось. Хотел бы услышать замечания, предложения и пожелания.
Было бы идеально, если бы мы совместно сделали максимально удобный такого рода шаблон для программ.

Вот собственно текст программы:
Код:
#Region Header
#cs

	Title:			*
	Filename:		*.au3
	Description:	Шаблон для windows-приложения
	Author:			*
	Version:		0.0.1
	Date:			11.06.2014
	Uses:

#ce
#EndRegion Header

#Region AutoIt3Wrapper directives section
#AutoIt3Wrapper_Icon=Icon.ico
#AutoIt3Wrapper_OutFile=NewApp.exe
#AutoIt3Wrapper_OutFile_Type=exe
#AutoIt3Wrapper_Res_LegalCopyright=*
#AutoIt3Wrapper_Res_Description=*
#AutoIt3Wrapper_Res_Fileversion=0.0.1
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_UseUpx=Y
#AutoIt3Wrapper_UseX64=N
#AutoIt3Wrapper_Version=P
#AutoIt3Wrapper_Compile_both=N
#EndRegion AutoIt3Wrapper directives section

#Region Initialization
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <String.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)
Opt("TrayIconHide", 1)

Global	$WindowWidth	= 600										; ширина окна программы
Global	$WindowHeight	= 500										; высота окна программы
Global	$WindowName		= "NewApp"									; заголовок окна программы
Global	$sIniFileName	= @ScriptDir & "\NewApp.ini"				; имя файла конфигурации программы

Global	$GUI_WindowMain												; главное окно программы
Global	$GUI_EditLog												; журнал событий
Global	$GUI_StatusBar												; строка состояния программы

Global	$WindowSetupName	= "Настройки программы"					; заголовок окна настроек программы
Global	$WindowSetupWidth	= 450									; ширина окна настроек программы
Global	$WindowSetupHeight	= 350									; высота окна настроек программы
Global	$GUI_WindowSetup											; окно настроек программы

CreateGUI()
LoadConfigFile()
Do
 Sleep(100)
Until False
#EndRegion Initialization

#Region GUI
;----------------------------------------- НАСТРОЙКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА -------------------------------

; #FUNCTION# ====================================================================================================
; Name...........:	CreateGUI
; Description....:	Создание главного окна программы
; Syntax.........:	CreateGUI()
; ===============================================================================================================
Func CreateGUI()
 $GUI_WindowMain = GUICreate($WindowName, $WindowWidth, $WindowHeight)
 GUISetOnEvent($GUI_EVENT_CLOSE, "OnExit")
 Local $GUI_MenuItem = GUICtrlCreateMenu("Файл")
 GUICtrlSetOnEvent(GUICtrlCreateMenuItem("Настройки", $GUI_MenuItem), "OnSetup")
 GUICtrlSetOnEvent(GUICtrlCreateMenuItem("Выход", $GUI_MenuItem), "OnExit")
 $GUI_EditLog = GUICtrlCreateEdit("", 5, 5, $WindowWidth - 10, $WindowHeight - 50, Dec("00200000"))
 _GUICtrlEdit_SetReadOnly($GUI_EditLog, True)
 GUICtrlSetCursor($GUI_EditLog, 2)
; место для добавления новых элементов интерфейса главного окна программы
 $GUI_StatusBar = _GUICtrlStatusBar_Create($GUI_WindowMain)
 GUISetState()
 HotKeySet("{F5}", "Test1")
 HotKeySet("{ESC}", "OnExit")
EndFunc ;==>CreateGUI

; #FUNCTION# ====================================================================================================
; Name...........:	SaveConfigFile
; Description....:	Сохранение настроек программы в файл конфигурации
; Syntax.........:	SaveConfigFile()
; ===============================================================================================================
Func SaveConfigFile()
 Local $s = WinGetPos($GUI_WindowMain)
 If $s[0] > 0 Then IniWrite($sIniFileName, "Window", "Pos_X", $s[0])
 If $s[1] > 0 Then IniWrite($sIniFileName, "Window", "Pos_Y", $s[1])
EndFunc ;==>SaveConfigFile

; #FUNCTION# ====================================================================================================
; Name...........:	LoadConfigFile
; Description....:	Загрузка настроек программы из файла конфигурации
; Syntax.........:	LoadConfigFile()
; ===============================================================================================================
Func LoadConfigFile()
 Local $x = IniRead($sIniFileName, "Window", "Pos_X", 0)
 Local $y = IniRead($sIniFileName, "Window", "Pos_Y", 0)
 If $x > 0 And $y > 0 Then WinMove("[TITLE:" & $WindowName & "]", "", $x, $y)
EndFunc ;==>LoadConfigFile

; #FUNCTION# ====================================================================================================
; Name...........:	OnExit
; Description....:	Выход из программы или прерывание загрузки файла
; Syntax.........:	OnExit()
; ===============================================================================================================
Func OnExit()
 SaveConfigFile()
 GUIDelete()
 Exit
EndFunc ;==>OnExit

; #FUNCTION# ====================================================================================================
; Name...........:	_LogWrire
; Description....: 	Добавление строки в журнал событий
; Syntax.........:	_LogWrire($Text)
; Parameters.....:	$Text		- Строка, для добавления в журнал событий
; ===============================================================================================================
Func _LogWrire($Text)
 _GUICtrlEdit_AppendText($GUI_EditLog, $Text)
EndFunc ;==>_LogWrire

; #FUNCTION# ====================================================================================================
; Name...........:	_LogWrireLn
; Description....: 	Добавление строки в журнал событий с переводом строки
; Syntax.........:	_LogWrireLn($Text)
; Parameters.....:	$Text		- Строка, для добавления в журнал событий
; ===============================================================================================================
Func _LogWrireLn($Text)
 _LogWrire($Text & @CRLF)
EndFunc ;==>_LogWrireLn

#EndRegion GUI

#Region Setup
;-------------------------------------- ФУНКЦИИ РАБОТЫ С ОКНОМ НАСТРОЙКИ ПРОГРАММЫ ------------------------------

; #FUNCTION# ====================================================================================================
; Name...........:	OnSetup
; Description....:  Создание окна настроек программы
; Syntax.........:	OnSetup()
; ===============================================================================================================
Func OnSetup()
 Local $s = "[TITLE:" & $WindowSetupName & "]"
 If WinExists($s) Then Return WinActivate($s)
 $s = WinGetPos($GUI_WindowMain)
 Local $x = IniRead($sIniFileName, "Setup", "Pos_X", $s[0] + ($WindowWidth - $WindowSetupWidth) / 2)
 Local $y = IniRead($sIniFileName, "Setup", "Pos_Y", $s[1] + ($WindowHeight - $WindowSetupHeight) / 2)
 $GUI_WindowSetup = GUICreate($WindowSetupName, $WindowSetupWidth, $WindowSetupHeight, $x, $y, _
  BitOR($WS_BORDER, $WS_CLIPSIBLINGS, $DS_SETFOREGROUND, $WS_CAPTION, $DS_MODALFRAME))
; место для добавления новых элементов интерфейса окна настроек программы
 GUICtrlSetOnEvent(GUICtrlCreateButton("Сохранить", $WindowSetupWidth / 2 - 155, _
                   $WindowSetupHeight - 40, 150, 30), "OnSetupSave")
 GUICtrlSetOnEvent(GUICtrlCreateButton("Отменить", $WindowSetupWidth / 2 + 5, _
                   $WindowSetupHeight - 40, 150, 30), "OnSetupExit")
 GUISetState()
 HotKeySet("{ENTER}", "OnSetupSave")
 HotKeySet("{ESC}", "OnSetupExit")
EndFunc ;==>OnSetup

; #FUNCTION# ====================================================================================================
; Name...........:	OnSetupSave
; Description....:  Сохранение настроек программы
; Syntax.........:	OnSetupSave()
;
; Remarks .......:	Обработка нажатия кнопки "Сохранить" в окне настроек программы
; ===============================================================================================================
Func OnSetupSave()
 OnSetupExit()
EndFunc ;==>OnSetupSave

; #FUNCTION# ====================================================================================================
; Name...........:	OnSetupExit
; Description....:  Закрытие окна настроек программы
; Syntax.........:	OnSetupExit()
;
; Remarks .......:	Обработка нажатия кнопки "Отменить" в окне настроек программы
; ===============================================================================================================
Func OnSetupExit()
 Local $s = WinGetPos($GUI_WindowSetup)
 If $s[0] > 0 Then IniWrite($sIniFileName, "Setup", "Pos_X", $s[0])
 If $s[1] > 0 Then IniWrite($sIniFileName, "Setup", "Pos_Y", $s[1])
 GUIDelete($GUI_WindowSetup)
 HotKeySet("{ENTER}")
 HotKeySet("{ESC}", "OnExit")
EndFunc ;==>OnSetupExit

#EndRegion Setup

; #FUNCTION# ====================================================================================================
; Name...........:	.
; Description....:  Шаблон новой функции
; Syntax.........:	.
; Return values..:	Success		- .
;				Failure		- .
; Remarks .......:	.
; ===============================================================================================================
Func Test1()
 _LogWrireLn("OK")
EndFunc ;==>Test1

Краткое описание:
- Программа создает окно со строкой меню (сверху) и строкой состояния (снизу).
- Все пространства окна занимает поле. в которое можно выводить текстовую информацию.
- Через меню можно вызвать окно настроек (тоже в качестве шаблона оно пустое).
- Главное окно и окно настроек после закрытия сохраняют свои положения и при следующем открытии открываются на месте, где были закрыты.
- Добавлена обработка клавиш Esc и Enter для быстрого обращения с окнами.
- Текст программы содержит удобное для меня форматирование и комментарии, на основе которых можно добавлять новые функции.

На основе этого шаблона я быстро создаю новые приложения.
Надеюсь мой опыт может кому нибудь пригодиться.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
У каждой задачи свои шаблоны. У меня, к примеру, возможность появления подобного вида шаблона равна 0. Да и проще скопировать похожий проект.

Вообще можно было бы сделать генератор шаблонов по типу MS Visual Studio.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Аналогичная ситуация. У меня нет одинаковых проектов. И не представляю, как можно было бы имеющиеся проекты подвести к единому шаблону.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Всегда накидываю новый шаблон. Как правило занимает не более 10 минут.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
я считаю, что невозможно написать единый шаблон. можно сделать генератор шаблонов. да и то, он будет заточен под тот графический интерфейс, который привычен именно тебе.
для наброска "скелета" окна я использую KodaForm. Потом вручную уже довожу его до желаемого вида. а это процентов 70 работы по доделки вида окна ( я не притязателен к интерфейсу)
во многих работах мне приходится использовать много окон. и в основном они промежуточные. без главного вообще.
 
Верх