Jump to content
Sign in to follow this  
JScript

O que é uma Janela?

Recommended Posts

Capítulo 01 - O que é uma Janela?

 

 

          Obviamente, "Janela" é o centro do Windows! É tão importante que até o nome do Sistema Operacional é o mesmo! Mas o que é mesmo uma Janela? Quando se pensa em janelas, o que nos vem rápidamente à cabeça, provavelmente é isso:

woodwi10.png

 

          Sério, é isso mesmo, o cérebro entra em "conflito". Mas em matéria de programação, Janela - que em inglês é Window - obviamente é isso aqui:

aboutw10.jpg

Janela do Aplicativo

 

          Este tipo de janela é chamada de Janela do Aplicativo ou Janela Principal, onde típcamente há os frames, uma barra com o título, os botões: Minimize, Maximize e Close, vários elementos padrões da interface chamada de UI ou GUI (Interface do Usuário ou Gráficos da Interface do Usuário).

          O frame ou borda é chamado de non-client area da janela, é chamada assim porque o SO gerencia essas área da janela. A área interna é chamada de client area: essa é a parte da janela que seu programa controla!

 

          Aqui está outra forma de Janela:

ic378510.png

 

          Ficou surpreso? Então você é novo em matéria de programação Windows! Pois saiba que os controles como botões e caixas de edição (edit box) são por sí só Janelas! A maior diferença entre uma janela de controle e uma Janela do Aplicativo é que o controle não existe sozinho... O controle é posicionado em relação às cordenadas da Janela, ou seja, quando você arrasta ela, o controle também é movido! Assim como também o controle e a Janela se comunicam entre sí.

 

          Então quando você pensar em Janelas, não pense simplesmente em Janela do Aplicativo, e sim que uma Janela é uma aplicação programada onde:

* Ocupa um espaço da tela (Área de trabalho - Desktop).

* Visível ou não em um determinado momento.

* Passível de formar-se sozinha (redraw).

* Responde à eventos do usuário ou o SO.

 

Parent Windows and Owner Windows

Janela Pai e Janela proprietária

 

          No caso de um UI, a janela passa a ser filho da Janela do Aplicativo, ou seja, a Janela do Aplicativo é o pai da janela de controle. A janela pai fornece o sistema de coordenadas utilizado para o posicionamento da janela filho. Ter uma janela pai afeta os aspectos da aparência da outra janela, por exemplo, uma janela filho é moldada de modo que nenhuma parte sua possa aparecer fora das cordenadas da sua janela pai.

 

          Outra interação é a relação entre uma Janela do Aplicativo e uma janela de diálogo - MsgBox(). Quando um aplicativo exibe uma caixa de diálogo, a Janela do Aplicativo torna-se a Janela Proprietária (Owner Window), e o MsgBox() propriedade da outra (Owned Window). Uma Owned Windo sempre aparece na frente de sua Owner Window. Ele ficará oculta quando a Owner Window for minimizada e será fechada ao mesmo tempo com a sua Janela Proprietária.

 

          A imagem seguinte mostra um exemplo:

parent10.png

 

          A Janela do Aplicativo possui a janela de diálogo, a janela de diálogo é pai de ambas as janelas dos controles (botões). O diagrama a seguir mostra essas relações:

diagra10.png

 

Window Handles

Identificador

 

          Janelas são objetos - ambos contém códigos e dados - mas não são classes! Ao invés disso, um programa faz referência a uma janela usando um valor chamado de Handles (Identificador). Um identificador é apenas um número que o SO usa para identificar um objeto. Você pode imaginar o SO como tendo uma grande tabela de todas as janelas que foram criadas. Ele usa essa tabela para identificar e gerenciar cada uma delas. A sigla para Handles é HWND, que pode ser pronunciado como "RaiUind." Handles são retornados pelas funções que criam as janelas: GuiCreate() e _WinAPI_CreateWindowEx().

 

          Para executar um evento em uma janela, vou dar um exemplo de uma função que recebe um valor $HWND como parâmetro: MoveWindow, onde em AutoIt seria _WinAPI_MoveWindow()

_WinAPI_MoveWindow($hWnd, $iX, $iY, $iWidth, $iHeight [, $fRepaint = True])

O primeiro parâmetro é o identificador para a janela (Handle) que você deseja mover, os outros parâmetros são as cordenadas para mover a janela.

 

Cordenadas da tela e Janela.

 

          As coordenadas são medidas em pixels (DIB -> device-independent), mas isso ficará para um outro tutorial sobre GDI+. Dependendo da aplicação, podemos medir as coordenadas em relação à tela, em relação a uma janela (incluindo o frame), ou relativos à client area de uma janela. Por exemplo, você sposiciona uma janela na tela usando coordenadas da tela, mas os controles estarão dentro da janela usarão as coordenadas do cliente (client area). Em cada caso, a origem será sempre o canto superior esquerdo da região, tendo as cordenadas X = 0 e Y = 0.

 

corord10.png

 

 

Capítulo 02 - Criando sua 1ª Janela.

 

 

          Neste capítulo nós vamos aprender como criar nosso primeiro programa tendo uma janela, usando um padrão que aos poucos acredito que será adotado por muitos, pois é de fácil aprendizado, inicialização, leitura e manutenção! Esse será nosso ponto de partida: mais tarde, vamos adicionar gráficos, texto, entrada do usuário "Input()" e muito mais.

 

          Aqui está o código fonte:

; #INDEX# =======================================================================================================================
; Title .........:
; Module ........: Main
; Author ........:
; Support .......:
; AutoIt Version.:
; Language ......:
; Description ...: Template AutoIt script.
; ===============================================================================================================================

#region AutoIt3Wrapper directives section
; ===============================================================================================================================
;** AUT2EXE settings
;#AutoIt3Wrapper_Icon=                                              ;Filename of the Ico file to use
;#AutoIt3Wrapper_OutFile=                                           ;Target exe/a3x filename.
;#AutoIt3Wrapper_OutFile_Type=                                      ;a3x=small AutoIt3 file;  exe=Standalone executable (Default)
;#AutoIt3Wrapper_OutFile_X64=                                       ;Target exe filename for X64 compile.
#AutoIt3Wrapper_Compression=0                                       ;Compression parameter 0-4  0=Low 2=normal 4=High. Default=2
#AutoIt3Wrapper_UseUpx=n                                            ;(Y/N) Compress output program.  Default=Y
;#AutoIt3Wrapper_UPX_Parameters=                                    ;Override the default setting for UPX.
;#AutoIt3Wrapper_Change2CUI=                                        ;(Y/N) Change output program to CUI in stead of GUI. Default=N
#AutoIt3Wrapper_Compile_both=Y                                      ;(Y/N) Compile both X86 and X64 in one run. Default=N
;** AU3Check settings
;#AutoIt3Wrapper_Run_AU3Check=                          ;(Y/N) Run au3check before compilation. Default=Y
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6    ;Au3Check parameters
;#AutoIt3Wrapper_AU3Check_Stop_OnWarning=               ;(Y/N) N=Continue on Warnings.(Default) Y=Always stop on Warnings
; ===============================================================================================================================
#endregion AutoIt3Wrapper directives section

; Includes com as variáveis constantes usadas na criação da janela.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;---->
wWinMain() ; Chama o "Ponto-de-entrada" (Entry-Point) do programa.
;<----

; #FUNCTION# ====================================================================================================================
; Name ..........: wWinMain
; Description ...: Entry-Point program.
; Syntax ........: wWinMain( [$hInstance = 0[, $vCmdLine = $CmdLine[, $iCmdShow = @SW_SHOW]]] )
; Parameters ....: $hInstance   - [optional] hInstance is needed for certain functions like: load icons, bitmaps... Default is 0.
;                  $vCmdLine    - [optional] Contains the command-line arguments. Default is $CmdLine.
;                  $iCmdShow    - [optional] This flag that says whether the main window will be minimized, maximized or normally.
;                               Default is @SW_SHOW.
; Return values .: Success      - Returns the last @error value.
;                  Failure      - Returns the last @error value.
; Author ........: João Carlos (Jscript FROM Brazil)
; Modified ......:
; Remarks .......: The return value is not used by the operating system, but you can use the return
;               value to convey a status code to some other program that you write.
; Related .......:
; Link ..........: http://msdn.microsoft.com/en-us/library/ff381406%28v=VS.85%29.aspx -> WinMain: The Application Entry Point
; Example .......: wWinMain()
; ===============================================================================================================================
Func wWinMain($hInstance = 0, $vCmdLine = $CmdLine, $iCmdShow = @SW_SHOW) ; Do not modify this Func.
#forceref $hInstance, $vCmdLine, $iCmdShow ; Do not remove this line.

; Script Start - Add your code below here
Local $hForm1

; Sintax: GUICreate( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
$hForm1 = GUICreate("Aprendendo sobre Janelas.", 320, 240) ; Cria nossa Janela no centro da tela.
If Not $hForm1 Then Return @error

GUISetState($iCmdShow) ; Define o "estado" da Janela, no caso $iCmdShow = @SW_SHOW, mostra a Janela.

; Executa a GUI enquanto o usuário não fecha.
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE ; = -3, caso o usuário clique no botão [X]
            Return @error
            ;Case
    EndSwitch
WEnd

GUIDelete() ; Deleta a Janela.

Return @error ; Do not remove this line.
EndFunc   ;==>wWinMain

 

          Nossa Janela deverá ter essa aparência:

aboutw10.jpg

 

          Na instalação do AutoIt, é adicionado um template chamado Template.au3, onde é só clicar com o botão direito e escolher no menu suspenso: [Novo >AutoIt v3 Script] - aqui está um template que tenho agora como padrão para iniciar a criação de um script. Salve em %Windir%\ShellNew, onde %Windir% é sua instalação do Windows, exemplo: C:\

 

Download do Template.au3: Template.au3

 

 

Capítulo 03 - Entendendo as Classes de Janela.

 

 

Neste capítulo vamos ver como o Windows trata cada elemento (janela) de forma separada através de Classes (ClassName)! Lembrem-se: um botão, um combobox, um label, um input... Todos são Janelas!!!

 

          Vamos ver como diferenciar um elemento do outro através da seguinte explicação:

 

Básicamente em C (...) usamos a seguinte definição para criar uma Janela:

static TCHAR szNomeClasse[] = TEXT ("AutoItErrorTrap_ID") ;

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = szNomeClasse;

Em AutoIt, o código acima ficaria (mais-ou-menos) da seguinte forma:

[autoit]

$sAET_CLASSNAME = 'AutoItErrorTrap_ID:'

$tClass = DllStructCreate('wchar[' & StringLen($sAET_CLASSNAME) + 1 & ']')

DllStructSetData($tClass, 1, $sAET_CLASSNAME)

$tWCEX = DllStructCreate($tagWNDCLASSEX)

DllStructSetData($tWCEX, 'Size', DllStructGetSize($tWCEX))

DllStructSetData($tWCEX, 'Style', 0);BitOR($CS_VREDRAW, $CS_HREDRAW))

DllStructSetData($tWCEX, 'hWndProc', DllCallbackGetPtr($hAET_WINDOW_PROC))

DllStructSetData($tWCEX, 'ClsExtra', 0)

DllStructSetData($tWCEX, 'WndExtra', 0)

DllStructSetData($tWCEX, 'hInstance', $hAET_INSTANCE)

DllStructSetData($tWCEX, 'hIcon', $hIcon)

DllStructSetData($tWCEX, 'hCursor', _WinAPI_LoadCursor(0, $IDC_ARROW))

DllStructSetData($tWCEX, 'hBackground', _WinAPI_GetSysColorBrush($COLOR_WINDOW))

DllStructSetData($tWCEX, 'MenuName', 0)

DllStructSetData($tWCEX, 'ClassName', DllStructGetPtr($tClass))

DllStructSetData($tWCEX, 'hIconSm', 0)

[/autoit]

          E você me afirma: "Mas JScript, em AutoIt para criar uma janela basta usar a função GUICreate()!!!" - Concordo plenamente, mas por trás dessa função o AutoIt usa a extrutura em C acima citada e nesse capítulo vamos entender como o SO separa cada tipo de janela: Botões, ComboBox, Labels -> Todos são controles estáticos (Static)!!!

 

          Experimentem executar os dois exemplos abaixo, eles fazem a mesma tarefa, mas são completamentes diferentes em sua extrutura, apesar de serem escritos em AutoIt, mas usam formas diferentes de criar uma janela! Ok, em AutoIt é extremamente fácil e o código é bem menor, mas a título de aprendizado, o outro código lhes mostrará ao "pé-da-letra" como criar uma janela.

 

Downloads

AutoItGUI.au3

C++GUI.au3

 

          Executem ambos os códigos, comparem as suas diferenças e vejam o porque o AutoIt é mais fácil de escrever! Mááááassss percebam que o segundo exemplo apesar de ter mais linhas de código e ser aparentemente complicado, torna-se mais maleável de manipular e mais poderoso, sem dúvidas!!!

 

A tabela abaixo descreve o sistema de classes avaliadas para todos os processos.

 

* Classe------------------Descrição

* Button------------------>A classe para os botões.

* ComboBox---------------->Usada em combo box.

* Edit-------------------->Para o controle de edição "edit".

* ListBox----------------->Controle list box.

* MDIClient--------------->Classe para janelas MDI.

* ScrollBar--------------->O nome da classe usada em "scroll bar'.

* Static------------------>Classe para controles "static".

 

(...) Continua...

 

 

 

Continua em breve...

 

Equipe AutoIt Brasil

  • Like 6

Share this post


Link to post
Share on other sites

Muito obrigado @Jonatas, por tudo mesmo!

Abraços,

 

João Carlos.

Share this post


Link to post
Share on other sites

kkkk, verdade, mas não sei muito não, é mais técnico, ai me enrolo...

Abraços,

 

João Carlos.

Share this post


Link to post
Share on other sites

Tava dando uma olhada gostei muito do topico apesar de eu enter o que e janela no sentido do windows eu não poderia esplicar tão bem se vc quiser ate pode adicionar uma coisa o proprio WIndows tem esse nome por causa da janela prq esse nome foi dado porque ele executava os comandos do DOS numa UI facilitando o acesso a quem não entendia de programação tem uma boa explicação no filme "Piratas do Vale do Cilicio" tbm mostra a historia o componente mais importante para o uso da Janela que e o 4430-1-com.nd.android.pandatheme.p_mickeymousetheme.jpg

Share this post


Link to post
Share on other sites

(...)o proprio WIndows tem esse nome por causa da janela prq esse nome foi dado porque ele executava os comandos do DOS numa UI facilitando o acesso a quem não entendia de programação(...)

Foi por esse motivo que eu coloquei essa frase no tópico:

(...) Obviamente, "Janela" é o centro do Windows! É tão importante que até o nome do Sistema Operacional é o mesmo!(...)

Abraços,

 

João Carlos.

Share this post


Link to post
Share on other sites

bem explicado!

 

e sei o quanto é complicado fazer um tutorial, pois mesmo quando a gente tem certeza que ta certo, é preciso estudar de novo

para não cometer erros.

 

tanto é que não tenho nenhum tutorial no forum, mais um dia eu faço um! :(

Share this post


Link to post
Share on other sites

Muito bom! Ta aí um tutorial fácil de entender, até eu que já criei vários e vários scripts aprendi alguma coisa com ele.

Share this post


Link to post
Share on other sites

Capítulo 03 adicionado (falta conclusão), espero que gostem...

 

Continua em breve!

 

JS

Share this post


Link to post
Share on other sites

Já está corrigido, é que as vezes o par "Copiar/Colar" torna mais rápido, mas de vez em quando isso acontece...

 

JS

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×