Trabalhando com interface do Windows em Cocoa

Talvez o elemento mais importante de qualquer aplicação baseada em GUI é a janela. Na verdade, é tão importante que esses caras de Redmond é usado para nomear seu sistema operacional. As janelas de um aplicativo são como pedaços de papel que você usa para recolher ideias, informações de exibição e entrada de registro.

Janelas em Cocoa são igualmente importantes. Mac OS X continua usando as tradições janela finas que fizeram o Mac OS famoso. Durante todo o tempo, Cacau desenvolve e melhora as idéias do passado com novas características.

Como as janelas formam a base para quase todas as interfaces, você vai usá-los muitas vezes. Algumas das funções mais comuns que você vai realizar incluem o seguinte:

  • Abertura e fechamento de janelas
  • mover janelas
  • Adicionando janelas para o menu do Windows

Neste artigo, você descobrirá como realizar todas essas tarefas e muito mais.

Abrir e fechar uma janela

Quando você trabalha com janelas em seus projetos de Cacau, você normalmente usar Interface Builder para projetar-los. Além disso, se você deixar uma janela aberta no Interface Builder quando você está projetando seu interface, que vontade janela é exibida quando o aplicativo é executado. Por isso, muitas vezes é necessário emitir um comando para abrir uma janela.

Fechar uma janela é uma simples questão:

[TheWindow fechar];

Quando você fechar uma janela desta forma, a janela está desaparecido. Seu conteúdo já caiu no esquecimento. Não é mais. Isso significa que para ver a janela novamente, você tem que abrir um novo objeto janela.

Ocultando e mostrando uma janela

Se você preferir manter uma janela em torno em vez de excluí-lo da memória, você deve escondê-lo em vez de fechá-lo. Escondendo uma janela também é uma tarefa fácil de realizar. Por exemplo, suponha que você tem uma saída (chamado theWindow) como parte de sua classe de controlador. A saída representa uma janela em sua interface.

Para ocultar essa janela, um método hideWindow pode ter esta aparência:

- (IBAction) hideWindow: (id) remetente
{
[TheWindow orderOut: remetente] -
}

O método orderOut da classe NSWindow esconde uma janela de vista. Ele ainda existe na memória-ele simplesmente não é visível. Para saber se uma janela estiver visível, você pode verificar o valor de retorno do método isVisible:

- (IBAction) hideWindow: (id) remetente
{
Se ([theWindow isVisible])
[TheWindow orderOut: remetente] -
}

Para fazer a janela aparecer novamente, basta usar o método orderFront:

- (IBAction) SHOWWINDOW: (id) remetente
{
[TheWindow orderFront: remetente] -
}

Se você gostaria de uma janela para aparecer na tela e agir como a janela principal, interceptar teclas, utilize o método makeKeyAndOrderFront. programadores de cacau freqüentemente usam este método no método awakeFromNib para forçar a janela principal para o primeiro plano:

- (Void) {awakeFromNib
[TheWindow makeKeyAndOrderFront: nil] -
}

janelas de posicionamento

Outra tarefa importante que você vai precisar para realizar é janelas posicionamento. Antes de ir mandando janelas ao redor, você primeiro precisa encontrar a sua posição actual. Use o método de quadros de NSWindow para descobrir a origem eo tamanho de uma janela. O método retorna uma estrutura NSRect, que contém NSPoint e NSSize descrevendo origem e o tamanho da janela, respectivamente.

Depois de saber a origem e tamanho das janelas, que é uma questão trivial para reposicioná-lo. Em primeiro lugar, definir a origem ao seu gosto e chamar o método setFrameOrigin para aplicar a nova posição. Este exemplo move uma janela de dez pixels esquerda da sua posição atual:

- (IBAction) moveLeft: (id) remetente
{
NSRect theFrame = [quadro theWindow] -
NSPoint theorigin = theFrame.origin-
theOrigin.x = theOrigin.x - 10-
[TheWindow setFrameOrigin: theorigin] -
}

Para posicionar uma janela no meio da tela, use o método centro calhar. Este exemplo concentra uma janela na tela:

- (IBAction) CenterWindow: (id) remetente
{
[Center theWindow] -
}

Manter o controle de janelas

A maioria dos aplicativos de cacau têm um menu Janela para ajudar os usuários a manter o controle de janelas abertas. Normalmente, você deve usar este menu como uma lista de janelas de documentos abertos. (Você provavelmente não iria exibir, por exemplo, uma janela de barra de ferramentas no menu Janela). A grande coisa sobre o menu Janela é que Cocoa cuida disso para você. Se a sua janela tem as seguintes propriedades, Cacau adiciona automaticamente para o menu Janela:

  • Tem uma barra de título
  • é redimensionável
  • Pode tornar-se a janela principal

Você pode excluir uma janela no menu Janela, alterando qualquer uma dessas propriedades. Se, por outro lado, você tem uma janela que obedece cada uma dessas regras, mas você ainda quer que ele seja deixado de fora do menu Janela, use o método setExcludedFromWindowsMenu. O método awakeFromNib é um bom lugar para usar esta chamada porque o método tem efeito quando seu aplicativo lança.

- (Void) {awakeFromNib
[TheWindow setExcludedFromWindowsMenu: nil] -
}

Colocando janelas para trabalhar para você

Para ver como estes janela apresenta trabalho, faça o seguinte:

1. Inicie o Project Builder e criar um novo projeto de aplicativo de cacau.

Clique duas vezes no ícone do Project Builder no Finder para lançá-lo. Depois que ele lança, escolha o File -> menu de New Project. Na janela que aparecer, selecione Cocoa aplicativos e clique em OK.

2. Crie uma nova janela no arquivo MainMenu.nib.

Clique duas vezes no arquivo MainMenu.nib no Grupo de Recursos para abrir o arquivo no Interface Builder. Na janela de arquivo MainMenu.nib, clique na guia instâncias. Em seguida, arraste uma nova janela do painel de cacau em Windows da janela Paletas para a janela de arquivo do MainMenu.nib. Para acompanhar o exemplo, o nome desta nova janela MenuWindow. Você vai usá-lo para controlar a janela padrão que já é parte da interface.

3. Abra o novo MenuWindow e adicionar três botões para ele.

4. Crie uma classe de controlador.

Para fazer isso, clique na guia Classes de janela de arquivo do MainMenu.nib. Rolar para a esquerda e selecione NSObject. Pressione Enter para criar uma nova classe e nomeá-la MyWindowController. Escolha Classes -> Instantiate MyWindowController para criar uma instância da nova classe.

5. Clique duas vezes a nova instância MyWindowController e adicionar pontos de venda e ações para a instância na janela Info.

Adicione os seguintes pontos de venda: theMenuWindow, theShowButton e theWindow. Adicionar essas ações: CenterWindow, moveLeft e ShowWindow.

Ligue as três novas ações aos botões no MenuWindow por controle-arrastar de cada botão t instância MyWindowController. Clique em Conectar na janela de Informações para conectar cada ação.

Em seguida, conecte as duas saídas relacionadas com a janela para as suas janelas correspondentes. Control-arrastar a partir da instância MyWindowController para cada janela em janela de arquivo do MainMenu.nib. Clique em Conectar na janela de Informações para ligar à tomada apropriada.

Finalmente, conecte a tomada theShowButton para o botão de cima na MenuWindow.

6. Faça duplo clique na instância MyWindowController. Escolha Classes -> Criar arquivos para MyWindowController e adicionar os arquivos de cabeçalho e implementação para a instância.

7. Volte ao Project Builder e adicionar este código para o arquivo MyWindowController.m:

#import "MyWindowController.h"
@implementation MyWindowController
- (IBAction) CenterWindow: (id) remetente
{
[Center theWindow] -
}
- (IBAction) moveLeft: (id) remetente
{
NSRect theFrame = [quadro theWindow] -
NSPoint theorigin = theFrame.origin-
theOrigin.x = theOrigin.x - 10-
[TheWindow setFrameOrigin: theorigin] -
}
- (IBAction) SHOWWINDOW: (id) remetente
{
Se ([theWindow isVisible])
{
[TheWindow orderOut: remetente] -
[TheShowButton setTitle: @ "Show Window"] -
}
outro
{
[TheWindow orderFront: remetente] -
[TheShowButton setTitle: @ "ocultar a janela"] -
}
}
- (Void) {awakeFromNib
[TheWindow makeKeyAndOrderFront: nil] -
[TheMenuWindow makeKeyAndOrderFront: nil] -
}
@fim

8. Teste o projeto.

Para fazer isso, escolha Criar -> Criar e executar.

menu