<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4011251917444130390</id><updated>2011-11-27T22:28:16.892-03:00</updated><category term='FXMessageBox'/><category term='ícones'/><category term='básico'/><category term='Layout Managers'/><category term='avançado'/><category term='sobre'/><category term='vídeo'/><category term='tutoriais'/><category term='OpenCV'/><category term='Menus'/><category term='errata'/><category term='dúvidas'/><category term='Botões'/><category term='Tratamento de Eventos'/><category term='referência'/><title type='text'>Idéias FOX</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-4478409249913387475</id><published>2010-01-15T15:12:00.007-03:00</published><updated>2010-01-15T15:23:55.886-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='avançado'/><category scheme='http://www.blogger.com/atom/ns#' term='vídeo'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>FOX Toolkit + OpenCV - Vídeo</title><content type='html'>&lt;div style="text-align: justify;"&gt;Recentemente, uma amiga minha me pediu um exemplo de como exibir um vídeo carregado pelo OpenCV utilizando o FOX.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Então eu rapidamente fiz um programinha para ajudá-la: um micro-&lt;i&gt;player&lt;/i&gt; de vídeo. Micro porque não faz nada além de exibir os quadros. Sem som (OpenCV não trabalha com som). Sem controles, nem nada. Abriu o vídeo e pronto.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Obs.: Este tópico, assim como os outros relacionados ao OpenCV, são direcionados àqueles que já tem experiência com o FOX Toolkit, especialmente este aqui por conter itens que ainda não tratei. Tratarei todos esses assuntos em tópicos futuros.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom, vamos lá.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;FoxVideoPlayerMainWindow.h&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Declaração dos objetos&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;FXImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;image&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Esta é a imagem que será desenhada no &lt;i&gt;canvas&lt;/i&gt; (área de desenho), representando cada quadro do vídeo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;FXCanvas&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;canvas&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Esta é a área de desenho propriamente dita.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;CvCapture&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Uma estrutura sinistra que o OpenCV utiliza para guardar as informações do vídeo sendo capturado. Sinistra porque a documentação não revela a estrutura interna. Para conhecê-la, é preciso ir no fonte do OpenCV, coisa que eu ainda não quis fazer.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;IplImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;frame&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Cada quadro do vídeo é uma IplImage. Precisa dizer mais?&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: #009900;"&gt;double&lt;/span&gt; freq&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Frequência de atualização. É um vídeo, não é? Não pode ficar no mesmo quadro para sempre.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;IplImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;dummy&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Essa é uma pseudo-imagem apenas para converter os quadros para a representação interna do FOX, conforme discutido &lt;a href="http://ideiasfox.blogspot.com/2009/12/iplimage-e-fximage-revisitado.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Eventos&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Existem apenas três eventos: pintar o &lt;i&gt;canvas&lt;/i&gt;, carregar um vídeo e pegar o próximo quadro. Assim:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;b&gt;&lt;span style="color: blue;"&gt;enum&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;    ID_CANVAS &lt;span style="color: #990000;"&gt;=&lt;/span&gt; FXMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;ID_LAST&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   ID_LOAD_VIDEO&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   ID_FRAME&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/* Pintar o canvas */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: #009900;"&gt;long&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;onPaintCanvas&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;*);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/* Carregar o vídeo */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: #009900;"&gt;long&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;onCmdLoadVideo&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;*);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;i&gt;&lt;span style="color: #9a1900;"&gt;/* Pegar cada quadro do vídeo */&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: #009900;"&gt;long&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;onTimeoutFrame&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;*);&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;E é isso. Agora, vamos implementar essa cambada.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;FoxVideoPlayerMainWindow.cpp&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Construtor da janela&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;FoxVideoPlayerMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;FoxVideoPlayerMainWindow&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: teal;"&gt;FXApp&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;a&lt;span style="color: #990000;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: #990000;"&gt;:&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMainWindow&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;a&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"FoxVideoPlayer"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; DECOR_ALL&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: teal;"&gt;FXToolBar&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;toolBar &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXToolBar&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXButton&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;toolBar&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"Abrir vídeo"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; ID_LOAD_VIDEO&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;       BUTTON_NORMAL&lt;span style="color: #990000;"&gt;|&lt;/span&gt;BUTTON_TOOLBAR&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; canvas &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXCanvas&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; ID_CANVAS&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;     LAYOUT_FIX_WIDTH&lt;span style="color: #990000;"&gt;|&lt;/span&gt;LAYOUT_FIX_HEIGHT&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; image &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; capture &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; frame &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; dummy &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Aqui eu simplesmente crio uma barra de ferramentas com um botão para carregar um vídeo, crio o &lt;i&gt;canvas&lt;/i&gt; e inicializo os demais objetos com nulo. Nada de mais.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Pintando o canvas&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #009900;"&gt;long&lt;/span&gt; FoxVideoPlayerMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;onPaintCanvas&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;ptr&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: teal;"&gt;FXEvent&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;ev &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;static_cast&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;&amp;lt;&lt;/span&gt;FXEvent&lt;span style="color: #990000;"&gt;*&amp;gt;(&lt;/span&gt;ptr&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: teal;"&gt;FXDCWindow&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;dc&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;canvas&lt;span style="color: #990000;"&gt;,&lt;/span&gt; ev&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;frame&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   dc&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;drawImage&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;image&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/b&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   dc&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;setForeground&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;FXRGB&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   dc&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;fillRectangle&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; canvas&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getWidth&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; canvas&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getHeight&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;());&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Duas opções: se houver um quadro a desenhar, desenha. Senão, desenha um retângulo preto. Simples.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Carregando o vídeo&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Essa função é um pouco grande, então vou quebrá-la em algumas partes.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #009900;"&gt;long&lt;/span&gt; FoxVideoPlayerMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;onCmdLoadVideo&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;*)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: teal;"&gt;FXFileDialog&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;dialog&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"Abrir vídeo"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;    dialog&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;setDirectory&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXSystem&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getHomeDirectory&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;());&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(!&lt;/span&gt;dialog&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;execute&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;PLACEMENT_OWNER&lt;span style="color: #990000;"&gt;))&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: teal;"&gt;FXString&lt;/span&gt; filename &lt;span style="color: #990000;"&gt;=&lt;/span&gt; dialog&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getFilename&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Exibe uma caixa de diálogo para selecionar o vídeo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;  capture &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvCaptureFromFile&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;filename&lt;span style="color: #990000;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;text&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;());&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(!&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   FXMessageBox&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;error&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; MBOX_OK&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"Erro"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"Erro ao abrir o vídeo"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Abre o vídeo e armazena na estrutura obscura. Um erro e a função &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvCaptureFromFile()&lt;/span&gt; retorna nulo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: #009900;"&gt;int&lt;/span&gt; width &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;int&lt;/span&gt;&lt;span style="color: #990000;"&gt;)&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvGetCaptureProperty&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CV_CAP_PROP_FRAME_WIDTH&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;span style="color: #009900;"&gt;int&lt;/span&gt; height &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;int&lt;/span&gt;&lt;span style="color: #990000;"&gt;)&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvGetCaptureProperty&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CV_CAP_PROP_FRAME_HEIGHT&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; freq &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvGetCaptureProperty&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CV_CAP_PROP_FPS&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; freq &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;span style="color: #993399;"&gt;1.0&lt;/span&gt; &lt;span style="color: #990000;"&gt;/&lt;/span&gt; freq &lt;span style="color: #990000;"&gt;*&lt;/span&gt; &lt;span style="color: #993399;"&gt;1000.0&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Eu preciso saber as dimensões do vídeo e o número de quadros por segundo. A função &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvGetCaptureProperty()&lt;/span&gt; fornece diversas informações sobre o vídeo. As informações disponíveis são descritas na documentação do OpenCV.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Entretanto, é preciso fazer esse cálculo para saber, digamos assim, o tempo de permanência de cada quadro em milissegundos (o porquê mais para frente).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;  canvas&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;resize&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;width&lt;span style="color: #990000;"&gt;,&lt;/span&gt; height&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;b&gt;&lt;span style="color: black;"&gt;resize&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getDefaultWidth&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;getDefaultHeight&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Agora que eu sei o tamanho do vídeo, redimensiono o &lt;i&gt;canvas&lt;/i&gt;. Depois dele a janela principal.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Explicando rapidamente o que acontece aqui: por padrão, a janela principal é configurada para ficar com o menor tamanho em que caibam todos os filhos. Como eu redimensionei um deles (depois de todos criados), as funções &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;getDefaultWidth()&lt;/span&gt; e &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;getDefaultHeight()&lt;/span&gt; retornam as dimensões necessárias para caber todo mundo novamente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;  image &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXImage&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; IMAGE_KEEP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_OWNED&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMI&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;      width&lt;span style="color: #990000;"&gt;,&lt;/span&gt; height&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;  image&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;create&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; dummy &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvCreateImageHeader&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvSize&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;width&lt;span style="color: #990000;"&gt;,&lt;/span&gt; height&lt;span style="color: #990000;"&gt;),&lt;/span&gt; IPL_DEPTH_8U&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;4&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: black;"&gt;cvSetData&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;dummy&lt;span style="color: #990000;"&gt;,&lt;/span&gt; image&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getData&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; CV_AUTO_STEP&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Criando as imagens. Nada de especial, já falei sobre isso.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;  &lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;()-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;addTimeout&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; ID_FRAME&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Bom, a última coisa a fazer aqui é disparar um &lt;i&gt;timer&lt;/i&gt; para recuperar os quadros do vídeo e desenhá-los. Não queremos esperar, então o tempo é 0.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Quadro-a-quadro&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #009900;"&gt;long&lt;/span&gt; FoxVideoPlayerMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;onTimeoutFrame&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;FXObject&lt;span style="color: #990000;"&gt;*,&lt;/span&gt; FXSelector&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #009900;"&gt;void&lt;/span&gt;&lt;span style="color: #990000;"&gt;*)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;tt&gt;&lt;div style="text-align: justify;"&gt;  &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(!&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; frame &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvQueryFrame&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;capture&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #990000;"&gt;(&lt;/span&gt;frame&lt;span style="color: #990000;"&gt;)&lt;/span&gt; &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: black;"&gt;cvCvtColor&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;frame&lt;span style="color: #990000;"&gt;,&lt;/span&gt; dummy&lt;span style="color: #990000;"&gt;,&lt;/span&gt; CV_BGR2RGBA&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   image&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;render&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   canvas&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;update&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   &lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;()-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;addTimeout&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; ID_FRAME&lt;span style="color: #990000;"&gt;,&lt;/span&gt; freq&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;   canvas&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;update&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #993399;"&gt;1&lt;/span&gt;&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Toda vez que essa função é chamada, o próximo quadro do vídeo é recuperado com &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvQueryFrame()&lt;/span&gt;. Se não for nulo (ou seja, o vídeo ainda não acabou), os espaços de cor são convertidos com &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvCvtColor()&lt;/span&gt;. Como &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;dummy&lt;/span&gt; utiliza os pixels de &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;image&lt;/span&gt;, é como se eu estivesse pintando duas imagens de uma vez só (mas, na verdade, é uma imagem só com duas representações).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Em seguida, vem uma operação importante. É algo que eu demorei muito para entender. Uma imagem (pelo menos no FOX Toolkit, não sei quando a outras bibliotecas de interface gráfica) tem duas representações, uma no lado do cliente outra do servidor. O lado do cliente é esse vetor de pixels que pode ser acessado por meio de &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;image-&amp;gt;getData()&lt;/span&gt;. O lado do servidor é o servidor gráfico (no meu caso, o &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;X&lt;/span&gt;; não sei qual seria no caso do Uíndous ou do Macos). Quando o lado do cliente é alterado, é necessário transferir os pixels para o servidor com &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;render()&lt;/span&gt;. Sem isso, seria exibida sempre a mesma imagem que foi criada, apenas um retângulo preto. Só por curiosidade, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;restore()&lt;/span&gt; faz o inverso, recupera os &lt;i&gt;pixels&lt;/i&gt; do servidor e põe de volta no cliente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tendo a nova imagem no lado do servidor, basta atualizar o &lt;i&gt;canvas&lt;/i&gt;. Depois, agenda a recuperação do próximo quadro, desta vez respeitando a frequência de quadros do vídeo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Quando o vídeo termina, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvQueryFrame()&lt;/span&gt; returna nulo. Neste caso, não é mais necessário agendar o próximo quadro. Apenas atualiza o &lt;i&gt;canvas&lt;/i&gt;, que será pintado de preto, apenas para não ficar exibindo o último quadro do vídeo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O resultado disso tudo pode ser observado neste vídeo que eu gravei:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;object height="189" width="300"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jrUt7pwRjH8&amp;hl=pt_BR&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jrUt7pwRjH8&amp;hl=pt_BR&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="580" height="360"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bem, isto foi apenas o básico necessário. Apenas exibi o vídeo, sem aplicar nenhum processamento. Isso, obviamente, deve ser feito depois de recuperar o quadro e antes de convertê-lo para RGBA.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Além disso, no exemplo o vídeo é carregado de um arquivo, mas o OpenCV também captura vídeo pela webcam.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um abraço e até a próxima.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-4478409249913387475?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/4478409249913387475/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=4478409249913387475&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4478409249913387475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4478409249913387475'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2010/01/fox-toolkit-opencv-video.html' title='FOX Toolkit + OpenCV - Vídeo'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-948557452347619778</id><published>2009-12-28T15:25:00.000-03:00</published><updated>2009-12-28T15:25:49.752-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='avançado'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>IplImage e FXImage: revisitado</title><content type='html'>Anteriormente, falei aqui como utilizar uma imagem do OpenCV (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;) e uma do FOX (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;), ambas compartilhando o vetor de pixels. Confira &lt;a href="http://ideiasfox.blogspot.com/2009/04/exibir-imagem-do-opencv-iplimage.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pois bem. Fazendo daquela maneira, há certos problemas: ambos objetos devem permanecer vivos, e o dono dos pixels tem que ser a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Isto pode não ser desejado. Por exemplo, vou citar o caso que aconteceu comigo e tive que matar um pouco a cabeça para resolver.&lt;br /&gt;&lt;br /&gt;Muitas imagens que eu exibo (com o FOX Toolkit) precisam antes passar por algum processamento (com o OpenCV). Depois disso, eu não preciso mais da &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;, apenas dos pixels.&lt;br /&gt;&lt;br /&gt;Entretanto, seguir os passos explicados no outro tópico levava a um problema seriíssimo, que será explicado no decorrer deste tópico.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-large;"&gt;Compartilhando pixels: antigamente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Conforme eu havia explicado, criava-se primeiro a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt; e depois a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, utilizando o vetor de pixels, mais ou menos assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;IplImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;iplImage &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvCreateImage&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvSize&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;),&lt;/span&gt; IPL_DEPTH_8U&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;4&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: teal;"&gt;FXImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;fxImage &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXImage&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; iplImage&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;imageData&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;    IMAGE_KEEP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_OWNED&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMI&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;    iplImage&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;width&lt;span style="color: #990000;"&gt;,&lt;/span&gt; iplImage&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;height&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lembrando que era necessário um &lt;i&gt;cast&lt;/i&gt; horroroso com &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;reinterpret_cast&lt;/span&gt; para transformar os pixels da &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage de&lt;/span&gt; &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;char*&lt;/span&gt;&amp;nbsp;para &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXColor&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Com isso, eu tenho que minha &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt; "doou" seus pixels para a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, que tomou conta deles. Assim, a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt; poderia ser dispensada (na verdade, somente o cabeçalho da imagem; o OpenCV permite isso) que a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, quando for liberada, libera também o vetor de pixels.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;O problema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isso causa um problema que eu demorei muito para descobrir. E, depois de descoberto, vê-se que é uma coisa tão simples... é sempre um detalhezinho que cega a gente.&lt;br /&gt;&lt;br /&gt;O grande problema é que, como o vetor de pixels é alocado pela &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;, ele é alocado usando &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;malloc&lt;/span&gt;. A &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, quando tenta liberar, tenta com &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;delete&lt;/span&gt;. Aí não dá certo...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;A "solução"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu criava as imagens independentemente, cada uma com seu vetor de pixels. Depois de processada, eu fazia uma chamada a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;memcpy&lt;/span&gt; para copiar os pixels. Uma tristeza considerando o contexto.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-large;"&gt;Compartilhando pixels: a solução de fato&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de quase desistir da idéia, eu descobri (dia desses...) o problema. E logo cheguei a uma solução elegante (e óbvia).&lt;br /&gt;&lt;br /&gt;Basta criar primeiro a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, que vai apenas "emprestar" os pixels para a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;. Assim:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;FXImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;fxImage &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXImage&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;    IMAGE_KEEP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_OWNED&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMP&lt;span style="color: #990000;"&gt;|&lt;/span&gt;IMAGE_SHMI&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Percebam que o segundo parâmetro, que seria o vetor de pixels, é nulo. Como os pixels são de responsabilidade da &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;, ela mesma os cria (isso é informado pela opção &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IMAGE_OWNED&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;É necessário também manter os pixels no lado do cliente (opção &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IMAGE_KEEP&lt;/span&gt;). Sem ela, os pixels são liberados depois da imagem criada, impossibilitando o compartilhamento.&lt;br /&gt;&lt;br /&gt;Pois bem, agora vamos "emprestar" os pixels da &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt; para a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;IplImage&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;iplImage &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;cvCreateImageHeader&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvSize&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;200&lt;/span&gt;&lt;span style="color: #990000;"&gt;),&lt;/span&gt;&lt;br /&gt;    IPL_DEPTH_8U&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;4&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: black;"&gt;cvSetData&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;iplImage&lt;span style="color: #990000;"&gt;,&lt;/span&gt; fxImage&lt;span style="color: #990000;"&gt;-&amp;gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: black;"&gt;getData&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; CV_AUTOSTEP&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cvCreateImageHeader()&lt;/span&gt; aloca todas as informações de uma imagem, com exceção do vetor de pixels. Com isso, a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IplImage&lt;/span&gt;, que é temporária, apenas pega emprestado os pixels para trabalhar sobre eles. Ao terminar o processamento, podemos liberar o cabeçalho:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: black;"&gt;cvReleaseImageHeader&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&amp;amp;&lt;/span&gt;iplImage&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Uma grande vantagem dessa abordagem é que não precisa nem converter a imagem, conforme eu havia feito anteriormente. A imagem já é criada no formato da &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXImage&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Conforme havia dito, é uma coisa tão simples e óbvia que fica invisível.&lt;br /&gt;&lt;br /&gt;Espero que essa informação seja útil para quem for usar essas duas bibliotecas juntas.&lt;br /&gt;&lt;br /&gt;Abraço e até a próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-948557452347619778?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/948557452347619778/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=948557452347619778&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/948557452347619778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/948557452347619778'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/12/iplimage-e-fximage-revisitado.html' title='IplImage e FXImage: revisitado'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-4733022808857668477</id><published>2009-12-23T14:37:00.000-03:00</published><updated>2009-12-23T14:37:51.182-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Menus'/><title type='text'>Submenus</title><content type='html'>Dando continuidade à nossa série sobre &lt;a href="http://ideiasfox.blogspot.com/search/label/Menus"&gt;Menus&lt;/a&gt;, falarei agora sobre como adicionar submenus. Vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Submenus são menus&lt;/span&gt;&lt;span style="font-size: x-large;"&gt; como quaisquer outros&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Isso mesmo. O processo de criar um submenu é praticamente o mesmo de criar um menu "normal".&lt;br /&gt;&lt;br /&gt;Para exemplificar o processo, vamos criar um menu "Exibir", com um submenu "Zoom". Neste caso, temos dois painéis, que serão declarados da seguinte maneira:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;FXMenuPane &lt;span style="color: #990000;"&gt;*&lt;/span&gt;_viewMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;br /&gt;FXMenuPane &lt;span style="color: #990000;"&gt;*&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Lembrando que eles devem estar no escopo de classe, pois precisam ser liberados manualmente.&lt;br /&gt;&lt;br /&gt;Percebam que o submenu "Zoom" nada mais é que um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuPanel&lt;/span&gt; como todos os outros que já vimos até aqui. Agora vamos criá-los, novamente recuando o código para indicar a hierarquia.&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;_viewMenu &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuPane&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;  _zoomMenu &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuPane&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Aumentar&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Ctrl++"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Normal&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Ctrl+0"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Diminuir&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Ctrl+-"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuSeparator&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_zoomMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"A&amp;amp;justar&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Home"&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCascade&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_viewMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Zoom"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; _zoomMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuTitle&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;menuBar&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Exibir"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; _viewMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Explicando...&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Na primeira linha, aloco o menu "Exibir".&lt;br /&gt;&lt;br /&gt;Na segunda, aloco o (sub)menu "Zoom". Chamando atenção para o recuo, indicando que &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_zoomMenu&lt;/span&gt; será posicionado "dentro" de &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_viewMenu&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;Nas linhas seguintes, preencho com alguns comandos e um separador. Nada além do trivial com recuo.&lt;br /&gt;&lt;br /&gt;Em seguida, criamos a entrada no menu "Exibir" que vai expandir o menu "Zoom". Repetindo:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCascade&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_viewMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Zoom"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; _zoomMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Os parâmetros são os mesmos de &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuTitle&lt;/span&gt; (comparem com a última linha):&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;O &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXComposite&lt;/span&gt; onde ficará localizado o submenu. Neste caso, adicionamos ao painel "Exibir"&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;O título que vai aparecer no painel, com direito a mnemônico&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Ícone&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;O painel que será exibido ao mover o mouse sobre o título.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Liberando&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Como todo bom painel de menu, deve ser liberado manualmente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;delete&lt;/span&gt;&lt;/b&gt; _viewMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;delete&lt;/span&gt;&lt;/b&gt; _zoomMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Só uma observação: já tratei esse assunto aqui, então é só um lembrete. Quando eu falo em deletar manualmente, é porque estou usando o FOX 1.6. Na versão atual de desenvolvimento (1.7), existe uma classe chamada &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXAutoPtr&lt;/span&gt;, que é um "ponteiro inteligente". Resumindo a história, ele guarda um ponteiro e automaticamente o libera quando sai de escopo. Veja a descrição &lt;a href="http://ideiasfox.blogspot.com/2009/07/foi-postada-na-lista-de-e-mails-do-fox.html"&gt;aqui&lt;/a&gt;&amp;nbsp;(na verdade, uma dúvida enviada à lista de discussão do FOX que eu traduzi e postei aqui).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Resultado&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Eis o resultado do nosso submenu:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_boFQgM_NDMg/SzJU9EOa9_I/AAAAAAAAAeI/EoFevUg9zKk/s1600-h/Submenu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SzJU9EOa9_I/AAAAAAAAAeI/EoFevUg9zKk/s400/Submenu.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-4733022808857668477?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/4733022808857668477/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=4733022808857668477&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4733022808857668477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4733022808857668477'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/12/submenus.html' title='Submenus'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_boFQgM_NDMg/SzJU9EOa9_I/AAAAAAAAAeI/EoFevUg9zKk/s72-c/Submenu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-4242039716469614755</id><published>2009-12-14T13:54:00.001-03:00</published><updated>2009-12-14T13:56:06.431-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Menus'/><title type='text'>Menus</title><content type='html'>Neste tópico, ensinarei como adicionar uma barra de menus (com menus, obviamente) ao programa. Neste momento, colocarei menus simples, apenas com comandos simples. Há outros componentes que podem ser adicionados aos menus, mas serão tratados em tópicos futuros.&lt;br /&gt;&lt;br /&gt;Vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Barra de menus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tudo começa com a barra de menus. Naturalmente, é lá que ficam os menus. E, naturalmente, fica no topo da janela:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;span style="color: teal;"&gt;FXMenuBar&lt;/span&gt; &lt;span style="color: #990000;"&gt;*&lt;/span&gt;menuBar &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuBar&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; LAYOUT_FILL_X&lt;span style="color: #990000;"&gt;|&lt;/span&gt;FRAME_RAISED&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Percebam que ela pode ser criada localmente, o próprio FOX se encarrega de liberá-la depois. Além disso, lembrem-se que a localização padrão é no topo da janela, portanto não precisei passar &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;LAYOUT_SIDE_TOP&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Isso cria o espaço ideal para os menus. Aqui, criarei apenas dois, "Arquivo" e "Editar", apenas para exemplificar. Não é um processo complicado. Pelo contrário, é bem simples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;&lt;span style="font-family: monospace;"&gt;Adicionando menus&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Os menus precisam ser declarados com escopo de classe. Então, na declaração da classe, temos:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;:&lt;/span&gt;&lt;br /&gt;  FXMenuPane &lt;span style="color: #990000;"&gt;*&lt;/span&gt;_fileMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;br /&gt;  FXMenuPane &lt;span style="color: #990000;"&gt;*&lt;/span&gt;_editMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, vamos criar e preencher os menus. Neste primeiro exemplo, do menu "Arquivo", vou colocar e explicar linha por linha. No segundo, o menu "Editar", vou colocar tudo de uma vez só para explicar a forma como eu gosto de criar os menus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Menu Arquivo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;_fileMenu &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuPane&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cria o painel onde ficarão os itens do menu. Os dois parâmetros do construtor são a janela pai e as opções, que não é necessário informar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_fileMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Carregar imagem..."&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cria um comando de menu. Os principais parâmetros são:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;Menu onde vai aparecer. Na verdade, pode ficar em um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXComposite&lt;/span&gt; qualquer (e, de fato, eu coloquei um sem querer na própria janela, ficou algo bizarro). Como estamos criando menus, é bom que fique em um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuPanel&lt;/span&gt;. Neste caso, no menu "Arquivo".&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Texto do comando. O caractere &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;amp;&lt;/span&gt; indica que a próxima letra ficará sublinhada, para acesso através de &lt;span style="font-family: monospace;"&gt;Alt+&lt;tecla&gt;&lt;/tecla&gt;&lt;/span&gt;. Neste caso, &lt;span style="font-family: monospace;"&gt;Alt+C&lt;/span&gt; acionará esse comando. É meio Uíndous, mas muito melhor que em Java (um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;setMnemonic()&lt;/span&gt; horroroso).&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Ícone. &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuCommand&lt;/span&gt;s podem ter um ícone associado, indique aqui. Já falei sobre ícones &lt;a href="http://ideiasfox.blogspot.com/2009/04/tutorial-icones.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Alvo do evento.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;ID da mensagem. A série sobre &lt;a href="http://www.blogger.com/posts.g?blogID=4011251917444130390&amp;amp;searchType=ALL&amp;amp;txtKeywords=&amp;amp;label=Tratamento+de+Eventos"&gt;Tratamento de Eventos&lt;/a&gt; explica essa parte referente a esses dois últimos parâmetros.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;O último parâmetro são as opções, novamente desnecessário informar.&lt;br /&gt;&lt;br /&gt;E caso não tenha ficado claro pelo nome da classe: &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuCommand&lt;/span&gt;s lançam eventos do tipo &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;SEL_COMMAND&lt;/span&gt;. Isso significa que no mapa de mensagens do tratador (seja a própria janela ou seja lá quem for) vai aparecer algo como:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: black;"&gt;FXMAPFUNC&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;SEL_COMMAND&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;  FoxTutorialMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;ID_LOAD_IMAGE&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;  FoxTutorialMainWindow&lt;span style="color: #990000;"&gt;::&lt;/span&gt;onCmdLoadImage&lt;span style="color: #990000;"&gt;),&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Continuando:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuSeparator&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_fileMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apenas um separador. Desenha uma linha para separar os comandos em seções.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_fileMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Sair&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Ctrl+Q&lt;/span&gt;&lt;span style="color: #cc33cc;"&gt;\t&lt;/span&gt;&lt;span style="color: red;"&gt;Encerrar o aplicativo"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;b&gt;&lt;span style="color: black;"&gt;getApp&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(),&lt;/span&gt; FXApp&lt;span style="color: #990000;"&gt;::&lt;/span&gt;ID_QUIT&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mais um comando, para fechar o aplicativo. Desta vez fiz com que esse comando lançasse um evento para exemplificar. Já falei sobre como fechar o aplicativo através de um comando aqui.&lt;br /&gt;&lt;br /&gt;A única observação adicional é quanto ao texto do comando. Assim como o texto dos botões, este também é dividido em três seções, separadas pelo caractere de tabulação:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;A primeira é o texto que será exibido. Natural e praticamente obrigatório.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;A segunda são as teclas de atalho (aceleradores). Neste caso, coloquei &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Ctrl+Q&lt;/span&gt; para fechar o aplicativo. Opcional.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;A terceira é o texto que aparecerá na barra de &lt;i&gt;status&lt;/i&gt;. Falaremos dela no futuro. Opcional.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Bom, isso preenche o nosso menu "Arquivo". Vamos, agora, adicioná-lo à barra de menus (ou vocês achavam que isso já tinha sido feito?):&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuTitle&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;menuBar&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Arquivo"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; _fileMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aqui informamos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;A barra de menus onde vai ficar. Novamente, pode ficar em um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXComposite&lt;/span&gt; qualquer. Mas não há a menor necessidade de uma bizarrice dessas.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;O título que vai aparecer. Não preciso mais dizer para que serve o &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;amp;&lt;/span&gt;, preciso?&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Ícone. Eu, particularmente, nunca vi em nenhum programa (escrito em FOX ou não) um menu com ícone. Mas o FOX Toolkit te dá essa liberdade.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;O painel que será exibido ao acionar o menu.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Nosso menu Arquivo está pronto. Observemos, agora, o menu Editar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Menu Editar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;_editMenu &lt;span style="color: #990000;"&gt;=&lt;/span&gt; &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuPane&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuCommand&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;_editMenu&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Preferências..."&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: black;"&gt;FXMenuTitle&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #990000;"&gt;(&lt;/span&gt;menuBar&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: red;"&gt;"&amp;amp;Editar"&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; &lt;span style="color: #993399;"&gt;0&lt;/span&gt;&lt;span style="color: #990000;"&gt;,&lt;/span&gt; _editMenu&lt;span style="color: #990000;"&gt;);&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bom, esse aqui é só para mostrar a maneira como eu normalmente crio menus (e, de fato, qualquer objeto composto por uma hierarquia).&lt;br /&gt;&lt;br /&gt;Na primeira linha eu sigo o recuo normal do código. Esta é, digamos, a linha de criação (cunhei esse termo agora...).&lt;br /&gt;&lt;br /&gt;Em seguida, vêm as linhas de preenchimento (de novo...). Nelas, coloco os objetos que vão "dentro" do objeto principal, com um recuo a mais exatamente para deixar claro essa hierarquia.&lt;br /&gt;&lt;br /&gt;No final, volto ao recuo da linha de criação. É a linha de realização ( &amp;gt;D ), pois nela dou um sentido ao meu objeto (afinal, não faz sentido criar um painel sem acesso a ele).&lt;br /&gt;&lt;br /&gt;Desenvolvi esse estilo quando comecei a trabalhar com o &lt;a href="http://www.openscenegraph.org/"&gt;OpenSceneGraph&lt;/a&gt; (não confundam com &lt;a href="http://www.opensg.org/index.EN.html"&gt;OpenSG&lt;/a&gt;) e precisava definir as características de um modelo, ficava mais ou menos assim:&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;osg::ref_ptr&lt;osg::geode&gt; geode = new osg::Geode();&lt;br /&gt;&amp;nbsp;&amp;nbsp;osg::Geometry *geometry = new osg::Geometry();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;osg::Vec3Array *vertexArray = new osg::Vec3Array();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Preenche a lista de vértices */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;geometry-&amp;gt;setVertexArray(vertexArray);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;osg::DrawElementsUInt *primitiveSet = new osg::DrawElementsUInt(GL_POINTS);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Adiciona as primitivas */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;geometry-&amp;gt;addPrimitiveSet(primitiveSet);&lt;br /&gt;&amp;nbsp;&amp;nbsp;geode-&amp;gt;addDrawable(geometry);&lt;br /&gt;&lt;/osg::geode&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recuar os objetos mais internos me ajudou a entender melhor a hierarquia dos objetos do OpenSceneGraph e acabei aplicando essa técnica ao programar com o FOX Toolkit. Não vou explicar porque está fora do escopo do tópico (e do blog como um todo...).&lt;br /&gt;&lt;br /&gt;Bom, é apenas uma sugestão.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Liberando os menus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuPanel&lt;/span&gt;s são objetos compartilháveis, assim como ícones. Isso serve, por exemplo, para exibir o mesmo painel pelo menu ou clicando com o botão direito sobre algum objeto.&lt;br /&gt;&lt;br /&gt;Sendo assim, devem ser liberados "na mãozona":&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;delete&lt;/span&gt;&lt;/b&gt; _fileMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;delete&lt;/span&gt;&lt;/b&gt; _editMenu&lt;span style="color: #990000;"&gt;;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois disso tudo, o menu Arquivo fica conforme a imagem a seguir. Em destaque, a barra de &lt;i&gt;status&lt;/i&gt; mostrando o texto do comando de sair.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_boFQgM_NDMg/SyZtKUlw16I/AAAAAAAAAeA/HEAgyXclZ-0/s1600-h/menu_arquivo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SyZtKUlw16I/AAAAAAAAAeA/HEAgyXclZ-0/s320/menu_arquivo.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Considerações finais&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notem o texto dos comandos de "Carregar imagem..." (menu Arquivo) e "Preferências..." (menu Editar). Eles terminam em reticências.&lt;br /&gt;&lt;br /&gt;Terminar um texto de exibição (tanto de comandos de menu como também de botões) com reticências informa imediatamente ao usuário que uma nova janela se abrirá, onde ele terá que executar mais ações.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Outra observação importante é onde posicionar o código para criação dos menus. No início, eu colocava tudo no construtor. As coisas foram aumentando de tamanho, e resolvi apenas criar a barra no construtor e chamar uma função, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;populateMenu()&lt;/span&gt;, para fazer essa tarefa.&lt;br /&gt;&lt;br /&gt;Agora, as coisas no meu projeto estão ficando grandes demais, e estou pensando seriamente em criar uma nova classe só para isso. Acontece que, na pressa de obter resultados, a gente acaba tocando tudo no mesmo lugar. Nessa brincadeira até o padrão MVC vai para o espaço. Por favor, não façam isso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bom, esse é o que tem de mais básico em termos de menus. Ainda vou discutir sobre submenus e outros elementos que podem aparecer em um &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMenuPanel&lt;/span&gt;. Um abraço e até lá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-4242039716469614755?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/4242039716469614755/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=4242039716469614755&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4242039716469614755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4242039716469614755'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/12/menus.html' title='Menus'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_boFQgM_NDMg/SyZtKUlw16I/AAAAAAAAAeA/HEAgyXclZ-0/s72-c/menu_arquivo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-5210939445907488044</id><published>2009-09-25T16:52:00.000-03:00</published><updated>2009-09-25T16:52:52.576-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FXMessageBox'/><title type='text'>FXMessageBox: Tratando a resposta do usuário</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://ideiasfox.blogspot.com/2009/05/fxmessagebox-opcoes-de-botoes.html"&gt;Neste tutorial&lt;/a&gt;, falei sobre as opções de botões que o &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMessageBox&lt;/span&gt;&amp;nbsp;fornece ao usuário. Obviamente, cada mensagem requer um conjunto de botões adequado. Mas como saber qual botão foi pressionado?&lt;br /&gt;&lt;br /&gt;Hoje, veremos como detectar qual o botão clicado pelo usuário, em resposta à mensagem exibida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Relembrando o conjunto de botões&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O protótipo das funções que exibem mensagens são da seguinte forma (&lt;span style="font-family: monospace;"&gt;message&lt;/span&gt;, aqui, é utilizado como um nome genérico para &lt;span style="font-family: monospace;"&gt;information&lt;/span&gt;, &lt;span style="font-family: monospace;"&gt;question&lt;/span&gt;, &lt;span style="font-family: monospace;"&gt;warning&lt;/span&gt; e &lt;span style="font-family: monospace;"&gt;error&lt;/span&gt;):&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;static&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXuint&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;message&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;FXWindow&lt;/span&gt;* &lt;span style="color: #2040a0;"&gt;owner&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;FXuint&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;opts&lt;/span&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;* &lt;span style="color: #2040a0;"&gt;caption&lt;/span&gt;,&lt;br /&gt;        &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;* &lt;span style="color: #2040a0;"&gt;message&lt;/span&gt;, ...);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O parâmetro &lt;span style="font-family: monospace;"&gt;opts&lt;/span&gt; é onde se informa o conjunto de botões que vão aparecer na mensagem, através da seguinte enumeração (abstraindo os valores):&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_OK_CANCEL&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_YES_NO&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_YES_NO_CANCEL&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_QUIT_CANCEL&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_QUIT_SAVE_CANCEL&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_SKIP_SKIPALL_CANCEL&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_SAVE_CANCEL_DONTSAVE&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Percebam, então, que os botões que podem aparecer em uma mensagem são:&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;OK&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Cancel&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Yes&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;No&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Quit&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Save&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Don't save&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Skip&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Skip All&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Tratando a resposta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Voltando ao protótipo da função, vemos que ela retorna um &lt;span style="font-family: monospace;"&gt;FXint&lt;/span&gt;. É justamente esse retorno que indica qual o botão pressionado. Esse valor também está presente em uma enumeração para facilitar (dar nomes a números mágicos é uma boa prática de programação). Essa enumeração é a seguinte:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_YES&lt;/span&gt;      = &lt;span style="color: red;"&gt;1&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The YES button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_NO&lt;/span&gt;       = &lt;span style="color: red;"&gt;2&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The NO button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_OK&lt;/span&gt;       = &lt;span style="color: red;"&gt;3&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The OK button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_CANCEL&lt;/span&gt;   = &lt;span style="color: red;"&gt;4&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The CANCEL button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_QUIT&lt;/span&gt;     = &lt;span style="color: red;"&gt;5&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The QUIT button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_SAVE&lt;/span&gt;     = &lt;span style="color: red;"&gt;6&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The SAVE button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_SKIP&lt;/span&gt;     = &lt;span style="color: red;"&gt;7&lt;/span&gt;,    &lt;span style="color: #444444;"&gt;/// The SKIP button was clicked&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_SKIPALL&lt;/span&gt;  = &lt;span style="color: red;"&gt;8&lt;/span&gt;     &lt;span style="color: #444444;"&gt;/// The SKIP ALL button was clicked&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;blockquote&gt;Oito valores enumerados para nove botões?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;É...&lt;br /&gt;&lt;br /&gt;Fuçando no código fonte, descobri algo assim:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXButton&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;buttons&lt;/span&gt;, &lt;span style="color: green;"&gt;"&amp;amp;Don't Save"&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;NULL&lt;/span&gt;, &lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;ID_CLICKED_NO&lt;/span&gt;, ...&lt;/pre&gt;&lt;br /&gt;Ou seja, o valor retornado quando o usuário clica em "Don't Save" é &lt;span style="font-family: monospace;"&gt;MBOX_CLICKED_NO&lt;/span&gt;. Faz sentido, mas eu acharia melhor se tivesse um nome específico, o valor até poderia ser o mesmo. Mas vai entender...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vou dar um exemplo simples, até porque aqui não tem mistério nenhum (fora esse de cima...). Suponha que o usuário vai realizar uma operação que não pode ser desfeita. Isso deve ser informado ao usuário, caso ele volte atrás em sua decisão. Nosso tratador fica assim:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdEraseAll&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;*, &lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;*) &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FXuint&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;answer&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;answer&lt;/span&gt; = &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;question&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_YES_NO&lt;/span&gt;, &lt;span style="color: green;"&gt;"Apagar tudo"&lt;/span&gt;,&lt;br /&gt;      &lt;span style="color: green;"&gt;"Essa ação não pode ser desfeita.&lt;span style="color: #77dd77;"&gt;\n&lt;/span&gt;Deseja continuar?"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;switch&lt;/strong&gt; (&lt;span style="color: #2040a0;"&gt;answer&lt;/span&gt;) &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_YES&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;information&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: green;"&gt;"Dados apagados"&lt;/span&gt;,&lt;br /&gt;          &lt;span style="color: green;"&gt;"Todos os dados foram apagados."&lt;/span&gt;);&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;MBOX_CLICKED_NO&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;information&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: green;"&gt;"Dados não apagados"&lt;/span&gt;,&lt;br /&gt;          &lt;span style="color: green;"&gt;"Os dados não foram apagados."&lt;/span&gt;);&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;default&lt;/strong&gt;: &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;  &lt;strong&gt;}&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cSMFKw2DmN0&amp;hl=pt-br&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cSMFKw2DmN0&amp;hl=pt-br&amp;fs=1&amp;color1=0x006699&amp;color2=0x54abd6&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nada de mais aqui. Se o usuário clicou em "Yes", exibe uma mensagem informando que todos os dados foram apagados. Se clicou em "No", informa que não foram apagados. Realmente sem mistérios.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este tópico foi apenas um complemento de outro anterior (link). Aqui encerro oficialmente a série sobre o &lt;span style="font-family: monospace;"&gt;FXMessageBox&lt;/span&gt;. A partir daqui, começaremos a falar de elementos que compõem uma interface gráfica típica (menus, barras de ferramentas, barra de &lt;i&gt;status&lt;/i&gt; etc.). Até lá!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-5210939445907488044?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/5210939445907488044/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=5210939445907488044&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5210939445907488044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5210939445907488044'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/09/fxmessagebox-tratando-resposta-do.html' title='FXMessageBox: Tratando a resposta do usuário'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-8683674633848339362</id><published>2009-09-18T13:41:00.007-03:00</published><updated>2009-09-18T18:04:28.354-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Sem eventos a tratar</title><content type='html'>&lt;div style="text-align: justify;"&gt;Pode parecer contraditório (e talvez realmente seja) o título deste tópico, mas não vejo onde mais encaixá-lo senão na categoria de Tratamento de Eventos.&lt;br /&gt;&lt;br /&gt;Acontece que às vezes criamos uma janela que não precisa tratar nenhum evento em especial, portanto não necessita do mapa de mensagens. É sobre isso que falarei neste tópico.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Quando a janela não trata eventos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine que você precisa de uma janela apenas para exibir algumas informações. Nenhuma entrada do usuário é necessária, nenhuma ação do usuário é executada. Essa janela não precisa tratar evento nenhum, então não precisa de um mapa de mensagens.&lt;br /&gt;&lt;br /&gt;Ainda assim, precisa chamar a macro &lt;span style="font-family: monospace;"&gt;FXIMPLEMENT&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Uma pausa para algumas explicações&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de tantos tópicos escritos, só agora senti a necessidade de explicar para que serve esse par de macros: &lt;span style="font-family: monospace;"&gt;FXDECLARE&lt;/span&gt;/&lt;span style="font-family: monospace;"&gt;FXIMPLEMENT&lt;/span&gt;. Confesso que eu simplesmente utilizava, mas sem saber qual o real significado delas. Escrevendo este tópico, tive a curiosidade de investigá-las.&lt;br /&gt;&lt;br /&gt;A macro &lt;span style="font-family: monospace;"&gt;FXDECLARE&lt;/span&gt;, como o próprio nome sugere, é colocada dentro da declaração da classe.  Após expandida, ela toma a seguinte forma (coloquei espaços para melhorar a legibilidade ):&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;pre&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;struct&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;keylo&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;keyhi&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;classname&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;func&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXMetaClass&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;metaClass&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;static&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;manufacture&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;virtual&lt;/strong&gt; &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;handle&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sender&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;,&lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;ptr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;virtual&lt;/strong&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXMetaClass&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;getMetaClass&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;metaClass&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;friend&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXStream&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;strong&gt;operator&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXStream&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;store&lt;/span&gt;,&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;classname&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;obj&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;store&lt;/span&gt;.&lt;span style="color: #2040a0;"&gt;saveObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObjectPtr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;obj&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;friend&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXStream&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;strong&gt;operator&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXStream&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;store&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;classname&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;obj&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;store&lt;/span&gt;.&lt;span style="color: #2040a0;"&gt;loadObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObjectPtr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;obj&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;private&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Explicando:&lt;br /&gt;&lt;ul&gt;&lt;li dir="ltr"&gt;Ela cria uma &lt;span style="font-family: monospace;"&gt;struct&lt;/span&gt; interna, chamada &lt;span style="font-family: monospace;"&gt;FXMapEntry&lt;/span&gt;, que armazena as entradas do mapa de mensagens.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Declara um objeto estático do tipo &lt;span style="font-family: monospace;"&gt;FXMetaClass&lt;/span&gt;, que armazena informações que descrevem um objeto FOX.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span style="font-family: monospace;"&gt;manufacture()&lt;/span&gt; nada mais é que um método fábrica que retorna um novo objeto; por isso o construtor padrão vazio privado é obrigatório.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;&lt;span style="font-family: monospace;"&gt;handle()&lt;/span&gt; é o método utilizado para executar as ações propriamente ditas e também utilizado para delegar ações a outros objetos.&lt;br /&gt;&lt;/li&gt;&lt;li dir="ltr"&gt;Os demais são irrelevantes no momento.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Pois bem, a outra macro, &lt;span style="font-family: monospace;"&gt;FXIMPLEMENT&lt;/span&gt;, é o complementar de &lt;span style="font-family: monospace;"&gt;FXDECLARE&lt;/span&gt;. É ela quem vai implementar os métodos declarados por &lt;span style="font-family: monospace;"&gt;FXDECLARE&lt;/span&gt;. Por isso ela é obrigatória, mesmo na ausência do mapa de mensagens. Após expandida, o método &lt;span style="font-family: monospace;"&gt;handle()&lt;/span&gt; é implementado da seguinte maneira:&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;pre&gt;&lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;classname&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;handle&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sender&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;FX&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;ptr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;me&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;=&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;metaClass&lt;/span&gt;.&lt;span style="color: #2040a0;"&gt;search&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;me&lt;/span&gt; ? &lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;me&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;func&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;sender&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;ptr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #4444ff;"&gt;:&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;baseclassname&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;handle&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;sender&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;,&lt;span style="color: #2040a0;"&gt;ptr&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Fuçando no código-fonte, vi que o método &lt;span style="font-family: monospace;"&gt;search()&lt;/span&gt; faz uma busca linear pelo mapa de mensagens, até encontrar uma entrada contenha o &lt;span style="font-family: monospace;"&gt;FXSelector sel&lt;/span&gt; (passado como parâmetro de &lt;span style="font-family: monospace;"&gt;handle()&lt;/span&gt;). Vejam:&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;pre&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;FXMetaClass&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;search&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;key&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;register&lt;/strong&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;=&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;assoc&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;register&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXuint&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;n&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;=&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;nassocs&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;while&lt;/strong&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;n&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;keylo&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;=&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;key&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;key&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;=&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;-&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;keyhi&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;=&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXObject&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;:&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FXchar&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;*&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;lst&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;+&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;assocsz&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;NULL&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Ou seja, se encontrar a entrada, executa a função associada; senão, delega para a superclasse. Isto segue o padrão de projeto "Cadeia de Responsabilidade" ("&lt;i&gt;&lt;span style="font-family: monospace;"&gt;Chain of Responsibility&lt;/span&gt;&lt;/i&gt;"), em que um objeto vai delegando a ação a seus superiores (digamos assim), até que alguém o trate. Neste caso, o topo da hierarquia é &lt;span style="font-family: monospace;"&gt;FXObject&lt;/span&gt;, cujo método &lt;span style="font-family: monospace;"&gt;handle()&lt;/span&gt; chama &lt;span style="font-family: monospace;"&gt;onDefault()&lt;/span&gt;, que apenas retorna &lt;span style="font-family: monospace;"&gt;0&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Voltando...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de toda essa explicação, podemos voltar ao nosso assunto principal. Suponhamos que temos uma janela que não trata nenhum evento. Neste caso, existem duas opções: declarar um mapa vazio, ou simplesmente não declarar mapa nenhum. A primeira opção já foi discutida em um dos primeiros tutoriais, mas vou reproduzi-la aqui:&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXDEFMAP&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;[&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;]&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;=&lt;/span&gt; &lt;span style="color: #4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXIMPLEMENT&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;FXMainWindow&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ARRAYNUMBER&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Neste caso, a macro &lt;span style="font-family: monospace;"&gt;ARRAYNUMBER&lt;/span&gt; calcula o tamanho do vetor, que é &lt;span style="font-family: monospace;"&gt;0&lt;/span&gt; (cuidado: alguns compiladores reclamam). Na hora da busca pela mensagem, o laço &lt;span style="font-family: monospace;"&gt;while&lt;/span&gt; é ignorado e a função retorna &lt;span style="font-family: monospace;"&gt;NULL&lt;/span&gt;, disparando o processo já discutido.&lt;br /&gt;&lt;br /&gt;A outra maneira é não declarar mapa nenhum. A chamada a &lt;span style="font-family: monospace;"&gt;FXIMPLEMENT&lt;/span&gt; fica assim:&lt;br /&gt;&lt;div style="overflow: auto;"&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXIMPLEMENT&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;(&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;FXMainWindow&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;NULL&lt;/span&gt;, &lt;span style="color: red;"&gt;0&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acho que este tópico encerra a discussão sobre o mapa de mensagens. Se eu me lembrar de alguma outra coisa nesse sentido, postarei aqui.&lt;br /&gt;&lt;br /&gt;Entretanto, ainda há muito o que falar com relação ao tratamento de mensagens. Essa série será bem longa! Até a próxima!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-8683674633848339362?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/8683674633848339362/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=8683674633848339362&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8683674633848339362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8683674633848339362'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-sem-eventos.html' title='Tratamento de Eventos: Sem eventos a tratar'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-6787312078036670379</id><published>2009-09-17T12:31:00.002-03:00</published><updated>2009-09-17T12:33:55.406-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Uma ação para vários IDs</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quando falei sobre o mapa de mensagens (&lt;a href="http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-mapa-de-mensagens_14.html"&gt;aqui&lt;/a&gt;), eu adicionei quatro mapeamentos. Entretanto, todos eles eram do mesmo tipo e chamavam a mesma ação; vejam:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;SEL_COMMAND&lt;/b&gt;&lt;/span&gt;&lt;b&gt;,&lt;/b&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_INFORMATION&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;&lt;b&gt;onCmdMessage&lt;/b&gt;&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;&lt;b&gt;SEL_COMMAND&lt;/b&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_QUESTION&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;&lt;b&gt;onCmdMessage&lt;/b&gt;&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;&lt;b&gt;SEL_COMMAND&lt;/b&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_WARNING&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;&lt;b&gt;onCmdMessage&lt;/b&gt;&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;&lt;b&gt;SEL_COMMAND&lt;/b&gt;&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_ERROR&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;&lt;b&gt;onCmdMessage&lt;/b&gt;&lt;/span&gt;),&lt;/pre&gt;&lt;br /&gt;Uma situação dessas ocorre quando eu tenho várias ações muito semelhantes: em vez de definir um &lt;i&gt;callback&lt;/i&gt; para cada ação, eu defino apenas um; a diferença entre eles é feita dentro do corpo da função.&lt;br /&gt;&lt;br /&gt;O FOX Toolkit fornece uma macro auxiliar para facilitar essa tarefa: &lt;span style="font-family: monospace;"&gt;FXMAPFUNCS&lt;/span&gt;. Neste tópico, explicarei como usá-la.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Definindo uma ação para vários IDs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Diante de uma situação dessas, seria bem mais fácil se eu pudesse diminuir o número de linhas a serem escritas. A propósito, o FOX Toolkit tem um &lt;i&gt;slogan&lt;/i&gt; que diz: "Cada linha de código &lt;b&gt;não&lt;/b&gt; escrita é uma linha &lt;b&gt;correta&lt;/b&gt;". Pense no caso de uma calculadora: cada botão executa uma ação bem semelhante um ao outro: adicionar o seu valor à expressão e atualizar a caixa de texto que a exibe.&lt;br /&gt;&lt;br /&gt;Imagina se eu tivesse que escrever uma função para cada botão? Seriam 10 botões de dígitos + 5 operações (contanto com a igualdade), isso apenas para uma calculadora básica. 15 funções, 15 entradas no mapa.&lt;br /&gt;&lt;br /&gt;Para facilitar, pode-se definir apenas uma função e ligá-las todas aos botões da calculadora. E para evitar as quinze entradas no mapa, utiliza-se a macro &lt;span style="font-family: monospace;"&gt;FXMAPFUNCS&lt;/span&gt;. Para não ficar maçante, e reaproveitar os códigos já escritos, vou voltar ao exemplo do tutorial sobre as &lt;a href="http://ideiasfox.blogspot.com/2009/05/fxmessagebox-tipos-de-mensagem.html"&gt;mensagens exibidas ao usuário&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Declarando as mensagens&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para poder utilizar a macro &lt;span style="font-family: monospace;"&gt;FXMAPFUNCS&lt;/span&gt;, é necessário que os IDs das mensagens sejam declarados seqüencialmente. Isso porque a macro pega um intervalo de IDs. No nosso exemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;ID_INFORMATION&lt;/span&gt; = &lt;span style="color: #2040a0;"&gt;FXMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_LAST&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;ID_QUESTION&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;ID_WARNING&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;ID_ERROR&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;ID_LAST&lt;/span&gt;,&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Com isso, basta usar a macro mágica. A sintaxe dela é:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;FXMAPFUNCS(tipo, ID_min, ID_max, callback)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No nosso exemplo, o mapa de mensagens fica assim:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXDEFMAP&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;) &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;[] = &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;span style="color: #2040a0;"&gt;FXMAPFUNCS&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;             &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_INFORMATION&lt;/span&gt;,&lt;br /&gt;             &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_ERROR&lt;/span&gt;,&lt;br /&gt;             &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;),&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ou seja, com apenas uma chamada, eu defini a mesma ação para quatro mensagens diferentes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Diferenciando as mensagens&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Já que cada evento vai disparar a mesma ação, é preciso diferenciar os diferentes eventos. Todo &lt;i&gt;callback&lt;/i&gt; no FOX Toolkit tem o mesmo formato (com os nomes típicos dos parâmetros):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;long onAction(FXObject *sender, FXSelector sel, void *ptr);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste caso, o que mais importa é o segundo parâmetro (sempre que um parâmetro não for utilizado, pode permanecer anônimo). Um &lt;span style="font-family: monospace;"&gt;FXSelector&lt;/span&gt; nada mais é que uma mistura entre o tipo de mensagem e o ID da mensagem. Essa mistura é feita automaticamente pela macro &lt;span style="font-family: monospace;"&gt;FXSEL&lt;/span&gt; ao se acrescentar uma entrada no mapa. Apenas adiantando uma informação, essa macro também é utilizada ao se delegar ações; falarei sobre isso no futuro.&lt;br /&gt;&lt;br /&gt;Já que o FOX junta essas duas informações, ele pode separá-las: &lt;span style="font-family: monospace;"&gt;FXSELID&lt;/span&gt; recupera o ID da mensagem, e &lt;span style="font-family: monospace;"&gt;FXSELTYPE&lt;/span&gt; recupera o tipo da mensagem. Sendo assim, fica fácil saber quem enviou a mensagem, sem precisar recorrer a ponteiros (como normalmente acontece com uma certa linguagem que dizem não ter ponteiros). Um teste &lt;span style="font-family: monospace;"&gt;switch&lt;/span&gt; resolve o caso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;(&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;        FXObject&lt;/span&gt;*, &lt;span style="color: #2040a0;"&gt;FXSelector&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;*) &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;  &lt;strong&gt;switch&lt;/strong&gt; (&lt;span style="color: #2040a0;"&gt;FXSELID&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;sel&lt;/span&gt;)) &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;ID_INFORMATION&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;information&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: green;"&gt;"Informação"&lt;/span&gt;,&lt;br /&gt;              &lt;span style="color: green;"&gt;"Operação finalizada"&lt;/span&gt;);&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;ID_QUESTION&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;question&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_YES_NO&lt;/span&gt;, &lt;span style="color: green;"&gt;"Sair"&lt;/span&gt;,&lt;br /&gt;              &lt;span style="color: green;"&gt;"Deseja realmente sair do programa?"&lt;/span&gt;);&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;ID_WARNING&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;warning&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: green;"&gt;"Aviso"&lt;/span&gt;,&lt;br /&gt;              &lt;span style="color: green;"&gt;"Valor não especificado.&lt;span style="color: #77dd77;"&gt;\n&lt;/span&gt;Atribuindo padrão 1."&lt;/span&gt;);&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;case&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;ID_ERROR&lt;/span&gt;:&lt;br /&gt;      &lt;span style="color: #2040a0;"&gt;FXMessageBox&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;error&lt;/span&gt;(&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: #2040a0;"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: green;"&gt;"Erro"&lt;/span&gt;,&lt;br /&gt;              &lt;span style="color: green;"&gt;"%s: Arquivo não encontrado"&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;filename&lt;/span&gt;.&lt;span style="color: #2040a0;"&gt;text&lt;/span&gt;());&lt;br /&gt;    &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;default&lt;/strong&gt;: &lt;strong&gt;break&lt;/strong&gt;;&lt;br /&gt;  &lt;strong&gt;}&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: red;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Percebam que como eu não uso nem o primeiro nem o último parâmetro, deixei eles anônimos. Dar um nome a eles pode gerar um &lt;i&gt;warning&lt;/i&gt; enjoado por parte do compilador.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste exemplo, utilizei &lt;span style="font-family: monospace;"&gt;FXSELID&lt;/span&gt; para recuperar o ID da mensagem dentro do &lt;span style="font-family: monospace;"&gt;FXSelector&lt;/span&gt;. Mas eu falei também de &lt;span style="font-family: monospace;"&gt;FXSELTYPE&lt;/span&gt;, para recuperar o tipo. Isso me dá a chance de definir a mesma ação para diferentes tipos e diferenciá-los dentro da função.&lt;br /&gt;&lt;br /&gt;Não tenho certeza se dá para fazer algo semelhante no mapa; existem duas macros, &lt;span style="font-family: monospace;"&gt;FXMAPTYPE&lt;/span&gt; e &lt;span style="font-family: monospace;"&gt;FXMAPTYPES&lt;/span&gt;, mas nunca as utilizei. Parece que elas definem um mapeamento de um tipo de mensagem (ou intervalo de tipos, no caso da segunda) para todos os IDs possíveis, chamando a mesma ação. Resumindo: melhor não usar.&lt;br /&gt;&lt;br /&gt;Com relação ao mapa de mensagens, acho que só falta falar de quando uma janela não trata nenhum evento. Mas se eu lembrar de mais alguma outra coisa, eu posto aqui. Até a próxima.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-6787312078036670379?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/6787312078036670379/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=6787312078036670379&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6787312078036670379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6787312078036670379'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-uma-acao-para.html' title='Tratamento de Eventos: Uma ação para vários IDs'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-4437358369950401133</id><published>2009-09-15T12:10:00.001-03:00</published><updated>2009-09-15T12:11:35.251-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Tipos de mensagem</title><content type='html'>No &lt;a href="http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-mapa-de-mensagens_14.html"&gt;tópico anterior&lt;/a&gt;, falei especificamente sobre o mapa de mensagens. Neste tópico, falarei sobre alguns tipos de mensagem que podem ser disparados.&lt;br /&gt;&lt;br /&gt;Talvez esse tópico seja um pouco maçante, porque existem diversos tipos. Vou ser breve em cada um deles, pois são mais uma questão de prática que de teoria.&lt;br /&gt;&lt;br /&gt;Outra característica deste tópico é que, apesar de no FOX Toolkit não haver nenhuma distinção de categoria de eventos (eventos de  mouse, teclado, janela etc), vou dividi-los aqui dessa forma para facilitar a leitura.&lt;br /&gt;&lt;br /&gt;Os tipos de mensagem estão definidos em &lt;span style="font-family: monospace;"&gt;fxdefs.h&lt;/span&gt;. Não vou copiá-lo aqui porque são 80 tipos de mensagem (sem contar o primeiro, &lt;span style="font-family: monospace;"&gt;SEL_NONE&lt;/span&gt;, e o último, &lt;span style="font-family: monospace;"&gt;SEL_LAST&lt;/span&gt;). Estão definidos dentro da enumeração &lt;span style="font-family: monospace;"&gt;FXSelType&lt;/span&gt;, e todos têm o prefixo &lt;span style="font-family: monospace;"&gt;SEL_&lt;/span&gt;. Sendo 80, é muito provável que a maioria deles não seja utilizada. Eu, pelo menos, não utilizo muitos. Portanto, vou limitar a minha explicação àqueles que eu já usei, ou que pelo menos sei para que servem.&lt;br /&gt;&lt;br /&gt;Vou tentar também seguir a ordem em que são declarados na enumeração. Ainda, vou agrupar eventos muito semelhantes ou complementares. Comecemos então a analisá-los.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Eventos de teclado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_KEYPRESS&lt;br /&gt;SEL_KEYRELEASE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em se tratando de teclado, há somente esses dois eventos a serem tratados. Uma tecla foi pressionada (&lt;span style="font-family: monospace;"&gt;SEL_KEYPRESS&lt;/span&gt;), uma tecla foi liberada (&lt;span style="font-family: monospace;"&gt;SEL_KEYRELEASE&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Apenas uma observação: se o programa não se importar com qual foi a tecla pressionada/liberada, não há nada extra. Mas se a tecla for importante, é necessário incluir o arquivo &lt;span style="font-family: monospace;"&gt;fxkeys.h&lt;/span&gt;. Nele estão as definições dos valores de todas as teclas que podem ser pressionadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Eventos de &lt;i&gt;mouse&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_LEFTBUTTONPRESS&lt;br /&gt;SEL_LEFTBUTTONRELEASE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Botão esquerdo do &lt;i&gt;mouse&lt;/i&gt; pressionado/liberado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_MIDDLEBUTTONPRESS&lt;br /&gt;SEL_MIDDLEBUTTONRELEASE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Botão do meio do&lt;i&gt; mouse&lt;/i&gt; pressionado/liberado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_RIGHTBUTTONPRESS&lt;br /&gt;SEL_RIGHTBUTTONRELEASE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Botão direito do &lt;i&gt;mouse&lt;/i&gt; pressionado/liberado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_MOTION&lt;br /&gt;SEL_ENTER&lt;br /&gt;SEL_LEAVE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esses três tipos de mensagem referem-se ao movimento do &lt;i&gt;mouse&lt;/i&gt; relativo ao objeto que lança o evento. Quando um mouse entra na área do objeto, este lança um evento do tipo &lt;span style="font-family: monospace;"&gt;SEL_ENTER&lt;/span&gt;. Quando o &lt;i&gt;mouse&lt;/i&gt; se move dentro de um objeto, este lança um evento do tipo &lt;span style="font-family: monospace;"&gt;SEL_MOTION&lt;/span&gt;. Finalmente, quando o &lt;i&gt;mouse&lt;/i&gt; sai da área do objeto, este lança um evento do tipo &lt;span style="font-family: monospace;"&gt;SEL_LEAVE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_CLICKED&lt;br /&gt;SEL_DOUBLECLICKED&lt;br /&gt;SEL_TRIPLECLICKED&lt;br /&gt;SEL_MOUSEWHEEL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Clique, duplo clique, triplo clique e movimento da roda do mouse. Não lembro de ter usado nenhum dos três primeiros.&lt;br /&gt;&lt;br /&gt;Já o tratamento do evento da roda do mouse é meio esquisito; no momento não me recordo como é feito, mas futuramente falaremos disso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Eventos de janela&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_PAINT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Indica que um objeto deve ser redesenhado. Muito útil quando se tem um &lt;i&gt;canvas&lt;/i&gt;: define-se um &lt;i&gt;callback&lt;/i&gt; que desenha no &lt;i&gt;canvas&lt;/i&gt;, que é executado sempre que este lança um evento do tipo &lt;span style="font-family: monospace;"&gt;SEL_PAINT&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_CONFIGURE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este evento é lançado quando a janela é redimensionada. Este aqui é utilizado, por exemplo, quando há uma janela com um &lt;i&gt;canvas&lt;/i&gt; OpenGL que, ao ser redimensionada, precisa reajustar a &lt;i&gt;viewport&lt;/i&gt; e as matrizes de visualização para evitar distorções na imagem (quem trabalha com OpenGL sabe do que estou falando).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_UPDATE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este evento é lançado constantemente pelo objetos. Ao capturar um evento destes, é possível alterar o estado do objeto que o lançou. Por exemplo, um botão deve permanecer inativo enquanto não houver nenhum arquivo aberto; a partir do momento em que abre-se um arquivo, este botão deve ser ativado. Isto pode ser feito capturando-se o evento do tipo &lt;span style="font-family: monospace;"&gt;SEL_UPDATE&lt;/span&gt; que ele lança.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Execução de comandos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_COMMAND&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sempre que eu falo desse tipo de mensagem eu dou os exemplos mais básicos possíveis: um botão clicado e um menu acionado. Mas não são somente botões e menus que enviam mensagens deste tipo. Diversos componentes também o fazem, mas isso fica para tópicos mais específicos. Por enquanto, esses dois exemplos são suficientes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_TIMEOUT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Serve para chamar a ação associada depois de um determinado intervalo de tempo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;SEL_CHORE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Serve para executar a ação associada sempre que não houver nenhum outro evento para tratar.&lt;br /&gt;&lt;br /&gt;No início, eu utilizava para redesenhar o &lt;i&gt;canvas&lt;/i&gt; o tempo inteiro. Em aplicações simples, isso não proporcionava perda de desempenho perceptível. Quando eu fiz um programa maior, de reconstrução de subestações elétricas, isso deixava lentíssimo. Foi só eu deixar isso de lado e atualizar o &lt;i&gt;canvas&lt;/i&gt; somente quando necessário e o programa ficou uma bala. Portanto, evitem usar o &lt;i&gt;chore&lt;/i&gt; dessa maneira, a menos que vocês queiram ter certeza que o processador está trabalhando (possivelmente à toa...).&lt;br /&gt;&lt;br /&gt;Curiosidade: "&lt;i&gt;chore&lt;/i&gt;" significa "tarefa doméstica".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este tópico foi apenas uma introdução aos tipos de mensagem, mostrando apenas um pouco da teoria. Bem melhor será quando forem vistos na prática. Portanto, escreverei tópicos específicos para explicar com mais detalhes e mostrar exemplos do tratamento de cada tipo aqui apresentado. Até lá.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-4437358369950401133?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/4437358369950401133/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=4437358369950401133&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4437358369950401133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4437358369950401133'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-tipos-de-mensagem.html' title='Tratamento de Eventos: Tipos de mensagem'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-1052804852354158688</id><published>2009-09-14T14:26:00.001-03:00</published><updated>2009-09-14T14:28:03.405-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Mapa de mensagens</title><content type='html'>&lt;div style="text-align: justify;"&gt;O mapa de mensagens é, digamos assim, o cerne do tratamento de eventos no FOX Toolkit. É ele quem determina que &lt;i&gt;callback&lt;/i&gt; deve ser chamado em resposta a que tipo de mensagem, enviada por um determinado objeto.&lt;br /&gt;&lt;br /&gt;Neste tópico, explicarei com mais detalhes como funciona o mapa. Vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Definição do mapa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O mapa de mensagens é definido através da macro &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXDEFMAP&lt;/span&gt;. Essa macro recebe um parâmetro, que é o nome da classe. Com esta macro, declara-se um vetor onde são armazenados os mapeamentos de mensagens; essa macro expandida nada mais é que uma declaração de uma variável normal. Seguindo o exemplo dos nossos tutoriais, temos o seguinte:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXDEFMAP&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;) &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;[] = &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Essa macro (que termina com o parêntese fechado) é expandida na seguinte declaração:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;FXMapEntry&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;[] = &lt;strong&gt;{&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;}&lt;/strong&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sendo que &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMapEntry&lt;/span&gt; é uma &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;struct&lt;/span&gt; interna criada automaticamente pela macro &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXDECLARE&lt;/span&gt;, chamada ao declararmos a classe &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FoxTutorialMainWindow&lt;/span&gt; (lembram?). Ou seja, estamos declarando um vetor de entradas do mapa de mensagem.&lt;br /&gt;&lt;br /&gt;Percebam o nome do vetor de mapeamento. Aqui temos um padrão de nomenclatura: o nome do vetor é composto pelo nome da classe com o sufixo "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Map&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Dentro deste vetor, colocamos os mapeamentos em si. Isto é feito com auxílio da macro &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMAPFUNC&lt;/span&gt;, que veremos em seguida.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Adicionando mapeamentos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A macro &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FXMAPFUNC&lt;/span&gt; recebe três parâmetros: o tipo da mensagem, o ID da mensagem e um ponteiro para o &lt;i&gt;callback&lt;/i&gt;. Tomando como exemplo &lt;a href="http://ideiasfox.blogspot.com/2009/05/fxmessagebox-tipos-de-mensagem.html"&gt;este tutorial&lt;/a&gt;, adicionamos os seguintes mapeamentos:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_INFORMATION&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_QUESTION&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_WARNING&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;ID_ERROR&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #2040a0;"&gt;FoxTutorialMainWindow&lt;/span&gt;::&lt;span style="color: #2040a0;"&gt;onCmdMessage&lt;/span&gt;),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Tipo de mensagem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Informa qual o tipo de evento que foi disparado: um comando, um clique do &lt;i&gt;mouse&lt;/i&gt;, uma tecla pressionada, uma janela redimensionada etc.&lt;br /&gt;&lt;br /&gt;Teremos um tópico exclusivo (ou vários tópicos...) para discutir os diferentes tipos de mensagem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;ID da mensagem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De certa maneira, identifica quem enviou a mensagem. Junto com o tipo da mensagem, tem-se uma combinação suficiente para dizer que ação (&lt;i&gt;callback&lt;/i&gt;) deve ser executada. Essa combinação deve ser única, portanto uma declaração como a seguinte não é válida:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_ACTION&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCmdAction1&lt;/span&gt;),&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_COMMAND&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_ACTION&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCmdAction2&lt;/span&gt;),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Neste caso, tentamos fazer com que a mesma mensagem ative duas ações, o que na realidade não ocorre. É possível, entretanto, combinar a mesma mensagem com diferentes tipos, podendo ou não executar a mesma ação. Por exemplo, eu tenho um &lt;i&gt;canvas&lt;/i&gt; (área de desenho) que deve executar uma determinada ação quando o mouse for clicado e outra quando for redimensionado. Como é um objeto só, ele vai ter apenas um ID, diga-se &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ID_CANVAS&lt;/span&gt;. No mapa, teremos (para efeito de exemplo, vou omitir o escopo dos identificadores; compare com os exemplos reais acima):&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_CLICKED&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_CANVAS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCanvasClick&lt;/span&gt;),&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_CONFIGURE&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_CANVAS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCanvasConfigure&lt;/span&gt;),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;É possível, ainda, que um mesmo ID, com diferentes tipos de mensagem, execute a mesma ação. Digamos que nosso &lt;i&gt;canvas&lt;/i&gt; trate igualmente o clique com o botão esquerdo e direito do &lt;i&gt;mouse&lt;/i&gt;:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_LEFTBUTTONPRESS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_CANVAS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCanvasClick&lt;/span&gt;),&lt;br /&gt;&lt;span style="color: #2040a0;"&gt;FXMAPFUNC&lt;/span&gt;(&lt;span style="color: #2040a0;"&gt;SEL_RIGHTBUTTONPRESS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;ID_CANVAS&lt;/span&gt;, &lt;span style="color: #2040a0;"&gt;onCanvasClick&lt;/span&gt;),&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Resumindo, apenas a combinação &amp;lt;tipo de mensagem, id da mensagem&amp;gt; deve ser única.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Ponteiro para o &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: x-large;"&gt;callback&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;É exatamente isso: um ponteiro para a função membro, que foi declarada na classe (e, naturalmente, deve estar devidamente implementada). Realmente não há muito o que dizer aqui.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Observações finais&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nos exemplos didáticos, eu removi o escopo dos identificadores (id e ponteiros de função) por motivos de espaço. É necessário fornecê-los pelo seguinte motivo: a declaração do mapa de mensagens, na verdade, declara um vetor global, ou seja, fora do escopo da classe. Estando fora do escopo da classe, é necessário informá-lo, qualificando os identificadores através do operador de escopo ( &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;::&lt;/span&gt; ).&lt;br /&gt;&lt;br /&gt;Outro motivo, talvez menos comum, é que é possível que um objeto de uma classe execute uma ação de outro objeto de outra classe. Isso acontece, por exemplo, quando um botão de uma caixa de diálogo altera o estado de um componente da janela principal, ou seja, o comando deste botão dispara uma ação da janela principal.&lt;br /&gt;&lt;br /&gt;Estes dois motivos explicam, também, porque tanto as IDs das mensagens quanto as ações devem estar localizadas na interface pública da classe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste tópico, apresentei alguns detalhes referentes ao mapa de mensagens. É muito importante entendê-lo, já que ele informa que ações devem ser executadas em resposta às diversas ações do usuário.&lt;br /&gt;&lt;br /&gt;Existem ainda alguns outros detalhes, mas que deixarei para outros tópicos, pois acho que este já está extenso e cobriu bem o básico. Até lá.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-1052804852354158688?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/1052804852354158688/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=1052804852354158688&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/1052804852354158688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/1052804852354158688'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/09/tratamento-de-eventos-mapa-de-mensagens_14.html' title='Tratamento de Eventos: Mapa de mensagens'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-9222505173796795905</id><published>2009-07-15T12:10:00.003-03:00</published><updated>2009-07-15T12:17:49.305-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dúvidas'/><title type='text'>Liberando memória</title><content type='html'>&lt;div style="text-align: justify;"&gt;Foi postada na lista de e-mails do FOX Toolkit uma dúvida que achei bem interessante para colocar aqui, pois é um assunto básico: liberação de memória.&lt;br /&gt;&lt;br /&gt;A dúvida foi enviada por John Selverian, e apresento-a aqui, junto com a resposta dada pelo Jeroen van der Zijp. Ela tem alguns conceitos que ainda não apresentei aqui, mas serve como um norte para o futuro.&lt;br /&gt;&lt;br /&gt;Já falei rapidamente sobre isso em tópicos anteriores, mas creio que postando essa dúvida aqui o assunto fique mais sólido, além de apresentar um aspecto bem interessante a esse respeito. Vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Liberando memória&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Eu tenho uma pergunta bem básica. Eu tenho várias janelas &lt;span style="font-family:courier new;"&gt;FXDialogBox&lt;/span&gt;. Nos arquivos de cabeçalho eu declaro ponteiros e no construtor eu aloco a memória. No método de sair de algumas dessas &lt;span style="font-family:courier new;"&gt;FXDialogBox&lt;/span&gt; eu deleto a memória e em algumas não (&lt;span style="font-style: italic;"&gt;sloppy programming&lt;/span&gt;, eu acho). Não vejo diferença na alocação de memória ou vazamento. Estou fazendo algo errado ou a memória é automaticamente liberada pelo FOX? Também, muitas vezes meu destrutor não é chamado... isso faz sentido?&lt;br /&gt;&lt;br /&gt;Obrigado,&lt;br /&gt;&lt;br /&gt;John S&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resposta&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;O FOX tenta liberar a memória, sim. Mas não há contagem de referência ou coleta de lixo, então ele só deleta as coisas que sabe que pode deletar:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Janelas pais liberam &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; filhos.&lt;/li&gt;&lt;li&gt;A árvore de &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; inteira é liberada pelo &lt;span style="font-family:courier new;"&gt;FXApp&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Mas:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Recursos compartilhados como ícones, fontes NÃO são deletados, já que várias referências podem existir (exceção: &lt;span style="font-style: italic;"&gt;stock icons&lt;/span&gt; e cursores que são criados pelo &lt;span style="font-family:courier new;"&gt;FXApp&lt;/span&gt;).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Uma regra simples é deletar, no destrutor do diálogo, todos os ícones/fontes/etc. que você criar em seu construtor do diálogo.&lt;br /&gt;&lt;br /&gt;No FOX 1.7, agora tem &lt;span style="font-family:courier new;"&gt;FXAutoPtr&lt;/span&gt;, que faz isso bem fácil:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;class&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;MyDialog&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt; &lt;strong&gt;public&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXDialog&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXAutoPtr&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;buttonIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A idéia do &lt;span style="font-family:courier new;"&gt;FXAutoPtr&lt;/span&gt; é comportar-se como um ponteiro normal mas agir como o único dono do objeto para o qual aponta, e então quando o &lt;span style="font-family:courier new;"&gt;FXAutoPtr&lt;/span&gt; é destruído então o objeto que ele aponta também é destruído.&lt;br /&gt;&lt;br /&gt;Então declarar suas variáveis de ícones como &lt;span style="font-family:courier new;"&gt;FXAutoPtr&lt;/span&gt;&lt;fxicon&gt; em vez de &lt;span style="font-family:courier new;"&gt;FXIcon*&lt;/span&gt; vai eliminar a necessidade de escrever explicitamente comandos delete em seus destrutores.&lt;br /&gt;&lt;br /&gt;Espero que ajude,&lt;br /&gt;          - Jeroen&lt;/fxicon&gt;&lt;/blockquote&gt;&lt;fxicon&gt;&lt;/fxicon&gt;&lt;br /&gt;&lt;fxicon&gt;&lt;/fxicon&gt;&lt;br /&gt;&lt;fxicon&gt;---&lt;/fxicon&gt;&lt;br /&gt;&lt;fxicon&gt;&lt;span style="font-size:85%;"&gt;Retirado da lista de e-mails Foxgui-users. Veja o original &lt;a href="http://www.nabble.com/Freeing-memory-td23992483.html"&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/fxicon&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-9222505173796795905?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/9222505173796795905/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=9222505173796795905&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9222505173796795905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9222505173796795905'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/07/foi-postada-na-lista-de-e-mails-do-fox.html' title='Liberando memória'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-747108156493744649</id><published>2009-05-25T17:07:00.001-03:00</published><updated>2009-05-25T17:11:19.378-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Botões'/><category scheme='http://www.blogger.com/atom/ns#' term='FXMessageBox'/><title type='text'>FXMessageBox: Opções de botões</title><content type='html'>&lt;div style="text-align: justify;"&gt;No &lt;a href="http://ideiasfox.blogspot.com/2009/05/fxmessagebox-tipos-de-mensagem.html"&gt;tópico anterior&lt;/a&gt;, apresentei as mensagens que o FOX Toolkit fornece ao usuário através da classe &lt;span style="font-family:courier new;"&gt;FXMessageBox&lt;/span&gt;. Percebam que as mensagens de informação, aviso e erro possuíam apenas o botão &lt;span style="font-family:courier new;"&gt;OK&lt;/span&gt;, enquanto a pergunta possuía dois botões, &lt;span style="font-family:courier new;"&gt;Sim&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;Não&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Neste tópico, mostrarei as opções de botões disponíveis para as caixas de mensagem. Novamente, mostrarei apenas os trechos de código e o resultado, pois são bem auto-explicativos.&lt;br /&gt;&lt;br /&gt;Os botões que devem aparecer na caixa de mensagem são passados como segundo parâmetro, e são definidos em termos de uma enumeração declarada em &lt;span style="font-family:courier new;"&gt;FXMessageBox.h&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_OK&lt;/span&gt;                   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x10000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_OK_CANCEL&lt;/span&gt;            &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x20000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_YES_NO&lt;/span&gt;               &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x30000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_YES_NO_CANCEL&lt;/span&gt;        &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x40000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_QUIT_CANCEL&lt;/span&gt;          &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x50000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_QUIT_SAVE_CANCEL&lt;/span&gt;     &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x60000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_SKIP_SKIPALL_CANCEL&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x70000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  MBOX_SAVE_CANCEL_DONTSAVE&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x80000000&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_OK&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;information&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Informação"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"Operação finalizada"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/Shr3LyUTP5I/AAAAAAAAAXo/dMMNBlYy-ls/s1600-h/MBOX_OK.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 206px; height: 135px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/Shr3LyUTP5I/AAAAAAAAAXo/dMMNBlYy-ls/s400/MBOX_OK.jpg" alt="" id="BLOGGER_PHOTO_ID_5339852090058686354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_OK_CANCEL&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK_CANCEL&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Apagar tudo"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"Essa operação não pode ser desfeita.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Deseja continuar?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/Shr3Zyq26II/AAAAAAAAAXw/Ug6CrUfyQHY/s1600-h/MBOX_OK_CANCEL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 321px; height: 135px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/Shr3Zyq26II/AAAAAAAAAXw/Ug6CrUfyQHY/s400/MBOX_OK_CANCEL.jpg" alt="" id="BLOGGER_PHOTO_ID_5339852330671466626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_YES_NO&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_YES_NO&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Sair"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"Sair do programa?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr3vYUKzgI/AAAAAAAAAX4/Wv8D-fpZ-20/s1600-h/MBOX_YES_NO.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 135px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr3vYUKzgI/AAAAAAAAAX4/Wv8D-fpZ-20/s400/MBOX_YES_NO.jpg" alt="" id="BLOGGER_PHOTO_ID_5339852701554101762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_YES_NO_CANCEL&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_YES_NO_CANCEL&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Salvar arquivo"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"O arquivo foi alterado.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Deseja salvar antes de sair?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/Shr39pp-aiI/AAAAAAAAAYA/rbnp35ZMyHU/s1600-h/MBOX_YES_NO_CANCEL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 365px; height: 135px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/Shr39pp-aiI/AAAAAAAAAYA/rbnp35ZMyHU/s400/MBOX_YES_NO_CANCEL.jpg" alt="" id="BLOGGER_PHOTO_ID_5339852946727135778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_QUIT_CANCEL&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_QUIT_CANCEL&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Processo em execução"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"Terminar o aplicativo encerrará um processo em andamento."&lt;br /&gt;   "&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Deseja mesmo sair?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr4MHRHWPI/AAAAAAAAAYI/pZPceVjTBQM/s1600-h/MBOX_QUIT_CANCEL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 115px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr4MHRHWPI/AAAAAAAAAYI/pZPceVjTBQM/s400/MBOX_QUIT_CANCEL.jpg" alt="" id="BLOGGER_PHOTO_ID_5339853195194095858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_QUIT_SAVE_CANCEL&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_QUIT_SAVE_CANCEL&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Salvar arquivo"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"O arquivo foi alterado.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Deseja salvar antes de sair?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/Shr4kBDyS4I/AAAAAAAAAYQ/EIbqNXPg74Q/s1600-h/MBOX_QUIT_SAVE_CANCEL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 365px; height: 135px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/Shr4kBDyS4I/AAAAAAAAAYQ/EIbqNXPg74Q/s400/MBOX_QUIT_SAVE_CANCEL.jpg" alt="" id="BLOGGER_PHOTO_ID_5339853605844437890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_SKIP_SKIPALL_CANCEL&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_SKIP_SKIPALL_CANCEL&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Entrada inválida"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"Entrada inválida."&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/Shr4vo0P1cI/AAAAAAAAAYY/XQiIUo1NBTQ/s1600-h/MBOX_SKIP_SKIPALL_CANCEL.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 371px; height: 135px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/Shr4vo0P1cI/AAAAAAAAAYY/XQiIUo1NBTQ/s400/MBOX_SKIP_SKIPALL_CANCEL.jpg" alt="" id="BLOGGER_PHOTO_ID_5339853805495244226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MBOX_SAVE_CANCEL_DONTSAVE&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_SAVE_CANCEL_DONTSAVE&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Salvar arquivo"&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(0, 128, 0);"&gt;"O arquivo foi alterado.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Deseja salvar antes de sair?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr5B3fYyxI/AAAAAAAAAYg/L-8gleURG0k/s1600-h/MBOX_SAVE_CANCEL_DONTSAVE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 301px; height: 135px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/Shr5B3fYyxI/AAAAAAAAAYg/L-8gleURG0k/s400/MBOX_SAVE_CANCEL_DONTSAVE.jpg" alt="" id="BLOGGER_PHOTO_ID_5339854118671928082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Em inglês?&lt;br /&gt;&lt;/blockquote&gt;É... &lt;span style="font-style: italic;"&gt;open-source&lt;/span&gt;: quem quiser em português, tem que ir no código-fonte, traduzir e recompilar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No próximo tópico, mostrarei como tratar a opção selecionada pelo usuário.&lt;br /&gt;&lt;br /&gt;Até lá.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-747108156493744649?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/747108156493744649/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=747108156493744649&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/747108156493744649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/747108156493744649'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/fxmessagebox-opcoes-de-botoes.html' title='FXMessageBox: Opções de botões'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_boFQgM_NDMg/Shr3LyUTP5I/AAAAAAAAAXo/dMMNBlYy-ls/s72-c/MBOX_OK.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-3420367870784939732</id><published>2009-05-25T11:58:00.006-03:00</published><updated>2009-05-25T12:19:48.243-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FXMessageBox'/><title type='text'>FXMessageBox: Tipos de mensagem</title><content type='html'>&lt;div style="text-align: justify;"&gt;Esta será uma série a respeito da classe &lt;span style="font-family:courier new;"&gt;FXMessageBox&lt;/span&gt;. Ela serve para, como o próprio nome diz, exibir uma mensagem ao usuário de forma fácil e rápida.&lt;br /&gt;&lt;br /&gt;Já utilizei esta classe em um &lt;a href="http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-enviando-e.html"&gt;tutorial passado&lt;/a&gt; para exibir uma mensagem de boas-vindas ao FOX Toolkit. Aquele foi apenas um tipo de mensagem dentre quatro disponíveis nesta classe:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;informação&lt;/li&gt;&lt;li&gt;pergunta&lt;/li&gt;&lt;li&gt;aviso&lt;/li&gt;&lt;li&gt;erro&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Esses quatro tipos de mensagem são fornecidos em forma de funções estáticas de &lt;span style="font-family:courier new;"&gt;FXMessageBox&lt;/span&gt;, ou seja, não é preciso instanciar explicitamente um objeto para exibir uma mensagem ao usuário.&lt;br /&gt;&lt;br /&gt;Neste tópico, apenas discutirei os parâmetros de cada função, que são gerais, e mostrarei um exemplo de cada tipo, pois realmente não há muito o que explicar. Vamos lá.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Parâmetros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cada função estática (&lt;span style="font-family:courier new;"&gt;information&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;question&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;warning&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;error&lt;/span&gt;) recebe pelo menos quatro parâmetros:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;owner&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt; FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt;,&lt;strong&gt; const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;caption&lt;/span&gt;,&lt;strong&gt; const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;message&lt;/span&gt;, ...&lt;/pre&gt;&lt;br /&gt;Existe também uma outra versão que, em vez de se passar uma janela, passa-se o aplicativo:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;,&lt;span style="color: rgb(32, 64, 160);"&gt; FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt;,&lt;strong&gt; const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;caption&lt;/span&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;char&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;message&lt;/span&gt;, ...&lt;/pre&gt;&lt;br /&gt;Essa segunda versão é útil, por exemplo, quando se deseja exibir uma mensagem ao usuário antes da janela principal ser criada.&lt;br /&gt;&lt;br /&gt;Os parâmetros serão explicados a seguir.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXWindow *owner / FXApp *app&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Janela/aplicativo da mensagem. Nada de muito especial aqui.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXuint opts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As opções da mensagem. Aqui se informam quais são os botões que aparecerão na mensagem (OK, Cancelar etc.). Para não ficar muito extenso, abordarei essa questão em outro tópico.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;const char* caption&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Título da janela com a mensagem. Também nada de especial aqui.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;const char* message, ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Texto da mensagem. Aqui, sim, há um detalhe importante.&lt;br /&gt;&lt;br /&gt;Percebam as reticências. Isso indica que essa função recebe um número variável de parâmetros. Neste caso, no mínimo os quatro que são explicitamente declarados.&lt;br /&gt;&lt;br /&gt;Essa mensagem é formatada pelo FOX de forma muito semelhante à função &lt;span style="font-family:courier new;"&gt;printf()&lt;/span&gt;. Ou seja, se eu quiser exibir uma mensagem que contenha dados da aplicação, não é necessário montá-la manualmente, pois o FOX faz isso automaticamente. Um exemplo (didático...) será mostrado mais à frente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Exemplos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nesta seção, mostrarei um exemplo de cada tipo de mensagem. O código-fonte para esse tutorial está disponível no final do tópico.&lt;br /&gt;&lt;br /&gt;Serão mostrados apenas o trecho de código usado para exibir a mensagem e uma captura de tela da mensagem.&lt;br /&gt;&lt;blockquote&gt;Obs.: Apenas lembrando, pelo fato de serem funções estáticas, são chamadas diretamente da classe, sem necessidade de instanciar um objeto, através do operador de escopo (&lt;span style="font-family:courier new;"&gt;::&lt;/span&gt;).&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Informação&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;information&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Informação"&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;  "Operação finalizada"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/ShqzgV3-UKI/AAAAAAAAAXI/dHyge3ZbG1U/s1600-h/information.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 138px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/ShqzgV3-UKI/AAAAAAAAAXI/dHyge3ZbG1U/s400/information.jpg" alt="" id="BLOGGER_PHOTO_ID_5339777676410245282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Pergunta&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;question&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_YES_NO&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Sair"&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;"Deseja realmente sair do programa?"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/Shqz0FohasI/AAAAAAAAAXQ/SbSc0hHKA6g/s1600-h/question.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 321px; height: 138px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/Shqz0FohasI/AAAAAAAAAXQ/SbSc0hHKA6g/s400/question.jpg" alt="" id="BLOGGER_PHOTO_ID_5339778015647853250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Aviso&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;warning&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Aviso"&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;"Valor não especificado.&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;Atribuindo padrão 1."&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/Shq0HxAvAHI/AAAAAAAAAXY/728ZfKz3p1o/s1600-h/warning.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 236px; height: 138px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/Shq0HxAvAHI/AAAAAAAAAXY/728ZfKz3p1o/s400/warning.jpg" alt="" id="BLOGGER_PHOTO_ID_5339778353709645938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Erro&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;error&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Erro"&lt;/span&gt;,&lt;br /&gt;  &lt;span style="color: rgb(0, 128, 0);"&gt;"%s: Arquivo não encontrado"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;filename&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/Shq0cOO1y9I/AAAAAAAAAXg/er1o5AmoHdM/s1600-h/error.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 388px; height: 138px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/Shq0cOO1y9I/AAAAAAAAAXg/er1o5AmoHdM/s400/error.jpg" alt="" id="BLOGGER_PHOTO_ID_5339778705150823378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em primeiro lugar, percebam que para cada tipo de mensagem há um ícone diferente; é basicamente isso que diferencia um tipo do outro, pois o resto é igual. Essas são o que chamamos de funções de conveniência, pois automatizam tarefas comuns.&lt;br /&gt;&lt;br /&gt;Segundo, na mensagem de aviso, eu utilizei uma quebra de linha para evitar que a mensagem fique muito longa. Isso é de controle exclusivo do usuário; o texto da mensagem é exibido através de um &lt;span style="font-family:courier new;"&gt;FXLabel&lt;/span&gt;, que não executa quebra de linha automática.&lt;br /&gt;&lt;br /&gt;E terceiro, na mensagem de erro, um exemplo didático da formatação da mensagem &lt;span style="font-style: italic;"&gt;a la&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;printf()&lt;/span&gt;: a mensagem exibe o conteúdo de uma variável.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta foi apenas uma introdução às mensagens que o FOX Toolkit disponibiliza para o usuário. Existem outros aspectos relacionados, que serão discutidos em outros tópicos.&lt;br /&gt;&lt;br /&gt;Até lá, e um abraço.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-25/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; deste tutorial.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-3420367870784939732?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/3420367870784939732/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=3420367870784939732&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3420367870784939732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3420367870784939732'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/fxmessagebox-tipos-de-mensagem.html' title='FXMessageBox: Tipos de mensagem'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_boFQgM_NDMg/ShqzgV3-UKI/AAAAAAAAAXI/dHyge3ZbG1U/s72-c/information.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-9211568357517060631</id><published>2009-05-14T12:39:00.010-03:00</published><updated>2009-05-14T17:20:18.434-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: Aninhamento</title><content type='html'>&lt;div style="text-align: justify;"&gt;Todos os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; do FOX podem ser aninhados, ou seja, podem ser filhos de outros gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Essa, na verdade, é uma característica obrigatória em qualquer biblioteca de interface gráfica, pois é isso que permite compor a aparência dos programas. Sem essa capacidade, ficaria quase impossível criar uma interface sofisticada (pense em posicionar cada elemento manualmente, ajustar as bordas de cada seção e outras tarefas tediosas).&lt;br /&gt;&lt;br /&gt;Neste tópico, apresentarei um exemplo bem simples (e didático...) desse aninhamento. Farei uma janela semelhante a uma que eu criei para a minha monografia. À esquerda da janela principal, quatro imagens; à direita, uma janela para a exibição 3D. Assim:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_boFQgM_NDMg/SgxWvZkWjtI/AAAAAAAAAWw/BVGCyt06CPs/s1600-h/interface.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://lh4.ggpht.com/_boFQgM_NDMg/SgxWvZkWjtI/AAAAAAAAAWw/BVGCyt06CPs/s400/interface.jpg" alt="" id="BLOGGER_PHOTO_ID_5335735030844395218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vou logo avisando que vai ficar bem diferente dessa de cima. No final eu explico por que. O objetivo desse tópico é basicamente mostrar o aninhamento dos gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, utilizando a bagagem que foi adquirida até aqui.&lt;br /&gt;&lt;br /&gt;Comecemos, então.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Codificação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O primeiro elemento da janela é uma barra de menu. Aqui tudo será simulado, então utilizarei um &lt;span style="font-family:courier new;"&gt;HorizontalFrame&lt;/span&gt; para a barra:&lt;br /&gt;&lt;pre&gt;&lt;a name="line23"&gt;23&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;menuBar&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;,&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_TOP&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;PACK_UNIFORM_WIDTH&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Os "menus" são simplesmente &lt;span style="font-style: italic;"&gt;labels&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;a name="line26"&gt;26&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 68);"&gt;/* Menu Arquivo */&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXLabel&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;menuBar&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;amp;Arquivo"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 68);"&gt;/* Menu Imagens */&lt;/span&gt;&lt;br /&gt;&lt;a name="line30"&gt;30&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXLabel&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;menuBar&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;amp;Imagens"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora vêm os aninhamentos. Na verdade, desde a primeira vez que colocamos um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, fizemos um aninhamento, já que a própria janela já é um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, mas aqui isso fica mais explícito.&lt;br /&gt;&lt;br /&gt;Primeiramente, um &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt; horizontal representando o conteúdo da janela:&lt;br /&gt;&lt;pre&gt;&lt;a name="line32"&gt;32&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;,&lt;br /&gt;  &lt;span style="color: rgb(32, 64, 160);"&gt;    LAYOUT_SIDE_TOP&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Eu gosto de definir os filhos imediatamente, formando realmente uma árvore no código (inclusive com indentação); acho que fica mais fácil saber quem é filho de quem, em vez de definir todos os filhos e depois os filhos dos filhos.&lt;br /&gt;&lt;br /&gt;Sendo assim, o primeiro filho de &lt;span style="font-family:courier new;"&gt;contents&lt;/span&gt; é um &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt; vertical:&lt;br /&gt;&lt;pre&gt;&lt;a name="line33"&gt;33&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;FXVerticalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frameExam&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXVerticalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt;,&lt;br /&gt;        &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dentro dele, tem dois &lt;span style="font-style: italic;"&gt;frames&lt;/span&gt; horizontais (que ficarão um sobre o outro); dentro de cada um deles, tem dois objetos do tipo &lt;span style="font-family:courier new;"&gt;FXFrame&lt;/span&gt; (que pode ser considerado um espaço vazio), que ficarão um do lado do outro:&lt;br /&gt;&lt;pre&gt;&lt;a name="line34"&gt;34&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ccFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frameExam&lt;/span&gt;,&lt;br /&gt;          &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line35"&gt;35&lt;/a&gt;         &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ccFrame&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line36"&gt;36&lt;/a&gt;         &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ccFrame&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line37"&gt;37&lt;/a&gt;&lt;br /&gt;&lt;a name="line38"&gt;38&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;mloFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frameExam&lt;/span&gt;,&lt;br /&gt;          &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line39"&gt;39&lt;/a&gt;         &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;mloFrame&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line40"&gt;40&lt;/a&gt;         &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;mloFrame&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O segundo filho de &lt;span style="font-family:courier new;"&gt;contents&lt;/span&gt; também é um &lt;span style="font-family:courier new;"&gt;FXFrame&lt;/span&gt;, apenas para ocupar o espaço:&lt;br /&gt;&lt;pre&gt;&lt;a name="line42"&gt;42&lt;/a&gt;       &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Repetindo, o resultado é totalmente diferente do que foi mostrado acima. Com essa codificação, o que se obtém é isso:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/Sgxd66N8zoI/AAAAAAAAAW4/6BBjGF2Trb0/s1600-h/tutorial.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/Sgxd66N8zoI/AAAAAAAAAW4/6BBjGF2Trb0/s400/tutorial.jpg" alt="" id="BLOGGER_PHOTO_ID_5335742925168758402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Eu mandei a borda ser desenhada "afundada" justamente para que o aninhamento seja mais visível.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O resultado ficou bem diferente do modelo por alguns motivos básicos.&lt;br /&gt;&lt;br /&gt;Primeiramente, no modelo eu não utilizei somente &lt;span style="font-family:courier new;"&gt;FX(Horizontal|Vertical)Frame&lt;/span&gt; (não resisti à &lt;span style="font-style: italic;"&gt;regex&lt;/span&gt;). Existem gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; bem mais propícios para uma interface como aquela.&lt;br /&gt;&lt;br /&gt;Segundo, não alterei valores de espaçamento; por isso, dá para ver que as bordas ficam bem distantes umas das outras.&lt;br /&gt;&lt;br /&gt;Terceiro, de &lt;span style="font-family:courier new;"&gt;contents&lt;/span&gt; para baixo, todos estão com a opção &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL&lt;/span&gt;. Isso faz que o tamanho final de cada filho seja proporcional ao seu tamanho padrão em relação a seus irmãos. Como do lado esquerdo tem mais filhos, este ficou bem maior que o direito.&lt;br /&gt;&lt;br /&gt;E quarto, para o modelo, eu defino explicitamente a largura dos contêineres das imagens (as áreas escuras) de acordo com as imagens carregadas. Tanto que, ao iniciar o programa, eles estão com a largura padrão, que é &lt;span style="font-family:courier new;"&gt;1&lt;/span&gt;. Vejam:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/SgxgIcmABfI/AAAAAAAAAXA/N1n6IEs6P2g/s1600-h/inicial.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/SgxgIcmABfI/AAAAAAAAAXA/N1n6IEs6P2g/s400/inicial.jpg" alt="" id="BLOGGER_PHOTO_ID_5335745356757992946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este tópico mostrou como é feito o aninhamento de gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; no FOX Toolkit. Espero ter ficado bem claro, pois é algo extremamente útil.&lt;br /&gt;&lt;br /&gt;Utilizei nele poucos recursos porque achei melhor me limitar ao que já foi tratado até aqui. Entretanto, tudo o que foi dito aqui vale para qualquer outro gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. O FOX vem inclusive com um exemplo que diz "É claro que eles podem ser aninhados arbitrariamente." Creio que essa frase mostra bem o espírito da coisa.&lt;br /&gt;&lt;br /&gt;Só uma observação final: &lt;span style="font-family:courier new;"&gt;FXFrame&lt;/span&gt;, ao contrário do que possa parecer, NÃO é um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Muito menos superclasse de &lt;span style="font-family:courier new;"&gt;FX(Horizontal|Vertical)Frame&lt;/span&gt; (como sugere o sufixo). É ele que desenha as bordas dos controles (grossa, fina, levantada, abaixada etc.).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FXFrame&lt;/span&gt; pode ser utilizado apenas como um "guarda-lugar" (&lt;span style="font-style: italic;"&gt;placeholder&lt;/span&gt;), como foi feito aqui. Entretanto, é mais utilizado como classe-base para controles simples; por exemplo, &lt;span style="font-family:courier new;"&gt;FXLabel&lt;/span&gt; é derivado direto de &lt;span style="font-family:courier new;"&gt;FXFrame&lt;/span&gt; (e &lt;span style="font-family:courier new;"&gt;FXButton&lt;/span&gt; é derivado direto de &lt;span style="font-family:courier new;"&gt;FXLabel&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um abraço e até a próxima.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-14/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-9211568357517060631?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/9211568357517060631/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=9211568357517060631&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9211568357517060631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9211568357517060631'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/layout-managers-aninhamento.html' title='Layout Managers: Aninhamento'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_boFQgM_NDMg/SgxWvZkWjtI/AAAAAAAAAWw/BVGCyt06CPs/s72-c/interface.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-7364798741245942461</id><published>2009-05-11T14:35:00.000-03:00</published><updated>2009-05-11T14:35:00.359-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: FXVerticalFrame</title><content type='html'>&lt;div style="text-align: justify;"&gt;Neste tópico, falarei a respeito do gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;FXVerticalFrame&lt;/span&gt;. A princípio, eu achei que seria demais um tópico só para ele, por ser bastante semelhante ao &lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt;. Pensei então em apenas tratá-lo rapidamente dentro  &lt;a href="http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-enviando-e.html"&gt;deste tópico&lt;/a&gt;. Mas percebi que eram temas muito diferentes, e apenas iria deixar o tópico mais extenso.&lt;br /&gt;&lt;br /&gt;Resolvi, então, tratá-lo em um tópico exclusivo. Aproveito, ainda, para falar de mais algumas opções de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Vamos lá, então.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como eu utilizei esse gerenciador em um tópico anterior, vou reaproveitá-lo aqui. São apenas dois botões.&lt;br /&gt;&lt;br /&gt;Primeiramente, é preciso criar o gerenciador:&lt;br /&gt;&lt;pre&gt;&lt;a name="line23"&gt;23&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXVerticalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;     &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXVerticalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aqui, eu crio um &lt;span style="font-family:courier new;"&gt;FXVerticalFrame&lt;/span&gt; que se expandirá por toda a janela em ambas as direções (&lt;span style="font-family:courier new;"&gt;LAYOUT_FILL&lt;/span&gt;). &lt;span style="font-family:courier new;"&gt;FRAME_NORMAL&lt;/span&gt; significa que ele terá uma borda grossa e rebaixada. As opções de borda serão discutidas em detalhes futuramente.&lt;br /&gt;&lt;br /&gt;Agora eu crio os botões:&lt;br /&gt;&lt;pre&gt;&lt;a name="line26"&gt;26&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;amp;Hello FOX!"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;ID_HELLO&lt;/span&gt;,&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;amp;Goodbye, FOX!"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ID_QUIT&lt;/span&gt;,&lt;br /&gt;&lt;a name="line30"&gt;30&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_BOTTOM&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O primeiro botão será posicionado junto à borda superior (por padrão), e se expandirá pelo eixo horizontal.&lt;br /&gt;&lt;br /&gt;Já o segundo tem apenas uma diferença em relação ao primeiro (em opções de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;): ele será colocado junto à borda inferior (&lt;span style="font-family:courier new;"&gt;LAYOUT_BOTTOM&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-enviando-e.html"&gt;Neste tópico&lt;/a&gt;, há um vídeo mostrando o resultado do tratamento dos eventos.&lt;br /&gt;&lt;br /&gt;No vídeo, a janela está com o tamanho mínimo, ou seja, os dois botões aparecem juntos um do outro. Agora vejam o que acontece quando se redimensiona a janela:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SghSkL0f10I/AAAAAAAAAWo/vgY7Fx-ZUxI/s1600-h/verframe.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 247px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SghSkL0f10I/AAAAAAAAAWo/vgY7Fx-ZUxI/s400/verframe.jpg" alt="" id="BLOGGER_PHOTO_ID_5334604540222101314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Conforme eu falei no início deste tópico, o &lt;span style="font-family:courier new;"&gt;FXVerticalFrame&lt;/span&gt; é bastante semelhante ao &lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt;. Desta forma, tudo o que foi discutido no &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-fxhorizontalframe.html"&gt;no outro tópico&lt;/a&gt; vale aqui também.&lt;br /&gt;&lt;br /&gt;Sendo assim, deixo para a curiosidade do leitor fazer testes incluindo novos botões e utilizando as opções de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; e empacotamento já discutidos.&lt;br /&gt;&lt;br /&gt;Um abraço e até a próxima.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-7364798741245942461?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/7364798741245942461/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=7364798741245942461&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7364798741245942461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7364798741245942461'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/layout-managers-fxverticalframe.html' title='Layout Managers: FXVerticalFrame'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_boFQgM_NDMg/SghSkL0f10I/AAAAAAAAAWo/vgY7Fx-ZUxI/s72-c/verframe.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-6839091264232205881</id><published>2009-05-11T13:05:00.002-03:00</published><updated>2009-05-13T09:34:42.470-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Convenções de nomenclatura</title><content type='html'>&lt;div style="text-align: justify;"&gt;No &lt;a href="http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-enviando-e.html"&gt;tópico anterior&lt;/a&gt;, mostrei como capturar um evento e utilizar um tratador definido pelo usuário.&lt;br /&gt;&lt;br /&gt;Neste tópico falarei sobre as convenções de nomenclatura do &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;São três convenções que ajudam na identificação imediata dos &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;, bem como de sua funcionalidade:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Sempre começam com &lt;span style="font-family:courier new;"&gt;on&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Em seguida, vem um identificador do tipo de mensagem. Este será discutido mais adiante.&lt;/li&gt;&lt;li&gt;Por último, um nome descritivo opcional. Caso exista, deve deixar claro que ação ele executará.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;O identificador do tipo de mensagem deve condizer, claro, com o tipo de mensagem que irá tratar. Existem três tipos que são normalmente abreviados:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_COMMAND&lt;/span&gt;: abreviado para &lt;span style="font-family:courier new;"&gt;onCmd&lt;/span&gt;...&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_UPDATE&lt;/span&gt;: abreviado para &lt;span style="font-family:courier new;"&gt;onUpd&lt;/span&gt;...&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_CHANGED&lt;/span&gt;: abreviado para &lt;span style="font-family:courier new;"&gt;onChg&lt;/span&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;O terceiro é bem raro no FOX, só encontrei seis ocorrências de &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt; desse tipo (não que isso signifique que o usuário não possa definir seus próprios).&lt;br /&gt;&lt;br /&gt;Normalmente, para esses três tipos de mensagem é necessário informar um nome extra, já que por si sós não são descritivos o suficientes (terceiro item das convenções).&lt;br /&gt;&lt;br /&gt;Para os demais tipos de mensagem, normalmente utiliza-se o nome completo. Exemplos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_LEFTBUTTONPRESS&lt;/span&gt;: &lt;span style="font-family:courier new;"&gt;onLeftButtonPress&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_PAINT&lt;/span&gt;: &lt;span style="font-family:courier new;"&gt;onPaint&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;SEL_KEYPRESS&lt;/span&gt;: &lt;span style="font-family:courier new;"&gt;onKeyPress&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Esses já dizem claramente o que vão tratar, por isso normalmente recebem o nome completo. E, ao contrário daqueles três, normalmente não é necessário mais de um tratador por janela, ou seja, não precisam de um nome extra para diferenciá-los.&lt;br /&gt;&lt;br /&gt;Voltando, então, ao exemplo do tópico anterior, nós temos uma mensagem chamada &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt;. Este é um evento disparado por um botão, ou seja, do tipo &lt;span style="font-family:courier new;"&gt;SEL_COMMAND&lt;/span&gt;. Um nome bastante adequado para o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt; que trata essa mensagem, portanto, é &lt;span style="font-family:courier new;"&gt;onCmdHello&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Com isso, eu já sei que &lt;span style="font-family:courier new;"&gt;onCmdHello&lt;/span&gt; é o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;on&lt;/span&gt;) que vai tratar um comando (&lt;span style="font-family:courier new;"&gt;Cmd&lt;/span&gt;), referente à mensagem &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;Hello&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este tópico foi apenas para chamar atenção a esse pequeno detalhe, mas que eu considero bastante importante, afinal, é importante ter boa legibilidade no código.&lt;br /&gt;&lt;br /&gt;Posteriormente, falarei mais especificamente sobre o mapa de mensagens e os tipos de mensagem fornecidos pelo FOX Toolkit.&lt;br /&gt;&lt;br /&gt;Um abraço e até lá.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-6839091264232205881?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/6839091264232205881/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=6839091264232205881&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6839091264232205881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6839091264232205881'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-convencoes-de.html' title='Tratamento de Eventos: Convenções de nomenclatura'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-8654326045096343206</id><published>2009-05-07T17:23:00.000-03:00</published><updated>2009-05-07T17:23:40.652-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><title type='text'>Tratamento de Eventos: Enviando e tratando</title><content type='html'>&lt;div style="text-align: justify;"&gt;No primeiro tópico sobre tratamento de eventos (&lt;a href="http://ideiasfox.blogspot.com/2009/04/tratamento-de-eventos-introducao.html"&gt;aqui&lt;/a&gt;), eu criei um botão que apenas fechava o aplicativo, ou seja, o botão enviava uma mensagem pré-definida.&lt;br /&gt;&lt;br /&gt;Neste tópico, mostrarei como definir suas próprias mensagens a serem enviadas, assim como tratar os eventos a elas relacionados.&lt;br /&gt;&lt;br /&gt;Pois bem, ponhamos a mão na massa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Declaração das mensagens&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O primeiro passo é declarar as mensagens que serão enviadas. Isto é feito na declaração da classe através de uma enumeração, que deve estar na interface pública. Assim:&lt;br /&gt;&lt;pre&gt;&lt;a name="line30"&gt;30&lt;/a&gt; &lt;strong&gt;public&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line31"&gt;31&lt;/a&gt;   &lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line32"&gt;32&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;ID_HELLO&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ID_LAST&lt;/span&gt;,&lt;br /&gt;&lt;a name="line33"&gt;33&lt;/a&gt;&lt;br /&gt;&lt;a name="line34"&gt;34&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;ID_LAST&lt;/span&gt;,&lt;br /&gt;&lt;a name="line35"&gt;35&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aqui, estou chamando minha mensagem de &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt;, seguindo a convenção de prefixar as mensagens com &lt;span style="font-family:courier new;"&gt;ID_&lt;/span&gt;. É importante também que o nome seja bem descritivo.&lt;br /&gt;&lt;br /&gt;Em se tratando de uma enumeração, por padrão os itens são numerados seqüencialmente começando em &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;. Porém essa é uma característica indesejável nesse caso, pois isso proporcionaria conflito de mensagens. Para garantir que cada mensagem tenha um valor diferente, todos os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; FOX declaram a "mensagem" &lt;span style="font-family:courier new;"&gt;ID_LAST&lt;/span&gt;, cujo único propósito é garantir a seqüência de mensagens e evitar colisão. Então, deve-se atribuir à primeira mensagem o valor da última mensagem da superclasse direta, neste caso &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Eu costumo definir também a minha própria ID_LAST, apesar de nunca ter derivado uma classe minha. Se for garantido que sua classe não será derivada, não é necessário.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Declaração dos &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Além das mensagens, é preciso definir as funções que irão tratar as mensagens. Quando se trata de interação com o usuário, essas funções são chamadas &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;, exatamente porque elas não têm um momento certo para serem chamadas, mas são executadas em resposta às ações do usuário. Em outro tópico discutirei um tema relevante com relação a essa questão dos &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Eles devem estar na interface pública da classe. Como C++ permite definir o escopo dos componentes da classe diversas vezes, eu gosto de "agrupar" a declaração das mensagens e dos &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt; em uma "seção pública" separada, conforme pode-se observar no código.&lt;br /&gt;&lt;br /&gt;No FOX, todos os &lt;span style="font-style: italic;"&gt;callbacks&lt;/span&gt; têm um protótipo igual:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;callback&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ou seja, sempre retornam um &lt;span style="font-family:courier new;"&gt;long&lt;/span&gt; e recebem três parâmetros: &lt;span style="font-family:courier new;"&gt;FXObject*&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;FXSelector&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;void*&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Além disso, existe uma convenção de nomenclatura, que será tratada em outro tópico.&lt;br /&gt;&lt;br /&gt;Neste exemplo, definimos o seguinte &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;a name="line37"&gt;37&lt;/a&gt;   &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;onCmdHello&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aqui terminamos as declarações necessárias. Agora partimos para a implementação.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Mapa de mensagens&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O mapa de mensagens é definido com auxílio da macro &lt;span style="font-family:courier new;"&gt;FXDEFMAP&lt;/span&gt;, já apresentada &lt;a href="http://ideiasfox.blogspot.com/2009/04/tutorial-janela-simples.html"&gt;aqui&lt;/a&gt;. Porém, estava vazio, pois a janela não tratava nenhum evento. Agora vamos colocar um mapeamento nele.&lt;br /&gt;&lt;br /&gt;Cada mapeamento é definido pela macro &lt;span style="font-family:courier new;"&gt;FXMAPFUNC&lt;/span&gt;, recebe três parâmetros: tipo da mensagem, ID da mensagem e um ponteiro para o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt;. No nosso exemplo, temos:&lt;br /&gt;&lt;pre&gt;&lt;a name="line13"&gt;13&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMAPFUNC&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;SEL_COMMAND&lt;/span&gt;,&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ID_HELLO&lt;/span&gt;,&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;onCmdHello&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;,&lt;br /&gt;&lt;a name="line13"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;Obs.: Por limitações de espaço, quebrei a linha em três, mas normalmente deixo a declaração inteira em uma linha só.&lt;br /&gt;&lt;br /&gt;Isso quer dizer que sempre que a nossa janela receber uma mensagem do tipo &lt;span style="font-family:courier new;"&gt;SEL_COMMAND&lt;/span&gt; (um botão clicado, um menu selecionado etc.), associado à mensagem &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt;, ela deve executar o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;onCmdHello&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A linha contendo a chamada à macro &lt;span style="font-family:courier new;"&gt;FXIMPLEMENT&lt;/span&gt; permanece intacta, pois a macro auxiliar &lt;span style="font-family:courier new;"&gt;ARRAYNUMBER&lt;/span&gt; garante a atualização automática do tamanho do mapa de mensagens.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conectando os objetos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em seguida, eu preciso dizer quem vai enviar essa mensagem. Para isso, eu criei um botão:&lt;br /&gt;&lt;pre&gt;&lt;a name="line26"&gt;26&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;contents&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"&amp;amp;Hello FOX!"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;strong&gt;this&lt;/strong&gt;, &lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;ID_HELLO&lt;/span&gt;,&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quando o usuário clica no botão, ele lança um evento do tipo &lt;span style="font-family:courier new;"&gt;SEL_COMMAND&lt;/span&gt;, associado à sua mensagem, que neste caso é &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt;. Esse evento é enviado para o alvo do botão, que neste caso é a própria janela (&lt;span style="font-family:courier new;"&gt;this&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Em seguida, o alvo (nossa janela) consulta seu mapa de mensagens e descobre que um evento &lt;span style="font-family:courier new;"&gt;SEL_COMMAND&lt;/span&gt;, associado à mensagem &lt;span style="font-family:courier new;"&gt;ID_HELLO&lt;/span&gt;, resulta em uma chamada a &lt;span style="font-family:courier new;"&gt;onCmdHello&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Implementando o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naturalmente, o &lt;span style="font-style: italic;"&gt;callback&lt;/span&gt; deve ser implementado. Neste exemplo, será exibida uma mensagem de saudação:&lt;br /&gt;&lt;pre&gt;&lt;a name="line48"&gt;48&lt;/a&gt; &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;onCmdHello&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line49"&gt;49&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMessageBox&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;information&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;MBOX_OK&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Olá"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Olá, FOX Toolkit"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line50"&gt;50&lt;/a&gt;&lt;br /&gt;&lt;a name="line51"&gt;51&lt;/a&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line52"&gt;52&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note o valor de retorno: &lt;span style="font-family:courier new;"&gt;1&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;Callbacks&lt;/span&gt;, no FOX Toolkit, retornam basicamente &lt;span style="font-family:courier new;"&gt;1&lt;/span&gt; para informar que o evento foi tratado, ou &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;, indicando que não foi tratado.&lt;br /&gt;&lt;br /&gt;Essa convenção é utilizada para, por exemplo, tratar a atualização da interface, especialmente em eventos do mouse: se o evento foi tratado, agenda uma atualização da interface; senão, nada mais acontece.&lt;br /&gt;&lt;br /&gt;Na prática, o valor de retorno é quase sempre &lt;span style="font-family:courier new;"&gt;1&lt;/span&gt; (pelo menos, eu nunca retornei &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;, mas já andei fuçando os fontes e isso acontece, portanto é bom saber).&lt;br /&gt;&lt;br /&gt;Com isso, temos um botão que, ao ser clicado, exibe uma mensagem ao usuário.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Confira no vídeo a seguir como ficou a nossa janela:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/52GewVd_O_M&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/52GewVd_O_M&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-07/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-07/HelloFOX.ogv"&gt;Baixar vídeo&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-8654326045096343206?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/8654326045096343206/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=8654326045096343206&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8654326045096343206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8654326045096343206'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/tratamento-de-eventos-enviando-e.html' title='Tratamento de Eventos: Enviando e tratando'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-3405135767046474619</id><published>2009-05-05T16:35:00.002-03:00</published><updated>2009-05-06T12:23:08.756-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ícones'/><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='Botões'/><title type='text'>Botões: Texto e ícone</title><content type='html'>&lt;div style="text-align: justify;"&gt;Neste tópico, falarei sobre adicionar um ícone ao botão, e mostrarei as posições relativas entre ícone e texto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Carregando o ícone&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para carregar o ícone, basta proceder conforme explicado &lt;a href="http://ideiasfox.blogspot.com/2009/04/tutorial-icones.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na declaração da classe:&lt;br /&gt;&lt;pre&gt;&lt;a name="line30"&gt;30&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Em &lt;span style="font-family:courier new;"&gt;loadIcons()&lt;/span&gt;:&lt;a name="line82"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;a name="line82"&gt;82&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;iconSource&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;loadScaledIconFile&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"icons/search.gif"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;32&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Lembrando que o ícone deve ser destruído manualmente, em &lt;span style="font-family:courier new;"&gt;destroyIcons()&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;a name="line89"&gt;89&lt;/a&gt;   &lt;strong&gt;delete&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Com isso, basta passar o ícone como terceiro argumento do construtor do botão:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(p&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"text"&lt;/span&gt;, &lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Posições relativas entre ícone e texto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A relação de posição entre ícone e menu é definida em &lt;span style="font-family:courier new;"&gt;FXLabel.h&lt;/span&gt;. &lt;span style="font-family:courier new;"&gt;FXButton&lt;/span&gt; é derivado direto de &lt;span style="font-family:courier new;"&gt;FXLabel&lt;/span&gt;. Isso significa que todas as opções deste valem para aquele também. Significa também que toda a discussão a seguir é válida para quando adicionarmos legendas (&lt;span style="font-style: italic;"&gt;labels&lt;/span&gt;) na nossa interface.&lt;br /&gt;&lt;br /&gt;Existem cinco maneiras de posicionar um ícone em relação ao texto, e cada uma delas possui dois sinônimos. As opções são:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ICON_UNDER_TEXT&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ICON_AFTER_TEXT&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00080000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ICON_BEFORE_TEXT&lt;/span&gt;     &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00100000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ICON_ABOVE_TEXT&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00200000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ICON_BELOW_TEXT&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00400000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; TEXT_OVER_ICON&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ICON_UNDER_TEXT&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; TEXT_AFTER_ICON&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ICON_BEFORE_TEXT&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; TEXT_BEFORE_ICON&lt;/span&gt;     &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ICON_AFTER_TEXT&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; TEXT_ABOVE_ICON&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ICON_BELOW_TEXT&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; TEXT_BELOW_ICON&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;ICON_ABOVE_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obs.: existem também opções de posicionamento de texto e ícone em relação ao &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;, usando opções de justificação, mas isso fica para outro tópico.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ICON_UNDER_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;TEXT_OVER_ICON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seu valor é &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;, o que indica que esta é a opção "padrão". No fim deste tópico, falarei a respeito dessa questão.&lt;br /&gt;&lt;br /&gt;Esta opção faz com que o ícone apareça por trás do texto. Exemplo:&lt;br /&gt;&lt;pre&gt;&lt;a name="line25"&gt;25&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"ICON_UNDER_TEXT"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160); font-weight: bold;"&gt;ICON_UNDER_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"TEXT_OVER_ICON"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160); font-weight: bold;"&gt;TEXT_OVER_ICON&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/SgB61pyCi9I/AAAAAAAAAVY/3CYVzRYKzm8/s1600-h/ICON_UNDER_TEXT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 57px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SgB61pyCi9I/AAAAAAAAAVY/3CYVzRYKzm8/s400/ICON_UNDER_TEXT.jpg" alt="" id="BLOGGER_PHOTO_ID_5332397020974058450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ICON_AFTER_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;TEXT_BEFORE_ICON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Desenha o ícone à direita do texto. Exemplo:&lt;br /&gt;&lt;pre&gt;&lt;a name="line32"&gt;32&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"ICON_AFTER_TEXT"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line33"&gt;33&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;ICON_AFTER_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line34"&gt;34&lt;/a&gt;&lt;br /&gt;&lt;a name="line35"&gt;35&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"TEXT_BEFORE_ICON"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line36"&gt;36&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;TEXT_BEFORE_ICON&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/SgB8ools9OI/AAAAAAAAAVg/o4OCogfAgeI/s1600-h/ICON_AFTER_TEXT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 57px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/SgB8ools9OI/AAAAAAAAAVg/o4OCogfAgeI/s400/ICON_AFTER_TEXT.jpg" alt="" id="BLOGGER_PHOTO_ID_5332398996338832610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ICON_BEFORE_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;TEXT_AFTER_ICON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Desenha o ícone à esquerda do texto. Exemplo:&lt;br /&gt;&lt;pre&gt;&lt;a name="line39"&gt;39&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"ICON_BEFORE_TEXT"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line40"&gt;40&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;ICON_BEFORE_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line41"&gt;41&lt;/a&gt;&lt;br /&gt;&lt;a name="line42"&gt;42&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"TEXT_AFTER_ICON"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line43"&gt;43&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;TEXT_AFTER_ICON&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/SgB9xmiPLWI/AAAAAAAAAVo/1mjIT7sjj2w/s1600-h/ICON_BEFORE_TEXT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 57px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/SgB9xmiPLWI/AAAAAAAAAVo/1mjIT7sjj2w/s400/ICON_BEFORE_TEXT.jpg" alt="" id="BLOGGER_PHOTO_ID_5332400249917877602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ICON_ABOVE_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;TEXT_BELOW_ICON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Desenha o ícone acima do texto. Exemplo:&lt;br /&gt;&lt;pre&gt;&lt;a name="line46"&gt;46&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"ICON_ABOVE_TEXT"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line47"&gt;47&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;ICON_ABOVE_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line48"&gt;48&lt;/a&gt;&lt;br /&gt;&lt;a name="line49"&gt;49&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"TEXT_BELOW_ICON"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line50"&gt;50&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;TEXT_BELOW_ICON&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/SgCFkuFPOtI/AAAAAAAAAWQ/M371ZTgWp-c/s1600-h/ICON_ABOVE_TEXT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 57px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/SgCFkuFPOtI/AAAAAAAAAWQ/M371ZTgWp-c/s400/ICON_ABOVE_TEXT.jpg" alt="" id="BLOGGER_PHOTO_ID_5332408824698452690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;ICON_BELOW_TEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;TEXT_ABOVE_ICON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Desenha o ícone sob o texto. Exemplo:&lt;br /&gt;&lt;pre&gt;&lt;a name="line53"&gt;53&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"ICON_BELOW_TEXT"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line54"&gt;54&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ICON_BELOW_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line55"&gt;55&lt;/a&gt;&lt;br /&gt;&lt;a name="line56"&gt;56&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;matrix&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"TEXT_ABOVE_ICON"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;searchIcon&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line57"&gt;57&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;TEXT_ABOVE_ICON&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/SgCGMnO-i8I/AAAAAAAAAWY/enYSYdgrmj4/s1600-h/ICON_BELOW_TEXT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 350px; height: 57px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SgCGMnO-i8I/AAAAAAAAAWY/enYSYdgrmj4/s400/ICON_BELOW_TEXT.jpg" alt="" id="BLOGGER_PHOTO_ID_5332409510055021506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Voltando à questão do valor "padrão"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ICON_UNDER_TEXT&lt;/span&gt; tem valor &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;, o que o torna, teoricamente, a opção padrão.&lt;br /&gt;&lt;br /&gt;Para entender essa questão, note que as demais opções podem ser divididas entre posicionamento vertical (&lt;span style="font-family:courier new;"&gt;ICON_ABOVE_TEXT&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;ICON_BELOW_TEXT&lt;/span&gt;) e posicionamento horizontal (&lt;span style="font-family:courier new;"&gt;ICON_BEFORE_TEXT&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;ICON_AFTER_TEXT&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Isso significa que eu posso combinar opções de posicionameto horizontal e vertical. Porém, se eu não especificar um ou outro, a opção padrão será utilizada. Neste caso, é melhor entender a opção padrão não como o nome diz (ícone debaixo (atrás?) do texto), mas que o ícone ficará centralizado naquele eixo que não foi especificado.&lt;br /&gt;&lt;br /&gt;Voltando aos exemplos, perceba que &lt;span style="font-family:courier new;"&gt;ICON_AFTER_TEXT&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;ICON_BEFORE_TEXT&lt;/span&gt; deixam o ícone centralizado na vertical. Da mesma forma, &lt;span style="font-family:courier new;"&gt;ICON_ABOVE_TEXT&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;ICON_BELOW_TEXT&lt;/span&gt; deixam o ícone centralizado na horizontal. Ainda, a opção &lt;span style="font-family:courier new;"&gt;ICON_UNDER_TEXT&lt;/span&gt; deixa o ícone centralizado em ambos os eixos.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Então por que "padrão", entre aspas? Tem algum detalhe?&lt;/blockquote&gt;Sim. Este padrão é considerado neste caso, em que se omite o posicionamento em um dos eixos. Acontece que muitos &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; FOX têm uma opção com o sufixo &lt;span style="font-family:courier new;"&gt;_NORMAL&lt;/span&gt;, que reúnem as opções mais comuns, e são passadas como argumento padrão para o construtor.&lt;br /&gt;&lt;br /&gt;Assim, para o &lt;span style="font-family:courier new;"&gt;FXButton&lt;/span&gt;, temos &lt;span style="font-family:courier new;"&gt;BUTTON_NORMAL&lt;/span&gt;, definido junto com outras opções:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_THICK&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt; |&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;&lt;br /&gt;               JUSTIFY_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;ICON_BEFORE_TEXT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na declaração do construtor:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXComposite&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;p&lt;/span&gt;,&lt;strong&gt;&lt;/strong&gt;&lt;span style="color: rgb(32, 64, 160);"&gt; ...&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;, ...&lt;/pre&gt;&lt;br /&gt;Ou seja, para um botão, o padrão é exibir o ícone à esquerda do texto. Como não foi especificado o posicionamento na vertical, fica centralizado.&lt;br /&gt;&lt;br /&gt;Espero que essa diferença tenha ficado clara. A distinção está na questão de existir uma opção padrão (que leva o valor &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt; exatamente para que não seja necessário informá-la explicitamente) e existir um argumento padrão para o construtor de um &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;, que reúne as opções mais comuns, que não necessariamente são as opções padrões.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;E como fica se eu combinar posicionamento vertical e horizontal?&lt;/blockquote&gt;&lt;br /&gt;Veja:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SgCQ_KjLg6I/AAAAAAAAAWg/eBcjWwfJvjo/s1600-h/hor_ver.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 146px; height: 150px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SgCQ_KjLg6I/AAAAAAAAAWg/eBcjWwfJvjo/s400/hor_ver.jpg" alt="" id="BLOGGER_PHOTO_ID_5332421373644735394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Deixo como exercício.&lt;br /&gt;&lt;br /&gt;Até a próxima.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-05/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-3405135767046474619?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/3405135767046474619/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=3405135767046474619&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3405135767046474619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3405135767046474619'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/05/botoes-texto-e-icone.html' title='Botões: Texto e ícone'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_boFQgM_NDMg/SgB61pyCi9I/AAAAAAAAAVY/3CYVzRYKzm8/s72-c/ICON_UNDER_TEXT.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-8291543028082632341</id><published>2009-05-04T13:30:00.001-03:00</published><updated>2009-05-05T12:33:02.184-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: FXHorizontalFrame</title><content type='html'>Neste tópico, falarei sobre o gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt;. Aproveito também para mostrar algumas dicas de layout.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Descrição&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;O gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;HorizontalFrame &lt;/span&gt;é utilizado para posicionar automaticamente as janelas filhas horizontalmente, da esquerda para a direita, ou da direita para a esquerda, dependendo das dicas de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; da janela.&lt;/blockquote&gt;&lt;br /&gt;Obs.: "janela" aqui refere-se a qualquer derivado de &lt;span style="font-family:courier new;"&gt;FXWindow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Exemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neste exemplo, temos um &lt;span style="font-family:courier new;"&gt;HorizontalFrame&lt;/span&gt; e dentro dele seis botões:&lt;br /&gt;&lt;pre&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;,&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;PACK_UNIFORM_WIDTH&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;PACK_UNIFORM_HEIGHT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FRAME_RAISED&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;a name="line24"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aqui, é criado o &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt;. Ele se expandirá por todo o eixo X da janela (&lt;span style="font-family:courier new;"&gt;LAYOUT_FILL_X&lt;/span&gt;) e todos os seus filhos terão a mesma dimensão (&lt;span style="font-family:courier new;"&gt;PACK_UNIFORM_WIDTH | PACK_UNIFORM_HEIGHT&lt;/span&gt;). Também possui uma borda "levantada", que eu coloquei aqui apenas para destacar.&lt;br /&gt;&lt;br /&gt;Em seguida, são criados os botões:&lt;br /&gt;&lt;pre&gt;&lt;a name="line25"&gt;25&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Botão 1"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Botão 2"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Botão com texto grande"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Botão em&lt;span style="color: rgb(119, 221, 119);"&gt;\n&lt;/span&gt;duas linhas"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt;&lt;br /&gt;&lt;a name="line30"&gt;30&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Centro"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line31"&gt;31&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_CENTER_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line32"&gt;32&lt;/a&gt;&lt;br /&gt;&lt;a name="line33"&gt;33&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;frame&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Botão à direita"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line34"&gt;34&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_RIGHT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Os dois primeiros não têm nada de peculiar. O terceiro possui o texto mais longo de todos e o quarto tem o texto quebrado em duas linhas. Isso vai influir no &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; dos botões, conforme veremos mais adiante.&lt;br /&gt;&lt;br /&gt;O quinto botão é posicionado no centro (&lt;span style="font-family:courier new;"&gt;LAYOUT_CENTER_X&lt;/span&gt;). Isso não fará que ele fique no centro da janela, mas no centro da área restante. O &lt;span style="font-family:courier new;"&gt;BUTTON_NORMAL&lt;/span&gt; serve para preservar as características originais de borda e texto do botão. O sexto botão fica alinhado à direita (&lt;span style="font-family:courier new;"&gt;LAYOUT_RIGHT&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Não há muito o que discutir além disso, só mostrar o resultado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/Sf8RoUTVohI/AAAAAAAAAVA/7kqvIjoZSwo/s1600-h/janela1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 30px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/Sf8RoUTVohI/AAAAAAAAAVA/7kqvIjoZSwo/s400/janela1.jpg" alt="" id="BLOGGER_PHOTO_ID_5331999868172214802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Percebe-se que os botões estão todos juntos. Isso se deve ao fato de eu não ter especificado nenhum tamanho para a janela principal (na verdade, não especifiquei tamanho de ninguém...). Assim, ela assume o tamanho mínimo para que caibam todos os seus filhos. E assim cada filho dela também o fez.&lt;br /&gt;&lt;br /&gt;Por isso o "Botão com texto grande" ficou mais longo e o "Botão em duas linhas" ficou com altura maior. Como o &lt;span style="font-style: italic;"&gt;frame&lt;/span&gt; foi instruído a deixar todo mundo nas mesmas dimensões, todo mundo recebeu a largura do terceiro botão e a altura do quarto.&lt;br /&gt;&lt;br /&gt;Aliás, esse é o principal motivo pelo qual eu não especifiquei um tamanho para a janela principal, como vinha fazendo nos tutoriais anteriores (nos quais eu criava uma janela &lt;span style="font-family:courier new;"&gt;200x200&lt;/span&gt;). Especificar um tamanho corre o risco de não caber todo mundo, ou de ficar grande demais. Na verdade, é bem difícil acertar. É muito melhor deixar o próprio FOX tratar esses detalhes.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;E quanto ao posicionamento dos dois últimos botões? Um centralizado e o outro à direita?&lt;/blockquote&gt;&lt;br /&gt;Pois bem, esse é o tamanho mínimo, que coube todo mundo, então fica todo mundo juntinho. Se eu aumentar a janela, eles assumem a posição correspondente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/Sf8TUzQP8CI/AAAAAAAAAVI/UALLRrRGGrI/s1600-h/janela2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 26px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/Sf8TUzQP8CI/AAAAAAAAAVI/UALLRrRGGrI/s400/janela2.jpg" alt="" id="BLOGGER_PHOTO_ID_5332001731906629666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Desta vez fica claro: o botão "Centro" ficou no meio do espaço disponível, e o "Botão à direita" ficou no canto onde realmente deveria estar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este tópico mostrou um dos gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; mais simples que o FOX Toolkit fornece. Mostrou também como agem algumas dicas de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, bem como as dicas de empacotamento discutidas &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-layout-hints.html"&gt;aqui&lt;/a&gt; e &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-packing-styles.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Com o tempo, ficará bem mais claro o poder que os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; oferecem.&lt;br /&gt;&lt;br /&gt;Só como presente de despedida desse tópico, uma pergunta que não quer calar:&lt;br /&gt;&lt;blockquote&gt;Se eu não definisse aquelas opções de empacotamento?&lt;/blockquote&gt;&lt;br /&gt;Apenas veja:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/Sf8WWtLlnwI/AAAAAAAAAVQ/wuWrj0TeOpk/s1600-h/janela3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 46px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/Sf8WWtLlnwI/AAAAAAAAAVQ/wuWrj0TeOpk/s400/janela3.jpg" alt="" id="BLOGGER_PHOTO_ID_5332005063171088130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Eu poderia ainda instruir os botões a ficarem centralizados no eixo Y (&lt;span style="font-family:courier new;"&gt;LAYOUT_CENTER_Y&lt;/span&gt;), mas isso não ajudaria muito em termos estéticos. Vou deixar isso a cargo da curiosidade do leitor.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-05-04/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-8291543028082632341?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/8291543028082632341/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=8291543028082632341&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8291543028082632341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8291543028082632341'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/layout-managers-fxhorizontalframe.html' title='Layout Managers: FXHorizontalFrame'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_boFQgM_NDMg/Sf8RoUTVohI/AAAAAAAAAVA/7kqvIjoZSwo/s72-c/janela1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-406765017462057546</id><published>2009-04-30T19:04:00.003-03:00</published><updated>2009-04-30T19:25:20.179-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: Packing Styles</title><content type='html'>&lt;div style="text-align: justify;"&gt;Neste tópico &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-layout-hints.html"&gt;aqui&lt;/a&gt;, falei das dicas de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;layout hints&lt;/span&gt;). Essas dicas são passadas para quem vai ficar dentro do gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Por exemplo, quando eu pus um botão na janela (veja &lt;a href="http://ideiasfox.blogspot.com/2009/04/botoes-botao-simples.html"&gt;aqui&lt;/a&gt;), eu passei &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL&lt;/span&gt; em suas opções, para que ocupasse a janela inteira.&lt;br /&gt;&lt;br /&gt;Existem ainda outras opções que definem o &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, mas que devem ser passadas para o próprio gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Essas opções determinam a forma de empacotamento dos filhos, e também são definidas em &lt;span style="font-family:courier new;"&gt;FXWindow.h&lt;/span&gt;. São elas:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  PACK_NORMAL&lt;/span&gt;         &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  PACK_UNIFORM_HEIGHT&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00008000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;  PACK_UNIFORM_WIDTH&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00010000&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;PACK_NORMAL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Opção padrão: cada &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; com seu tamanho. Nem precisa passar se for o caso (novamente, a não ser que você quiser maior clareza no código...).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;PACK_UNIFORM_HEIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiramente, o gerenciador calcula o filho com maior altura. Depois, utiliza esse valor para todos os outros filhos, deixando todo mundo com a mesma altura.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;PACK_UNIFORM_WIDTH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Da mesma forma, deixa todos os filhos com a mesma largura.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Essas duas últimas opções sobrepõem opções individuais dos filhos, como &lt;span style="font-family:courier new;"&gt;LAYOUT_FIX_WIDTH&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;À medida que avançarmos em nossos tutoriais sobre gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, mostrarei essas opções funcionando.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-406765017462057546?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/406765017462057546/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=406765017462057546&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/406765017462057546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/406765017462057546'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/layout-managers-packing-styles.html' title='Layout Managers: Packing Styles'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-7659931829578908653</id><published>2009-04-28T13:46:00.005-03:00</published><updated>2009-04-28T14:27:46.335-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='Tratamento de Eventos'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Tratamento de Eventos: Introdução</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://ideiasfox.blogspot.com/2009/04/botoes-botao-simples.html"&gt;Neste tutorial&lt;/a&gt;, coloquei um botão simples na janela. Esse botão não possuía ação nenhuma. Inútil.&lt;br /&gt;&lt;br /&gt;Agora, vou adicionar um evento a este botão: fechar o aplicativo (embora o texto do botão seja "Hello FOX"...).&lt;br /&gt;&lt;br /&gt;Para isso, basta informar quem é o alvo do evento e qual a mensagem:&lt;br /&gt;&lt;pre&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Hello, &amp;amp;FOX!"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160); font-weight: bold;"&gt;getApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255); font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255); font-weight: bold;"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160); font-weight: bold;"&gt;FXApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255); font-weight: bold;"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255); font-weight: bold;"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160); font-weight: bold;"&gt;ID_QUIT&lt;/span&gt;,&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Neste caso, o alvo do meu evento é o próprio aplicativo, que pode ser recuperado chamando &lt;span style="font-family:courier new;"&gt;getApp()&lt;/span&gt;, presente em todas as classes derivadas de &lt;span style="font-family:courier new;"&gt;FXId&lt;/span&gt; (na prática, quase todas as classes FOX são; veja &lt;a href="http://www.fox-toolkit.org/ref16/classFX_1_1FXId.html"&gt;aqui&lt;/a&gt; a hierarquia de &lt;span style="font-family:courier new;"&gt;FXId&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;A bem da verdade, nem seria necessário chamar esse método, já que estamos no construtor da janela, cujo primeiro parâmetro é a aplicação; bastava eu passar o ponteiro. Utilizei essa chamada aqui apenas para ilustrar.&lt;br /&gt;&lt;br /&gt;O próximo parâmetro é o identificador da mensagem. Por convenção, sempre começa com &lt;span style="font-family:courier new;"&gt;ID_&lt;/span&gt;. Aqui eu passei &lt;span style="font-family:courier new;"&gt;ID_QUIT&lt;/span&gt;, que pertence à classe &lt;span style="font-family:courier new;"&gt;FXApp&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;É só isso. Assim, eu conectei o botão à aplicação. Quando o botão envia um evento, a aplicação responde. Basicamente, é assim que os objetos se comunicam no FOX Toolkit.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Mas o que acontece lá dentro?&lt;/blockquote&gt;&lt;br /&gt;Bom, existem alguns detalhes a respeito disso. Com este exemplo, só posso dizer que o botão envia para a aplicação uma mensagem do tipo &lt;span style="font-family:courier new;"&gt;ID_QUIT&lt;/span&gt;, e a aplicação responde com a ação correspondente, ou seja, terminar a aplicação.&lt;br /&gt;&lt;br /&gt;Futuramente, entrarei em detalhes e explicarei como funciona o mecanismo de comunicação entre os objetos FOX.&lt;br /&gt;&lt;br /&gt;Só um detalhe, para o qual eu apanhei no começo e levei um certo tempo para descobrir o que era: eu criei um botão para fechar o aplicativo, mas em vez de passar o aplicativo, eu passei a janela. Resultado: a janela fechava, mas o aplicativo continuava executando... aí eu tinha que matar o processo.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-7659931829578908653?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/7659931829578908653/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=7659931829578908653&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7659931829578908653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7659931829578908653'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/tratamento-de-eventos-introducao.html' title='Tratamento de Eventos: Introdução'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-5090891543615256126</id><published>2009-04-27T15:30:00.002-03:00</published><updated>2009-04-27T15:43:15.417-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: Layout Hints</title><content type='html'>&lt;div style="text-align: justify;"&gt;As &lt;span style="font-style: italic;"&gt;Layout Hints&lt;/span&gt; são opções passadas pelos &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; para os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; que os contêm para informar algo a respeito de sua posição e tamanho. Assim como as opções de decoração (&lt;a href="http://ideiasfox.blogspot.com/2009/04/fxtopwindow-decoracoes-e-posicionamento.html"&gt;aqui&lt;/a&gt;), essas são apenas dicas; entretanto, os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; farão o possível para atender aos pedidos.&lt;br /&gt;&lt;br /&gt;A falta de algumas dicas quer dizer que o comportamento padrão deve ser utilizado, portanto muitas vezes não é preciso informá-las: as dicas do FOX Toolkit foram projetadas para que as situações mais comuns requeiram menos dicas. Por exemplo, normalmente os gerenciadores organizam seus filhos da esquerda para a direita, de cima para baixo, ou seja, não é preciso informar essas opções se esse for o caso.&lt;br /&gt;&lt;br /&gt;Essas dicas estão definidas em &lt;span style="font-family:courier new;"&gt;FXWindow.h&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_NORMAL&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_TOP&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000001&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_LEFT&lt;/span&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000002&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_RIGHT&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_LEFT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_COLUMN&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000001&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_ROW&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000002&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_LEFT&lt;/span&gt;        &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_RIGHT&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000004&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_CENTER_X&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000008&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_X&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_RIGHT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_CENTER_X&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_TOP&lt;/span&gt;         &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_BOTTOM&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000010&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_CENTER_Y&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000020&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_Y&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_BOTTOM&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_CENTER_Y&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_DOCK_SAME&lt;/span&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_DOCK_NEXT&lt;/span&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000040&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_RESERVED_1&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000080&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_WIDTH&lt;/span&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000100&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_HEIGHT&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000200&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_MIN_WIDTH&lt;/span&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_MIN_HEIGHT&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000400&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_Y&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00000800&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;        &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL_Y&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_EXPLICIT&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_X&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_Y&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                 &lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_WIDTH&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FIX_HEIGHT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Percebam que as opções &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; têm valor 0.&lt;br /&gt;&lt;br /&gt;A seguir, a explicação de cada opção. A menos quando informado o contrário, essas opções valem para todos os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_NORMAL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modo de &lt;span style="font-style: italic;"&gt;layout default&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_SIDE_TOP&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(default)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_SIDE_LEFT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_SIDE_RIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilizados somente quando o gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; for do tipo &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;FXGroupBox&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;FXTopWindow&lt;/span&gt;. Posiciona o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; junto à borda superior, inferior, esquerda ou direita, respectivamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_TOP&lt;span style="font-family:georgia;"&gt; e &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt; reduzem a altura do espaço disponível, enquanto &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_LEFT&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_RIGHT&lt;/span&gt; reduzem a largura.&lt;br /&gt;&lt;br /&gt;Essas opções não têm efeito nenhum se utilizadas em outros gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FILL_COLUMN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FILL_ROW&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilizados somente dentro de um &lt;span style="font-family:courier new;"&gt;FXMatrix&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se todos os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; de uma mesma coluna especificarem &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL_COLUMN&lt;/span&gt;, então a coluna inteira é redimensionada se a matriz for redimensionada horizontalmente.&lt;br /&gt;&lt;br /&gt;Da mesma forma, se todos o &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; de uma mesma linha especificarem &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL_ROW&lt;/span&gt;, então a linha inteira é redimensionada se a matriz for redimensionada verticalmente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_LEFT&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(default)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_RIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Posiciona o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; no lado esquerdo ou direito do seu contêiner, respectivamente. Quando utilizado em um &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;FXGroupBox&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;FXTopWindow&lt;/span&gt;, só fazem sentido se em conjunto com &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_TOP&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_TOP&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(default)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_BOTTOM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Posiciona o widget na parte de cima ou de baixo do seu contêiner, respectivamente. Quanto utilizado em um &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;FXGroupBox&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;FXTopWindow&lt;/span&gt;, só fazem sentido se em conjunto com &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_RIGHT&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;LAYOUT_SIDE_BOTTOM&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FIX_X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FIX_Y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Podem ser usados nenhum, um deles ou ambos. Instruem o gerenciador a posicionar o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; exatamente na posição informada pelo construtor do objeto. (Veja &lt;a href="http://ideiasfox.blogspot.com/2009/04/widgets.html"&gt;este tópico&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FIX_WIDTH&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FIX_HEIGHT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instruem o gerenciador a exibir o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; no tamanho especificado no construtor. (Veja &lt;a href="http://ideiasfox.blogspot.com/2009/04/widgets.html"&gt;este tópico&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_MIN_WIDTH&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(default)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_MIN_HEIGHT&lt;/span&gt; &lt;span style="font-size:85%;"&gt;(default)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estes não precisam ser especificados nunca (a não ser para enfatizar o fato durante a leitura do código), pois este é o comportamento padrão. Faz com que o gerenciador exiba o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; com seu tamanho mínimo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_CENTER_X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_CENTER_Y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Centraliza o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; no gerenciador na direção especificada, adicionando espaço extra ao redor dele. O tamanho do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; será o padrão (o tamanho mínimo), a menos que seja informado explicitamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FILL_X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FILL_Y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Faz com que o &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; ocupe todo o espaço disponível no contêiner na direção especificada. Se um ou mais &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; forem posicionados no mesmo gerenciador com essas opções, o espaço é dividido proporcionalmente aos seus tamanhos mínimos.&lt;br /&gt;&lt;br /&gt;Obs.: Essa regrinha acima não funciona para dois gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; lado-a-lado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_DOCK_SAME&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_DOCK_NEXT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_RESERVED_1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Confesso que não sei para que servem, e a documentação não fala nada a respeito.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_FILL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apenas uma combinação de&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:georgia;"&gt; &lt;/span&gt;LAYOUT_FILL_X&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL_Y&lt;/span&gt; para conveniência.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;LAYOUT_EXPLICIT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Outra opção de conveniência: combinação de &lt;span style="font-family:courier new;"&gt;LAYOUT_FIX_X&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;LAYOUT_FIX_Y&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;LAYOUT_FIX_WIDTH&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;LAYOUT_FIX_HEIGHT&lt;/span&gt;, ou seja, te dá controle total sobre a posição e o tamanho do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-5090891543615256126?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/5090891543615256126/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=5090891543615256126&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5090891543615256126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5090891543615256126'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/layout-managers-layout-hints.html' title='Layout Managers: Layout Hints'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-918203374632264856</id><published>2009-04-24T16:35:00.004-03:00</published><updated>2009-04-24T19:06:51.930-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='referência'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Widgets</title><content type='html'>&lt;div style="text-align: justify;"&gt;Este tópico discute um pequeno detalhe a respeito do construtor dos &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; FOX. Serve para mostrar um dos pontos fortes do FOX Toolkit, a consistência, e também alguns aspectos que serão mostrados aqui servirão para tópicos futuros.&lt;br /&gt;&lt;br /&gt;Bom, os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; FOX têm um construtor similar:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXWidget&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXComposite&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;p&lt;/span&gt;,&lt;br /&gt;   ...&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;tgt&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;sel&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;x&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;y&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;w&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;h&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pl&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pr&lt;/span&gt;,&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pt&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pb&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;hs&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;vs&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Alguns dele já foram explicados em tópicos anteriores, mas vou falar de todos aqui.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:100%;"  &gt;FXComposite *p&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O componente que será o pai do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; criado. Serve para montar a hierarquia dos objetos FOX sem a necessidade guardar em um ponteiro e chamar algo do tipo &lt;span style="font-family:courier new;"&gt;p-&gt;add()&lt;/span&gt; (sem querer falar mal de outras linguagens...).&lt;br /&gt;&lt;br /&gt;Normalmente é um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Parâmetros específicos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois do dono do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;, vêm alguns parâmetros específicos. Por exemplo, para um botão (&lt;span style="font-family:courier new;"&gt;FXButton&lt;/span&gt;) esses parâmetros são o texto do botão e o ícone.&lt;br /&gt;&lt;br /&gt;Naturalmente, nem todos os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; terão parâmetros específicos, e a quantidade varia de &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;. Mas eles sempre vêm depois do dono e antes do alvo dos eventos (exceto para gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXObject *tgt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FXObject&lt;/span&gt; é o topo da hierarquia de classes do FOX Toolkit. Esse parâmetro indica que objeto irá receber os eventos disparados.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Se esse parâmetro é um &lt;span style="font-family: courier new;"&gt;FXObject&lt;/span&gt;, então qualquer objeto FOX pode receber eventos?&lt;/blockquote&gt;&lt;br /&gt;Sim. Não só receber como também enviar.&lt;br /&gt;&lt;br /&gt;E só aproveitando o ensejo, aqui outra grande característica do FOX se revela: a capacidade de conectar os objetos entre si. Aqui essa conexão é estabelecida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXSelector sel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Além do alvo do evento, é preciso dizer qual é a mensagem que este &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; envia. &lt;span style="font-family:courier new;"&gt;FXSelector&lt;/span&gt; nada mais é que um inteiro sem sinal.&lt;br /&gt;&lt;br /&gt;Quando falarmos de tratamento de evento, esses dois parâmetros serão discutidos em mais detalhes.&lt;br /&gt;&lt;br /&gt;Obs.: não estão presentes em gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Simplesmente porque eles não enviam eventos que o usuário queira tratar por conta própria.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXuint opts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As opções do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Alguns &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; possuem opções específicas. Por exemplo, um botão tem a opção &lt;span style="font-family:courier new;"&gt;BUTTON_TOOLBAR&lt;/span&gt; (entre outras, naturalmente) que faz com que ele tenha aparência achatada, levantando as bordas ao se passar com o mouse por cima (como o próprio nome diz, um botão da barra de ferramentas).&lt;br /&gt;&lt;br /&gt;Aqui são passadas também opções de borda e de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. No tutorial sobre criar um botão (&lt;a href="http://ideiasfox.blogspot.com/2009/04/botoes-botao-simples.html"&gt;aqui&lt;/a&gt;), eu criei um botão normal (ou seja, com borda levantada, grossa, com o texto centralizado e o ícone antes do texto) e que se expande pela janela inteira (uma opção de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Todas essas opções são definidas por meio de enumerações e podem ser combinadas com o operador OU sobre bits ( &lt;span style="font-family:courier new;"&gt;|&lt;/span&gt; ).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXint x, FXint y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Posição. O único detalhe é que essas coordenadas são em relação à janela pai (mãe?). Mas como os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; se encarregam de posicionar seus filhos, raramente é necessário especificá-los manualmente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXint w, FXint h&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Largura e altura do &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt;. Novamente, isso é controlado pelos gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Mas é mais comum precisar controlar o tamanho que a posição.&lt;br /&gt;&lt;br /&gt;Normalmente não é necessário porque a maioria dos &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; sabe seu tamanho mínimo: um botão, por padrão, sempre vai ter um tamanho suficiente para exibir seu texto e ícone. Entretanto, alguns &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; não têm um tamanho mínimo: um &lt;span style="font-family:courier new;"&gt;FXCanvas&lt;/span&gt;, por exemplo, não tem nada dentro dele para calcular seu tamanho mínimo, então tem que dizer o tamanho dele (ou deixar que o gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; o diga).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXint pl, FXint pr, FXint pt, FXint pb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bem, esses parâmetros servem para informar a quantidade de espaço entre sua borda e outros &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt;. Se for um gerenciador de layout, define o espaço entre sua borda interna e os widgets (conforme já explicado &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-espacamentos.html"&gt;aqui&lt;/a&gt;). Se for um &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; folha (ou seja, não recebe nenhum filho na hierarquia), indica o espaço entre sua borda externa e outros &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt;, conforme a figura a seguir:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SfIxMxMybcI/AAAAAAAAAU4/EHihE2B60aw/s1600-h/widget.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SfIxMxMybcI/AAAAAAAAAU4/EHihE2B60aw/s400/widget.jpg" alt="" id="BLOGGER_PHOTO_ID_5328375404567883202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Esses aqui é que são raros de especificar. Os valores padrões que eles apresentam dão praticamente sempre bons resultados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;FXint hs, FXint vs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estes só estão disponíveis para gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Informam o espaço entre os seus filhos; também foi explicado &lt;a href="http://ideiasfox.blogspot.com/2009/04/layout-managers-espacamentos.html"&gt;aqui&lt;/a&gt;. E seus valores padrões também dão um resultado agradável.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-918203374632264856?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/918203374632264856/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=918203374632264856&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/918203374632264856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/918203374632264856'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/widgets.html' title='Widgets'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_boFQgM_NDMg/SfIxMxMybcI/AAAAAAAAAU4/EHihE2B60aw/s72-c/widget.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-9120724591130115528</id><published>2009-04-23T18:34:00.004-03:00</published><updated>2009-05-07T12:47:00.520-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ícones'/><category scheme='http://www.blogger.com/atom/ns#' term='errata'/><title type='text'>Errata: Ícones</title><content type='html'>&lt;div style="text-align: justify;"&gt;No &lt;a href="http://ideiasfox.blogspot.com/2009/04/tutorial-icones.html"&gt;tutorial sobre ícones&lt;/a&gt;, eu falei que o ícone deve saber quem é seu aplicativo. Isto é correto.&lt;br /&gt;&lt;br /&gt;Entretanto, logo em seguida eu disse que isso era para que o ícone fosse criado junto com o aplicativo. Não é bem assim.&lt;br /&gt;&lt;br /&gt;Um aplicativo FOX (&lt;span style="font-family: courier new;"&gt;FXApp&lt;/span&gt;) não tem conhecimento dos ícones ou imagens. Então quem tem a responsabilidade de criá-los é exatamente quem vai utilizá-los, seja uma janela, um botão ou qualquer outro objeto que exiba um ícone/imagem.&lt;br /&gt;&lt;br /&gt;Ou seja, se a minha janela tem um ícone, o &lt;span style="font-family: courier new;"&gt;create()&lt;/span&gt; da janela vai chamar o &lt;span style="font-family: courier new;"&gt;create()&lt;/span&gt; de seu ícone. E como ícones e imagens podem ser compartilhados, a eles é permitido chamar &lt;span style="font-family: courier new;"&gt;create()&lt;/span&gt; mais de uma vez.&lt;br /&gt;&lt;br /&gt;Observe que os objetos FOX são organizados em uma hierarquia em árvore, em que os pais criam os filhos. Isso quer dizer que se eu instancio uma imagem e dou um dono para ela antes que esse dono tenha sido criado, essa imagem será criada junto com seu dono.&lt;br /&gt;&lt;br /&gt;Se eu instanciar uma imagem depois que seu dono foi criado, é preciso chamar &lt;span style="font-family: courier new;"&gt;create()&lt;/span&gt; na imagem manualmente.&lt;br /&gt;&lt;br /&gt;Bom, o objetivo desse tópico era apenas apresentar essa correção. No fundo, no fundo, as imagens são criadas junto com o aplicativo, que é a raiz da hierarquia. Só que as imagens não são filhas do aplicativo, como eu imaginei, sendo criadas automaticamente se, e somente se, tiverem algum &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; que seja dono delas.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-9120724591130115528?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/9120724591130115528/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=9120724591130115528&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9120724591130115528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/9120724591130115528'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/errata-icones.html' title='Errata: Ícones'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-6854142782512659168</id><published>2009-04-23T15:22:00.008-03:00</published><updated>2009-04-28T14:08:02.040-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='Botões'/><title type='text'>Botões: Botão simples</title><content type='html'>&lt;div style="text-align: justify;"&gt;Retornando aos tutoriais básicos, falarei agora rapidamente sobre criar um botão na interface. Também os detalhes são diversos aqui, portanto este também é o primeiro tópico de uma série sobre os botões que o FOX Toolkit disponibiliza.&lt;br /&gt;&lt;br /&gt;Neste primeiro tópico, criarei apenas um botão que se expande pela janela inteira e não está associado a nenhum evento (falarei mais tarde sobre tratamento de eventos).&lt;br /&gt;&lt;br /&gt;Vamos lá, então.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;FoxTutorialMainWindow.cpp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXButton&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Hello, &amp;amp;FOX!"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;BUTTON_NORMAL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;LAYOUT_FILL&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pronto, o botão está criado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FXButton&lt;/span&gt; é a classe FOX para um botão simples, que você pressiona, solta, e ele executa uma ação. Aqui eu instancio um novo objeto dessa classe. Novamente, sem a necessidade de atribuir a um ponteiro, pois a própria janela se encarregará de liberá-lo.&lt;br /&gt;&lt;br /&gt;Os parâmetros que foram passados:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;this&lt;/span&gt;: significa que o botão será colocado dentro da própria janela principal.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;"Hello, &amp;amp;FOX!"&lt;/span&gt;: texto que aparecerá no botão. O &lt;span style="font-family:courier new;"&gt;&amp;amp;&lt;/span&gt; significa a letra que servirá de mnemônico, no caso &lt;span style="font-family:courier new;"&gt;F&lt;/span&gt;. Assim, &lt;span style="font-family:courier new;"&gt;Alt+F&lt;/span&gt; é o atalho para pressionar o botão. Existem outros detalhes dentro do texto do botão, que serão discutidos mais adiante.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;NULL&lt;/span&gt;: o ícone do botão. Aqui é criado um botão somente com texto, então fica nulo mesmo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;NULL&lt;/span&gt;: o alvo da mensagem. Como ele não lança nenhum evento, nulo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;0&lt;/span&gt;: a mensagem que o botão envia. Novamente, ele não lança nenhum evento: zero.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;BUTTON_NORMAL|LAYOUT_FILL&lt;/span&gt;: opções do botão. &lt;span style="font-family:courier new;"&gt;BUTTON_NORMAL &lt;/span&gt;significa um botão com borda grossa e elevada, com o texto centralizado e o ícone à esquerda. &lt;span style="font-family:courier new;"&gt;LAYOUT_FILL&lt;/span&gt; significa que ele será expandido para ocupar a janela inteira. Esses detalhes serão explicados em seu devido tempo.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;As demais opções referem-se à posição, tamanho e espaçamentos do botão, e normalmente não é necessário informá-los, pois têm valores padrões.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/SfDZV6CNboI/AAAAAAAAAUw/1ILFWLdwAXE/s1600-h/bot%C3%A3o_simples.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 208px; height: 228px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SfDZV6CNboI/AAAAAAAAAUw/1ILFWLdwAXE/s400/bot%C3%A3o_simples.jpg" alt="" id="BLOGGER_PHOTO_ID_5327997329558302338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Lembrando que &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt; é um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, redimensionar a janela fará com que o botão seja automaticamente redimensionado.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-04-23/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-6854142782512659168?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/6854142782512659168/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=6854142782512659168&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6854142782512659168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/6854142782512659168'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/botoes-botao-simples.html' title='Botões: Botão simples'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_boFQgM_NDMg/SfDZV6CNboI/AAAAAAAAAUw/1ILFWLdwAXE/s72-c/bot%C3%A3o_simples.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-754999143148531845</id><published>2009-04-17T18:18:00.003-03:00</published><updated>2009-04-17T18:28:52.390-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: Espaçamentos</title><content type='html'>&lt;div style="text-align: justify;"&gt;Todos os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; do FOX Toolkit têm um preenchimento (&lt;span style="font-style: italic;"&gt;padding&lt;/span&gt;) interior, que afasta seus &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; filhos das suas bordas de cima, baixo, esquerda e direita por uma certa distância em &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Além do preenchimento, há também um espaçamento (&lt;span style="font-style: italic;"&gt;spacing&lt;/span&gt;), que é a distância (em &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt;) entre dois &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; dentro do mesmo gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Bom, acho que com um desenho fica mais fácil de entender:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SejyqDx79pI/AAAAAAAAAUo/T7QqLTcTf-E/s1600-h/layout.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SejyqDx79pI/AAAAAAAAAUo/T7QqLTcTf-E/s400/layout.gif" alt="" id="BLOGGER_PHOTO_ID_5325773363748796050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;PL&lt;/span&gt; - espaço entre os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; e a borda esquerda do gerenciador&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;PR&lt;/span&gt; - espaço entre os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; e a borda direita&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;PT&lt;/span&gt; - espaço entre os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; e a borda superior&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;PB&lt;/span&gt; - espaço entre os &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; e a borda inferior&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;HS&lt;/span&gt; - espaço horizontal entre um &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; e outro&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;VS&lt;/span&gt; - espaço vertical entre um &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; e outro&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Esses parâmetros (nessa ordem) são tipicamente os seis últimos parâmetros do construtor de um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Porém, são fornecidos valores padrões para esses parâmetros, ou seja, na maioria dos casos não será necessário informá-los.&lt;br /&gt;&lt;br /&gt;Como exemplo, o construtor de &lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXHorizontalFrame&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXComposite&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;p&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;x&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;w&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;h&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pl&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pr&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pb&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;hs&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;,&lt;br /&gt;               &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;vs&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt;&lt;br /&gt;              &lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DEFAULT_SPACING&lt;/span&gt; é uma enumeração definida em &lt;span style="font-family:courier new;"&gt;FXPacker.h&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt; deriva diretamente de &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DEFAULT_SPACING&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ou seja, ao se colocar &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; dentro de um &lt;span style="font-family: courier new;"&gt;FXHorizontalFrame&lt;/span&gt;, estes estarão distantes das bordas por quatro &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt;, e distantes entre si também por quatro &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; (isto, claro, se os valores não forem informados, aceitando os padrões).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-754999143148531845?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/754999143148531845/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=754999143148531845&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/754999143148531845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/754999143148531845'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/layout-managers-espacamentos.html' title='Layout Managers: Espaçamentos'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_boFQgM_NDMg/SejyqDx79pI/AAAAAAAAAUo/T7QqLTcTf-E/s72-c/layout.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-785273617748247640</id><published>2009-04-17T12:23:00.006-03:00</published><updated>2009-04-17T17:05:34.093-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Layout Managers'/><title type='text'>Layout Managers: Introdução</title><content type='html'>&lt;div style="text-align: justify;"&gt;Em uma interface gráfica de usuário, é muito importante que &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; seja bem atrativo. Informar manualmente as posições e dimensões de cada objeto dá ao programador total controle sobre a interface. Entretanto, essa abordagem tem duas desvantagens seriíssimas:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;é uma tarefa tediosa e que consome muito tempo&lt;/li&gt;&lt;li&gt;se o tamanho da tela mudar, os objetos devem se adaptar a essas mudanças; se suas posições e dimensões forem absolutas, eles não se modificarão junto com a tela&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Devido a isso, a maneira mais recomendada de se posicionarem objetos é utilizando os chamados Gerenciadores de &lt;span style="font-style: italic;"&gt;Layout&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Layout Managers&lt;/span&gt;). A tarefa principal de um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; é arrumar os objetos que estão dentro dele de alguma maneira específica. Existem diferentes gerenciadores, que organizam seus objetos de cima para baixo, da esquerda para direita, em forma de grade e até um por cima do outro. A maioria deles permite, também, que as posições e dimensões sejam informadas explicitamente.&lt;br /&gt;&lt;br /&gt;As vantagens de se utilizarem os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; incluem:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Evita a tarefa chata de posicionar os controles&lt;/li&gt;&lt;li&gt;Os controles são rearrumados automaticamente quando há mudanças no &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; (por exemplo, o usuário aumenta o tamanho da fonte)&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;O &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; é recalculado automática e inteligentemente quando o usuário redimensiona a janela&lt;/li&gt;&lt;li&gt;Fica mais fácil adicionar controles que são criados automaticamente dependendo do controle do programa, como por exemplo interfaces criadas com base em bancos de dados&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Todos os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; do FOX Toolkit são derivados de &lt;span style="font-family:courier new;"&gt;FXComposite&lt;/span&gt;. Isso significa que é possível aninhá-los arbitrariamente. Esse aninhamento dos gerenciadores adequados, junto com as opções de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; passadas tanto para os próprios gerenciadores quanto para os objetos que ficarão dentro deles é que definirá o arranjo da interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; básicos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O FOX Toolkit vem com alguns gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; de propósito geral. Os principais são:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;: posiciona os objetos dentro de seu retângulo, grudandos-os a um dos lados (esquerdo, direito, superior ou inferior) e reduzindo o tamanho disponível de acordo. Por exemplo, se um objeto é posicionado à esquerda ou direita, a largura é reduzida; se for posicionado em cima ou embaixo, a altura é reduzida.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXTopWindow&lt;/span&gt;: opera da mesma forma que o &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;; entretanto, não é utilizado diretamente, pois não tem um construtor público. É utilizado indiretamente através de &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;FXDialogBox&lt;/span&gt; (duas subclasses diretas). Resumindo, toda janela que for criada (seja a principal ou uma caixa de diálogo) vai ter esse comportamento.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt;: organiza os filhos horizontalmente da esquera para direita (padrão) ou da direita para esquerda.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXVerticalFrame&lt;/span&gt;: organiza os filhos verticalmente de cima para baixo (padrão) ou de baixo para cima.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXMatrix&lt;/span&gt;: organiza os filhos em forma de grade, com linhas e colunas.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXSwitcher&lt;/span&gt;: posiciona os filhos exatamente um em cima do outro, deixando apenas um deles visível&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXGroupBox&lt;/span&gt;: provê a mesma funcionalidade do &lt;span style="font-family:courier new;"&gt;FXPacker&lt;/span&gt;, além de adicionar bordas ao redor do conteúdo e um rótulo (&lt;span style="font-style: italic;"&gt;label&lt;/span&gt;) opcional.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXSplitter&lt;/span&gt;: divide a tela horizontal ou verticalmente em duas áreas; a divisão pode ser movida pelo usuário.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FX4Splitter&lt;/span&gt;: divide a tela em quatro partes; da mesma forma, o usuário pode modificar as divisões.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXSpring&lt;/span&gt;: tipicamente colocada dentro de um &lt;span style="font-family:courier new;"&gt;FXHorizontalFrame&lt;/span&gt; ou &lt;span style="font-family:courier new;"&gt;FXVerticalFrame&lt;/span&gt;. A grande diferença do &lt;span style="font-family:courier new;"&gt;FXSpring&lt;/span&gt; para outros gerenciadores é que ele permite uma divisão da tela em proporções fixas, por exemplo, dividir uma janela em três partes nas proporções 1:2:1 (a janela do meio sempre será o dobro das outras duas).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Continua...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esta é apenas a primeira parte de uma séries de tópicos relacionados aos gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;. Este é um assunto muito extenso, que ainda tem muito a ser discutido. Existem vários detalhes a respeito deles, e haverá tópicos específicos para cada gerenciador mostrado acima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-785273617748247640?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/785273617748247640/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=785273617748247640&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/785273617748247640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/785273617748247640'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/layout-managers-introducao.html' title='Layout Managers: Introdução'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-8347633884050351814</id><published>2009-04-16T14:10:00.006-03:00</published><updated>2009-04-17T12:14:21.967-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='avançado'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>Exibir imagem do OpenCV (IplImage)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Além do FOX Toolkit, eu utilizo a biblioteca OpenCV (&lt;span style="font-style: italic;"&gt;Open Source Computer Vision Library&lt;/span&gt;), pois trabalho com Processamento de Imagens. Então surgiu a necessidade de juntar os dois.&lt;br /&gt;&lt;br /&gt;O OpenCV até fornece alguns recursos de interface gráfica, mas são muito limitados: apenas janelas, &lt;span style="font-style: italic;"&gt;trackbars&lt;/span&gt; e tratamento de eventos de mouse e teclado. A próxima figura mostra uma janela com uma &lt;span style="font-style: italic;"&gt;trackbar&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/SedrqA0HXKI/AAAAAAAAAUg/yd3YktdIWH0/s1600-h/highgui_window.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 354px; height: 400px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/SedrqA0HXKI/AAAAAAAAAUg/yd3YktdIWH0/s400/highgui_window.jpg" alt="" id="BLOGGER_PHOTO_ID_5325343453906164898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quebrando, então, a seqüência de tutoriais básicos, vou ensinar como exibir uma imagem do OpenCV (&lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt;) em um aplicativo FOX.&lt;br /&gt;&lt;br /&gt;Para isso, criarei um aplicativo que abre uma imagem pelo OpenCV, exibe e aplica o filtro da média. Não vou falar da criação da interface e do tratamento de eventos, apenas mostrar como se faz a "conversão" de &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt; para &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Na declaração da classe, eu apenas declaro os ponteiros para as imagens:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXImageView&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;imageView&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;IplImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;No construtor, eu apenas atribuo nulo a ambas, já que o usuário é quem vai escolher a imagem.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line32"&gt;32&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line33"&gt;33&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A "conversão" é feita ao carregar a imagem:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line52"&gt;52&lt;/a&gt; &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;MainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;onCmdOpen&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line53"&gt;53&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXFileDialog&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;dialog&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;this&lt;/strong&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Abrir imagem"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line54"&gt;54&lt;/a&gt;&lt;br /&gt;&lt;a name="line55"&gt;55&lt;/a&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;!&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;dialog&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;execute&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;PLACEMENT_OWNER&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line56"&gt;56&lt;/a&gt;     &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line57"&gt;57&lt;/a&gt;&lt;br /&gt;&lt;a name="line58"&gt;58&lt;/a&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line59"&gt;59&lt;/a&gt;     &lt;strong&gt;delete&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line60"&gt;60&lt;/a&gt;&lt;br /&gt;&lt;a name="line61"&gt;61&lt;/a&gt;   &lt;strong&gt;if&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line62"&gt;62&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;cvReleaseImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line63"&gt;63&lt;/a&gt;&lt;br /&gt;&lt;a name="line64"&gt;64&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXString&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;filename&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;dialog&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;getFilename&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line65"&gt;65&lt;/a&gt;&lt;br /&gt;&lt;a name="line66"&gt;66&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;IplImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cvLoadImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;filename&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line67"&gt;67&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cvCreateImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cvGetSize&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;IPL_DEPTH_8U&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line68"&gt;68&lt;/a&gt;&lt;br /&gt;&lt;a name="line69"&gt;69&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;cvCvtColor&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;CV_BGR2RGBA&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line70"&gt;70&lt;/a&gt;&lt;br /&gt;&lt;a name="line71"&gt;71&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;cvReleaseImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line72"&gt;72&lt;/a&gt;&lt;br /&gt;&lt;a name="line73"&gt;73&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXColor&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;colorData&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;reinterpret_cast&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXColor&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;imageData&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line74"&gt;74&lt;/a&gt;&lt;br /&gt;&lt;a name="line75"&gt;75&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;colorData&lt;/span&gt;,&lt;br /&gt;&lt;a name="line76"&gt;76&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_SHMP&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_SHMI&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_KEEP&lt;/span&gt;,&lt;br /&gt;&lt;a name="line77"&gt;77&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;width&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;height&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line78"&gt;78&lt;/a&gt;&lt;br /&gt;&lt;a name="line79"&gt;79&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line80"&gt;80&lt;/a&gt;&lt;br /&gt;&lt;a name="line81"&gt;81&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;imageView&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;setImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line82"&gt;82&lt;/a&gt;&lt;br /&gt;&lt;a name="line83"&gt;83&lt;/a&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line84"&gt;84&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aqui, eu crio uma imagem temporária só para carregar a imagem do arquivo. Neste caso, ele abre uma imagem colorida com três canais de 8 &lt;span style="font-style: italic;"&gt;bits&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A representação interna do &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt; é um vetor de caracteres e os &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; são armazenados em BGR.&lt;br /&gt;&lt;br /&gt;A representação interna do &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt; é um vetor de &lt;span style="font-family:courier new;"&gt;FXColor&lt;/span&gt; (equivalente a um inteiro sem sinal). Em cada inteiro são armazenados quatro canais (um &lt;span style="font-style: italic;"&gt;byte&lt;/span&gt; para cada): RGBA.&lt;br /&gt;&lt;br /&gt;Bom, aí já temos uma semelhança: ambos armazenam em um vetor. Isso que dizer que eu posso aproveitar o vetor de &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; do &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt; e jogar dentro do &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt;. Basta converter a representação interna.&lt;br /&gt;&lt;br /&gt;Então, cria-se uma &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt; com quatro canais e profundidade de 8 &lt;span style="font-style: italic;"&gt;bits&lt;/span&gt; sem sinal. Esta é a que foi declarada em nossa classe.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line67"&gt;67&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;cvCreateImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;cvGetSize&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;IPL_DEPTH_8U&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basta então converter nossa imagem temporária de BGR para RGBA:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line69"&gt;69&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;cvCvtColor&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;temp&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;CV_BGR2RGBA&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Assim, já temos uma &lt;span style="font-style: italic;"&gt;IplImage&lt;/span&gt; com representação interna parecida com a de &lt;span style="font-style: italic;"&gt;FXImage&lt;/span&gt;. É preciso ainda converter de &lt;span style="font-family:courier new;"&gt;char*&lt;/span&gt; para &lt;span style="font-family:courier new;"&gt;FXColor*&lt;/span&gt;. Essa não é uma conversão padrão, portanto é preciso usar um operador especial para isso.&lt;br /&gt;&lt;br /&gt;Eu acho até dolorido usá-lo, mas não vi outra alternativa.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line73"&gt;73&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXColor&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;colorData&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;reinterpret_cast&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXColor&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;imageData&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Com um vetor de &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; no formato interno do &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt;, é só criar nossa imagem:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line75"&gt;75&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;, &lt;span style="font-weight: bold; color: rgb(32, 64, 160);"&gt;colorData&lt;/span&gt;,&lt;br /&gt;&lt;a name="line76"&gt;76&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_SHMP&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_SHMI&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;IMAGE_KEEP&lt;/span&gt;,&lt;br /&gt;&lt;a name="line77"&gt;77&lt;/a&gt;       &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;width&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;height&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line78"&gt;78&lt;/a&gt;&lt;br /&gt;&lt;a name="line79"&gt;79&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como a imagem foi criada depois do aplicativo, é preciso chamar &lt;span style="font-family:courier new;"&gt;create()&lt;/span&gt; manualmente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Manipulando a imagem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, temos um &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt; com o vetor de &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; compartilhado com o &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt;. Isso significa que qualquer operação executada sobre a imagem &lt;span style="font-family:courier new;"&gt;Ipl&lt;/span&gt; refletirá na imagem &lt;span style="font-family:courier new;"&gt;FX&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Isso é demonstrado aqui, onde eu aplico o filtro da média para suavizar a imagem:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line88"&gt;88&lt;/a&gt; &lt;strong&gt;long&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;MainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;onCmdSmooth&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXObject&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXSelector&lt;/span&gt;, &lt;strong&gt;void&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line89"&gt;89&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;cvSmooth&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;iplImage&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;CV_BLUR&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;3&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line90"&gt;90&lt;/a&gt;&lt;br /&gt;&lt;a name="line91"&gt;91&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;fxImage&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;render&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line92"&gt;92&lt;/a&gt;&lt;br /&gt;&lt;a name="line93"&gt;93&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;imageView&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;update&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line94"&gt;94&lt;/a&gt;&lt;br /&gt;&lt;a name="line95"&gt;95&lt;/a&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line96"&gt;96&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Os únicos detalhes é que é preciso chamar &lt;span style="font-family:courier new;"&gt;render()&lt;/span&gt; de &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt; e atualizar o &lt;span style="font-family:courier new;"&gt;imageView&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-family:courier new;"&gt;render()&lt;/span&gt; é necessário porque há duas representações do &lt;span style="font-family:courier new;"&gt;FXImage&lt;/span&gt;: uma do lado do cliente, que neste caso é o vetor compartilhado entre as duas imagens, e o lado do servidor gráfico. &lt;span style="font-family:courier new;"&gt;render()&lt;/span&gt; atualiza o lado do servidor gráfico, de forma que seja exibida a imagem modificada.&lt;br /&gt;&lt;br /&gt;E é preciso atualizar o &lt;span style="font-family:courier new;"&gt;imageView&lt;/span&gt; porque ele não detecta automaticamente alterações na imagem, então é preciso informar manualmente que ele deve se redesenhar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Trabalhando com vídeos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O OpenCV, além de imagens estáticas, também trabalha com vídeos, que podem ser capturados de câmeras ou lidos de arquivos.&lt;br /&gt;&lt;br /&gt;Cada quadro do vídeo é recuperado em um &lt;span style="font-family:courier new;"&gt;IplImage&lt;/span&gt;. Isso significa que dá para usar a técnica descrita acima. O problema é que a imagem que representa cada quadro não pode ser deletada nem modificada. Isso significa que para cada quadro do vídeo, é preciso fazer a conversão para uma outra imagem.&lt;br /&gt;&lt;br /&gt;Seria mais simples se desse para modificar a imagem retornada, assim dava para compartilhar os pixels sem a necessidade de uma imagem extra.&lt;br /&gt;&lt;br /&gt;Infelizmente, não tenho nenhum exemplo a mostrar com vídeos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0_X_ATPITZ8&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;hd=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/0_X_ATPITZ8&amp;amp;hl=pt-br&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Créditos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagem retirada do &lt;a href="http://eupodiatamatando.com/"&gt;Eu Podia Tá Matando&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-04-16/FXImageFromIplImage.tar.gz"&gt;Código-fonte&lt;/a&gt; deste tutorial.&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-04-16/FXImageFromIplImage.ogv"&gt;&lt;span style="font-size:85%;"&gt;Baixar vídeo&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-8347633884050351814?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/8347633884050351814/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=8347633884050351814&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8347633884050351814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8347633884050351814'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/exibir-imagem-do-opencv-iplimage.html' title='Exibir imagem do OpenCV (IplImage)'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_boFQgM_NDMg/SedrqA0HXKI/AAAAAAAAAUg/yd3YktdIWH0/s72-c/highgui_window.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-557479215761625550</id><published>2009-04-15T13:38:00.003-03:00</published><updated>2009-04-15T13:55:19.663-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='referência'/><title type='text'>FXTopWindow: Decorações e Posicionamento de Janelas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quando falei sobre criar a janela principal (&lt;a href="http://ideiasfox.blogspot.com/2009/04/tutorial-janela-simples.html"&gt;aqui&lt;/a&gt;), citei alguns aspectos relativos às decorações da janela e seu posicionamento, informando que isto era definido em &lt;span style="font-family:courier new;"&gt;FXTopWindow.h&lt;/span&gt;, onde está definida a superclasse direta de &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Falarei agora especificamente desses dois assuntos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Decorações&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As decorações são itens "extras" que o seu decorador de janelas acrescenta. São as bordas da janela, barra de título, botões de minimizar, maximizar, fechar, menu da janela etc. &lt;span style="font-family:courier new;"&gt;FXTopWindow.h&lt;/span&gt; define a seguinte enumeração:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_NONE&lt;/span&gt;        &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_TITLE&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00020000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MINIMIZE&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00040000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MAXIMIZE&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00080000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_CLOSE&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00100000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_BORDER&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00200000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_SHRINKABLE&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00400000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_STRETCHABLE&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x00800000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_RESIZE&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_SHRINKABLE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_STRETCHABLE&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MENU&lt;/span&gt;        &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0x01000000&lt;/span&gt;,&lt;br /&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_ALL&lt;/span&gt;         &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_TITLE&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MINIMIZE&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MAXIMIZE&lt;/span&gt;    &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_CLOSE&lt;/span&gt;       &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_BORDER&lt;/span&gt;      &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_SHRINKABLE&lt;/span&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_STRETCHABLE&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;|&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_MENU&lt;/span&gt;&lt;br /&gt;                    &lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Apesar de serem bem intuitivos os nomes, vou explicá-los:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_NONE&lt;/span&gt;: Janela sem bordas, sem nada, só com o conteúdo. Se parecer inútil, pense em uma janela em modo tela cheia.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_TITLE&lt;/span&gt;: Título da janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_MINIMIZE&lt;/span&gt;: Adiciona a capacidade de minimizar a janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_MAXIMIZE&lt;/span&gt;: Adiciona a capacidade de maximizar a janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_CLOSE&lt;/span&gt;: Adiciona a capacidade de fechar a janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_BORDER&lt;/span&gt;: Adiciona bordas à janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_SHRINKABLE&lt;/span&gt;: Possibilita diminuir o tamanho da janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_STRETCHABLE&lt;/span&gt;: Possibilita aumentar o tamanho da janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_RESIZE&lt;/span&gt;: Permite aumentar ou diminuir a janela. Perceba que é apenas uma combinação das duas anteriores para facilitar.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_MENU&lt;/span&gt;: Habilita o menu da janela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;DECOR_ALL&lt;/span&gt;: Já conhecido, habilita todo mundo.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Agora a pergunta: se é tão intuitivo, porque explicar cada um? Simples. Essas são apenas sugestões para o decorador de janelas. Não são regras.&lt;br /&gt;&lt;br /&gt;Isso quer dizer que, se o decorador achar melhor desenhar um item que você não especificou, ele desenha. Por isso eu não falei "Desenha isso", "Desenha aquilo", mas sim "Adiciona a capacidade", "Habilita". Por exemplo, para exibir o botão de fechar, tem que ter a barra de título (e com certeza as bordas vêm de brinde). Acontece também de se especificarem somente os botões de minimizar e fechar, mas o de maximizar aparece junto, desabilitado.&lt;br /&gt;&lt;br /&gt;O que eu quero dizer é que cada decorador tem suas regras próprias, e que essas são apenas sugestões. Mas tenha certeza que o que você especificar ele faz. E se não especificar, também não faz; ou seja, se você não quer que a janela aumente de tamanho nem maximize, ela não irá, embora o botão de maximizar esteja lá (desabilitado, claro).&lt;br /&gt;&lt;br /&gt;Não quero dizer, por outro lado, que você deva confiar sempre nos itens que vêm de "brinde". Especifique sempre os que você quer ter certeza que estejam disponíveis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Posicionamento&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar a janela, chamei o método &lt;span style="font-family:courier new;"&gt;show()&lt;/span&gt;, passando &lt;span style="font-family:courier new;"&gt;PLACEMENT_SCREEN&lt;/span&gt; como parâmetro, exibindo no meio da tela. As opções de posicionamento são:&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;enum&lt;/strong&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_DEFAULT&lt;/span&gt;,&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_VISIBLE&lt;/span&gt;,&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_CURSOR&lt;/span&gt;,&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_OWNER&lt;/span&gt;,&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_SCREEN&lt;/span&gt;,&lt;br /&gt; &lt;span style="color:#2040a0;"&gt;PLACEMENT_MAXIMIZED&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_DEFAULT&lt;/span&gt;: No tamanho e posição que foram especificados no construtor.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_VISIBLE&lt;/span&gt;: Posiciona a janela para ficar totalmente visível. Confesso que nunca usei...&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_CURSOR&lt;/span&gt;: Posiciona onde está o cursor do mouse.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_OWNER&lt;/span&gt;: Posiciona no centro da janela dona desta. Quando adicionarmos mais janelas, esta opção será utilizada.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_SCREEN&lt;/span&gt;: Já conhecido, posiciona no centro da tela.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;PLACEMENT_MAXIMIZED&lt;/span&gt;: Deixa a janela do tamanho da tela. Mas tem uma ressalva.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;O &lt;span style="font-family: courier new;"&gt;PLACEMENT_MAXIMIZED&lt;/span&gt; realmente deixa a janela do tamanho da tela. Porém, dependendo do decorador (sempre ele...) as bordas vão todas embora. Dos que eu já usei (foram só três, mas tudo bem), só o Emerald (sempre ele...) preservou as bordas, deixando a janela do jeito que se imagina que uma janela maximizada deva ser. O decorador do Windows (não sei o nome) e o &lt;span style="font-family: courier new;"&gt;gtk-window-decorator&lt;/span&gt; (decorador padrão do GNOME) sumiram com as bordas.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;E se eu quiser que a janela já inicie maximizada, com borda e tudo?&lt;/blockquote&gt;&lt;br /&gt;Chame &lt;span style="font-family: courier new;"&gt;maximize()&lt;/span&gt; em vez de &lt;span style="font-family: courier new;"&gt;show()&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-557479215761625550?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/557479215761625550/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=557479215761625550&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/557479215761625550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/557479215761625550'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/fxtopwindow-decoracoes-e-posicionamento.html' title='FXTopWindow: Decorações e Posicionamento de Janelas'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-7384096179426492082</id><published>2009-04-14T13:45:00.005-03:00</published><updated>2009-05-06T12:23:08.756-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ícones'/><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Tutorial: Ícones</title><content type='html'>&lt;div style="text-align: justify;"&gt;O que seria uma interface gráfica sem eles? Neste tutorial ensinarei a colocar ícones na janela (tanto o pequeno quanto o grande). Claro que ícones no FOX não servem apenas para isso, mas como eu só falei da janela principal, é lá que vamos colocá-los.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Um breve histórico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acrescentar um ícone na interface FOX era bem trabalhoso. Primeiro, era preciso converter a imagem em um vetor (sim, um vetor estilo C) de &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt; utilizando um programa chamado &lt;span style="font-family:courier new;"&gt;reswrap&lt;/span&gt;, distribuído junto com o FOX Toolkit. Sua sintaxe era:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;reswrap [ options ] [ -o[a] arquivo_de_saida ] arquivos ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Opções:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;-o&lt;/span&gt;  – Cria ou sobrescreve &lt;span style="font-family:courier new;"&gt;arquivo_de_saida&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;-oa&lt;/span&gt; – Acrescenta ao &lt;span style="font-family:courier new;"&gt;arquivo_de_saida&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;-e&lt;/span&gt;  – Gera declaração de referência externa&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;-i&lt;/span&gt;  – Gera um arquivo de cabeçalho&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Assim, criavam-se dois arquivos, um &lt;span style="font-family:courier new;"&gt;icons.h&lt;/span&gt; com a declaração dos vetores, e um &lt;span style="font-family:courier new;"&gt;icons.cpp&lt;/span&gt; com o conteúdo deles. Era uma coisa monstruosa.&lt;br /&gt;&lt;br /&gt;Todo este trabalho foi aliviado com a chegada de uma classe mágica: &lt;span style="font-family:courier new;"&gt;FXIconSource&lt;/span&gt;. Mas vamos ao código. Vou exibir aqui apenas as modificações relativas ao tutorial anterior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;FoxTutorialMainWindow.h&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;a name="line1"&gt;&lt;/a&gt;&lt;a name="line21"&gt;21&lt;/a&gt; &lt;strong&gt;private&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;loadIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;   &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;destroyIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line25"&gt;25&lt;/a&gt;&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt; &lt;strong&gt;protected&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;windowIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;windowMiniIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line29"&gt;&lt;/a&gt;&lt;a name="line30"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a&gt;22/24&lt;/a&gt;: Métodos para carregar/destruir os ícones. Apenas por motivos de organização, deixando a tarefa centralizada.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;27/28&lt;/a&gt;: Os dois ícones da janela.&lt;br /&gt;&lt;br /&gt;O restante do arquivo permanece igual.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;FoxTutorialMainWindow.cpp&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;a name="line1"&gt;&lt;/a&gt;&lt;a name="line17"&gt;&lt;/a&gt;&lt;a name="line18"&gt;18&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Tutorial FOX"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_ALL&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;200&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;200&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;loadIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;setIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;windowIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;setMiniIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;windowMiniIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line25"&gt;&lt;br /&gt;&lt;/a&gt;...&lt;br /&gt;&lt;a name="line26"&gt;&lt;/a&gt;&lt;a name="line31"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a name="line32"&gt;32&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;~&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line33"&gt;33&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;destroyIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line34"&gt;34&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line35"&gt;35&lt;/a&gt;&lt;br /&gt;&lt;a name="line36"&gt;36&lt;/a&gt; &lt;span style="color: rgb(68, 68, 68);"&gt;&lt;i&gt;/******************************************************************************/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line37"&gt;37&lt;/a&gt;&lt;br /&gt;&lt;a name="line38"&gt;38&lt;/a&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;loadIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line39"&gt;39&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXIconSource&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;iconSource&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;getApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line40"&gt;40&lt;/a&gt;&lt;br /&gt;&lt;a name="line41"&gt;41&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;windowIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;iconSource&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;loadIconFile&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"icons/folders.gif"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line42"&gt;42&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;windowMiniIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;iconSource&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;loadScaledIconFile&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"icons/folders.gif"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;16&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line43"&gt;43&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line44"&gt;44&lt;/a&gt;&lt;br /&gt;&lt;a name="line45"&gt;45&lt;/a&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;destroyIcons&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line46"&gt;46&lt;/a&gt;   &lt;strong&gt;delete&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;windowIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line47"&gt;47&lt;/a&gt;   &lt;strong&gt;delete&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;windowMiniIcon&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line48"&gt;48&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a&gt;20&lt;/a&gt;: Carrega os ícones. Descrição do método mais adiante.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;22/23&lt;/a&gt;: Configura os ícones para a janela.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;33&lt;/a&gt;: Ícones podem ser compartilhados (utilizados por mais de um &lt;span style="font-style: italic;"&gt;widget&lt;/span&gt; por vez), portanto devem ser destruídos manualmente.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;38-43&lt;/a&gt;: Nosso método para carregar os ícones.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;39&lt;/a&gt;: Cria um objeto da classe &lt;span style="font-family:courier new;"&gt;FXIconSource&lt;/span&gt;. Apesar do nome, serve também para carregar imagens. Mas vamos com calma.&lt;br /&gt;Cada ícone deve saber quem é sua aplicação, portanto o &lt;span style="font-family:courier new;"&gt;IconSource&lt;/span&gt; já deve vir com essa informação. Serve para que eles sejam criados junto com a aplicação.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;41&lt;/a&gt;: Carrega um ícone do arquivo, retornando um ponteiro para o ícone.&lt;br /&gt;&lt;a&gt;&lt;br /&gt;42&lt;/a&gt;: Idem, mas além de carregar, escala o ícone para que nenhuma de suas dimensões exceda o valor estabelecido (no caso, 16 &lt;span style="font-style: italic;"&gt;pixels&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a&gt;45-48&lt;/a&gt;: Nosso destrutor.&lt;br /&gt;Conforme dito acima, precisamos destruir manualmente nossos ícones. &lt;span style="font-family:courier new;"&gt;delete&lt;/span&gt; é o suficiente para isso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/SeTHRLsC9SI/AAAAAAAAAUQ/VHC9MYQ36rQ/s1600-h/Tutorial+FOX+-+MiniIcon.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 216px; height: 231px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/SeTHRLsC9SI/AAAAAAAAAUQ/VHC9MYQ36rQ/s400/Tutorial+FOX+-+MiniIcon.jpg" alt="" id="BLOGGER_PHOTO_ID_5324599757468005666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/SeTHRaB7U1I/AAAAAAAAAUY/1obKKPzAE9k/s1600-h/Tutorial+FOX+-+BigIcon.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 307px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SeTHRaB7U1I/AAAAAAAAAUY/1obKKPzAE9k/s400/Tutorial+FOX+-+BigIcon.jpg" alt="" id="BLOGGER_PHOTO_ID_5324599761317876562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Considerações finais&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Por que GIF?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apenas dois motivos: é suportado nativamente pelo FOX Toolkit e suporta transparência. Mas nada impede de usar outros formatos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Créditos&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Destaque de sintaxe provido por &lt;a href="http://www.palfrader.org/code2html"&gt;Code2HTML&lt;/a&gt;, v. 0.9.1&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2008/08/27/on-stage-a-free-icon-set/"&gt;On Stage Icon Set&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-04-14/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; deste tutorial.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-7384096179426492082?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/7384096179426492082/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=7384096179426492082&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7384096179426492082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/7384096179426492082'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/tutorial-icones.html' title='Tutorial: Ícones'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_boFQgM_NDMg/SeTHRLsC9SI/AAAAAAAAAUQ/VHC9MYQ36rQ/s72-c/Tutorial+FOX+-+MiniIcon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-8577883894752613256</id><published>2009-04-13T13:30:00.001-03:00</published><updated>2009-04-13T14:12:22.533-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='referência'/><title type='text'>FXMainWindow</title><content type='html'>&lt;div style="text-align: justify;"&gt;Já que nosso último tutorial foi sobre criar uma janela vazia, usando &lt;span style="font-family: courier new;"&gt;FXMainWindow&lt;/span&gt;, falarei agora especificamente sobre essa classe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Descrição&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;A &lt;span style="font-family:courier new;"&gt;MainWindow&lt;/span&gt; é normalmente a janela central de uma aplicação. Aplicações podem ter qualquer número de janelas principais.&lt;br /&gt;&lt;br /&gt;Quando uma &lt;span style="font-family:courier new;"&gt;MainWindow&lt;/span&gt; é fechada, ela envia uma mensagem &lt;span style="font-family:courier new;"&gt;SEL_CLOSE&lt;/span&gt; para o seu alvo; o alvo deve retornar &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt; se não houver nenhuma objeção contra o fechamento, e &lt;span style="font-family:courier new;"&gt;1&lt;/span&gt; caso contrário.&lt;br /&gt;&lt;br /&gt;Depois que a mensagem &lt;span style="font-family:courier new;"&gt;SEL_CLOSE&lt;/span&gt; for enviada e nenhuma objeção for levantada, a janela principal deletará a si mesma.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Declaração&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line1"&gt; 1&lt;/a&gt; &lt;strong&gt;class&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXAPI&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt; &lt;strong&gt;public&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXTopWindow&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line2"&gt; 2&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXDECLARE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line3"&gt; 3&lt;/a&gt; &lt;strong&gt;protected&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line4"&gt; 4&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line5"&gt; 5&lt;/a&gt; &lt;strong&gt;private&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line6"&gt; 6&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line7"&gt; 7&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;strong&gt;operator&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line8"&gt; 8&lt;/a&gt; &lt;strong&gt;public&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line9"&gt; 9&lt;/a&gt;&lt;br /&gt;&lt;a name="line10"&gt;10&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 68);"&gt;/// Constrói uma janela principal&lt;/span&gt;&lt;br /&gt;&lt;a name="line11"&gt;11&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;, &lt;strong&gt;const&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXString&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;name&lt;/span&gt;,&lt;br /&gt;&lt;a name="line12"&gt;12&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;ic&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXIcon&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;mi&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;,&lt;br /&gt;&lt;a name="line13"&gt;13&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXuint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;opts&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_ALL&lt;/span&gt;,&lt;br /&gt;&lt;a name="line14"&gt;14&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;x&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;y&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line15"&gt;15&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;w&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;h&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line16"&gt;16&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pl&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pr&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line17"&gt;17&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pt&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;pb&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;,&lt;br /&gt;&lt;a name="line18"&gt;18&lt;/a&gt;                &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;hs&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXint&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;vs&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 68);"&gt;/// Cria os recursos do servidor (server-side)&lt;/span&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;strong&gt;virtual&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 68);"&gt;/// Destrutor&lt;/span&gt;&lt;br /&gt;&lt;a name="line25"&gt;25&lt;/a&gt;   &lt;strong&gt;virtual&lt;/strong&gt; ~&lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sim, ela é só isso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Discussão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a&gt;1&lt;/a&gt;: A classe &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt; é derivada de &lt;span style="font-family:courier new;"&gt;FXTopWindow&lt;/span&gt;. Por isso ela é pequena desse jeito, toda a funcionalidade dela é herdada das superclasses. E a hierarquia não é pequena:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/SeNZDdQYUUI/AAAAAAAAASs/5KyRZDdLmgc/s1600-h/FXMainWindow_hierarquia.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 95px; height: 400px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/SeNZDdQYUUI/AAAAAAAAASs/5KyRZDdLmgc/s400/FXMainWindow_hierarquia.jpg" alt="" id="BLOGGER_PHOTO_ID_5324197100409868610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obs.: Em tópicos deste tipo, tratarei de apenas uma classe, ou seja, vou me limitar ao que a declaração da classe apresenta.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;11-19&lt;/a&gt;: Construtor. Recebe 15 parâmetros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXApp *a&lt;/span&gt; - Ponteiro para a aplicação.&lt;/li&gt;  &lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXString &amp;amp;name&lt;/span&gt; - Título da janela.&lt;/li&gt;  &lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXIcon *ic, FXIcon *mi&lt;/span&gt; - Ícones da janela.&lt;br /&gt; &lt;/li&gt;  &lt;ul&gt;&lt;li&gt;Ícone grande, que aparece quando se troca de janela com &lt;span style="font-family:courier new;"&gt;Alt+Tab&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;Ícone pequeno, que aparece no canto superior esquerdo da janela&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;  &lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXuint opts&lt;/span&gt; - Opções da janela.&lt;br /&gt;Essas opções referem-se às decorações da janela, e são definidas em &lt;span style="font-family:courier new;"&gt;FXTopWindow.h&lt;/span&gt;. Chegaremos lá.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXint x, FXint y&lt;/span&gt; - Posição inicial da janela.&lt;/li&gt;  &lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXint w, FXint h&lt;/span&gt; - Largura e altura da janela.&lt;/li&gt;  &lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXint pl, FXint pr, FXint pt, FXint pb&lt;/span&gt; - Espaçamento entre os componentes e a borda da janela.&lt;br /&gt;Uma &lt;span style="font-family:courier new;"&gt;MainWindow&lt;/span&gt; é um gerenciador de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;layout manager&lt;/span&gt;), portanto aceita esses parâmetros. Quando falarmos de gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, explicarei melhor.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;FXint hs, FXint vs&lt;/span&gt; - Espaçamento entre um componente e outro.&lt;br /&gt;Idem.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Percebam que apenas a aplicação e o título da janela são obrigatórios. Todos os outros parâmetros têm valores &lt;span style="font-style: italic;"&gt;default&lt;/span&gt;, ou seja, podem ser omitidos. Outra vantagem do FOX Toolkit: os parâmetros &lt;span style="font-style: italic;"&gt;default&lt;/span&gt; asseguram um &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; agradável aos olhos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Observações&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A descrição da classe foi retirada da própria documentação de referência.&lt;/li&gt;&lt;li&gt;O gráfico de herança foi desenhado com o programa Dia.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fox-toolkit.org/ref16/classFX_1_1FXMainWindow.html"&gt;Documentação de &lt;span style="font-family: courier new;"&gt;FXMainWindow&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://projects.gnome.org/dia/"&gt;Página do Dia&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-8577883894752613256?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/8577883894752613256/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=8577883894752613256&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8577883894752613256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/8577883894752613256'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/fxmainwindow.html' title='FXMainWindow'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_boFQgM_NDMg/SeNZDdQYUUI/AAAAAAAAASs/5KyRZDdLmgc/s72-c/FXMainWindow_hierarquia.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-5186612781287843330</id><published>2009-04-09T15:39:00.005-03:00</published><updated>2009-04-09T16:35:29.942-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Tutorial: Janela simples</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;De posse de um ambiente de desenvolvimento todo configurado, passemos à parte mais interessante: o código.&lt;br /&gt;&lt;br /&gt;Neste tutorial, ensinarei a criar uma janela simples, vazia. Essa janela será, naturalmente, a nossa janela principal, e será incrementada a cada tutorial.&lt;br /&gt;&lt;br /&gt;Sendo essa janela a principal, ela dever ser derivada da classe &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Obs.: Toda classe no FOX Toolkit tem o prefixo &lt;span style="font-family:courier new;"&gt;FX&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;FoxTutorialMainWindow.h&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;a name="line1"&gt; 1&lt;/a&gt; &lt;span style="color: rgb(68, 68, 68);"&gt;/*&lt;br /&gt;&lt;a name="line2"&gt; 2&lt;/a&gt;  * FoxTutorialMainWindow.h&lt;br /&gt;&lt;a name="line3"&gt; 3&lt;/a&gt;  *&lt;br /&gt;&lt;a name="line4"&gt; 4&lt;/a&gt;  *  Created on: 07/04/2009&lt;br /&gt;&lt;a name="line5"&gt; 5&lt;/a&gt;  *      Author: edgar&lt;br /&gt;&lt;a name="line6"&gt; 6&lt;/a&gt;  */&lt;/span&gt;&lt;br /&gt;&lt;a name="line7"&gt; 7&lt;/a&gt;&lt;br /&gt;&lt;a name="line8"&gt; 8&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef FOXTUTORIALMAINWINDOW_H&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line9"&gt; 9&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#define FOXTUTORIALMAINWINDOW_H&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line10"&gt;10&lt;/a&gt;&lt;br /&gt;&lt;a name="line11"&gt;11&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#ifndef FXMAINWINDOW_H&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line12"&gt;12&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;fox-1.6/FXMainWindow.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line13"&gt;13&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line14"&gt;14&lt;/a&gt;&lt;br /&gt;&lt;a name="line15"&gt;15&lt;/a&gt; &lt;strong&gt;class&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt; &lt;strong&gt;public&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line16"&gt;16&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXDECLARE&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line17"&gt;17&lt;/a&gt;&lt;br /&gt;&lt;a name="line18"&gt;18&lt;/a&gt; &lt;strong&gt;private&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt; &lt;strong&gt;public&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;   &lt;strong&gt;virtual&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line25"&gt;25&lt;/a&gt;&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt;   &lt;strong&gt;virtual&lt;/strong&gt; ~&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt;&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#endif&lt;span style="color: rgb(68, 68, 68);"&gt; /* FOXTUTORIALMAINWINDOW_H */&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Analisando linha por linha:&lt;br /&gt;&lt;br /&gt;&lt;a&gt;15&lt;/a&gt;: A classe &lt;span style="font-family:courier new;"&gt;FoxTutorialMainWindow&lt;/span&gt; é derivada de &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;16&lt;/a&gt;: Macro para declaração de hierarquia. Obrigatório para todas as classes FOX.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;19&lt;/a&gt;: Construtor default privado sem corpo. Obrigatório também.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;22&lt;/a&gt;: Construtor público. É o que vamos utilizar. Recebe como parâmetro um ponteiro para &lt;span style="font-family:courier new;"&gt;FXApp&lt;/span&gt;, classe que representa uma aplicação FOX.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;24&lt;/a&gt;: Todos os componentes FOX têm um método &lt;span style="font-family:courier new;"&gt;virtual void create()&lt;/span&gt;; aqui vamos sobrescrevê-lo.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;26&lt;/a&gt;: Nosso destrutor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;FoxTutorialMainWindow.cpp&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line1"&gt; 1&lt;/a&gt; &lt;span style="color: rgb(68, 68, 68);"&gt;/*&lt;br /&gt;&lt;a name="line2"&gt; 2&lt;/a&gt;  * FoxTutorialMainWindow.cpp&lt;br /&gt;&lt;a name="line3"&gt; 3&lt;/a&gt;  *&lt;br /&gt;&lt;a name="line4"&gt; 4&lt;/a&gt;  *  Created on: 07/04/2009&lt;br /&gt;&lt;a name="line5"&gt; 5&lt;/a&gt;  *      Author: edgar&lt;br /&gt;&lt;a name="line6"&gt; 6&lt;/a&gt;  */&lt;/span&gt;&lt;br /&gt;&lt;a name="line7"&gt; 7&lt;/a&gt;&lt;br /&gt;&lt;a name="line8"&gt; 8&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;fox-1.6/fx.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line9"&gt; 9&lt;/a&gt;&lt;br /&gt;&lt;a name="line10"&gt;10&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"FoxTutorialMainWindow.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line11"&gt;11&lt;/a&gt;&lt;br /&gt;&lt;a name="line12"&gt;12&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXDEFMAP&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindowMap&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line13"&gt;13&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line14"&gt;14&lt;/a&gt;&lt;br /&gt;&lt;a name="line15"&gt;15&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXIMPLEMENT&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;,&lt;br /&gt;&lt;a name="line16"&gt;16&lt;/a&gt;     &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindowMap&lt;/span&gt;,&lt;br /&gt;      &lt;span style="color: rgb(32, 64, 160);"&gt;ARRAYNUMBER&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindowMap&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line17"&gt;17&lt;/a&gt;&lt;br /&gt;&lt;a name="line18"&gt;18&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;a&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Tutorial FOX"&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;NULL&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;DECOR_ALL&lt;/span&gt;,&lt;br /&gt;        &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;200&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;200&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt; &lt;strong&gt;void&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line23"&gt;23&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line24"&gt;24&lt;/a&gt;&lt;br /&gt;&lt;a name="line25"&gt;25&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;show&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;PLACEMENT_SCREEN&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line26"&gt;26&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line27"&gt;27&lt;/a&gt;&lt;br /&gt;&lt;a name="line28"&gt;28&lt;/a&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;:&lt;/span&gt;~&lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line29"&gt;29&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Analisando linha por linha:&lt;br /&gt;&lt;br /&gt;&lt;a&gt;8&lt;/a&gt;: &lt;span style="font-family:courier new;"&gt;fx.h&lt;/span&gt; é um arquivo de fachada que inclui quase todos os arquivos de cabeçalho do FOX Toolkit. Por enquanto, basta saber que ele inclui o suficiente para a interface gráfica de um programa comum.&lt;br /&gt;&lt;br /&gt;Outro ponto que merece destaque é que todas as classes FOX estão dentro do &lt;span style="font-style: italic;"&gt;namespace&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;FX&lt;/span&gt;. O arquivo&lt;span style="font-family:courier new;"&gt; fx.h&lt;/span&gt; automaticamente instrui o compilador a usar esse &lt;span style="font-style: italic;"&gt;namespace&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;using namespace FX;&lt;/span&gt;), a menos que a macro &lt;span style="font-family:courier new;"&gt;FX_NO_GLOBAL_NAMESPACE&lt;/span&gt; esteja definida. Mas cá entre nós, quem iria querer definir essa macro e usar &lt;span style="font-family:courier new;"&gt;FX::FXMainWindow&lt;/span&gt;? Detalhe: isso para todas as classes.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;12-13&lt;/a&gt;: Definição do mapa de mensagens. Aqui é definido o tratamento de eventos, ou seja, a resposta da janela diante das ações do usuário. Como nossa janela não vai tratar nenhum evento por enquanto, ele fica vazio mesmo. Quando falarmos de tratamento de eventos, explicarei o mapa de mensagens com mais detalhes.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;15-16&lt;/a&gt;: Implementação do mapa de mensagens. Esse é obrigatório. Os parâmetros dessa macro são:&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Nome da classe (&lt;span style="font-family:courier new;"&gt;FoxTutorialMainWindow&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Nome da superclasse (&lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Mapa de mensagens (&lt;span style="font-family:courier new;"&gt;FoxTutorialMainWindowMap&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Número de entradas do mapa de mensagens. Para não haver a necessidade de atualizar manualmente esse valor sempre que colocar ou tirar uma entrada do mapa, o FOX provê a macro &lt;span style="font-family:courier new;"&gt;ARRAYNUMBER&lt;/span&gt;, que calcula o número de elementos de um vetor estático.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a&gt;18-20&lt;/a&gt;: Construtor. Como nossa classe é derivada de &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;, aqui chamamos o construtor da superclasse para a devida inicialização. Mais tarde falarei especificamente da classe &lt;span style="font-family:courier new;"&gt;FXMainWindow&lt;/span&gt;; portanto, apenas saiba que os parâmetros passados são, respectivamente:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;a aplicação que será dona dessa janela&lt;/li&gt;&lt;li&gt;título da janela&lt;/li&gt;&lt;li&gt;ícone grande (o ícone que aparece quando se muda de janela com &lt;span style="font-family:courier new;"&gt;Alt+Tab&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;ícone pequeno (o que fica no canto da janela, na barra de título)&lt;/li&gt;&lt;li&gt;decorações da janela (borda, barra de título, menu da janela etc.)&lt;/li&gt;&lt;li&gt;posição X e Y da janela&lt;/li&gt;&lt;li&gt;largura e altura da janela&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ou seja, estamos criando uma janela com as seguintes propriedades:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;chamada "Tutorial FOX"&lt;/li&gt;&lt;li&gt;sem ícones (normalmente passa-se &lt;span style="font-family:courier new;"&gt;NULL&lt;/span&gt; para ambos, sendo ajustados dentro do construtor)&lt;/li&gt;&lt;li&gt;com todas as decorações disponíveis (mais detalhes sobre isso mais tarde, em outro post)&lt;/li&gt;&lt;li&gt;inicialmente posicionada no canto superior esquerdo da tela &lt;span style="font-family:courier new;"&gt;(0, 0)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;tamanho inicial de &lt;span style="font-family:courier new;"&gt;200x200&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a&gt;22-26&lt;/a&gt;: Aqui sobrescrevemos o método &lt;span style="font-family:courier new;"&gt;create()&lt;/span&gt;. Na verdade, apenas o estendemos para que, além de criar a janela, ela possa ser automaticamente exibida. Neste caso, ela será exibida no centro da tela.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;28-39&lt;/a&gt;: Nosso destrutor. A classe não tem nada de novo, então não há o que destruir explicitamente. Vazio.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;main.cpp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;É necessário fornecer uma função &lt;span style="font-family:courier new;"&gt;main()&lt;/span&gt; (não &lt;span style="font-family:courier new;"&gt;WinMain()&lt;/span&gt; ou qualquer outra específica de plataforma) para que o programa rode. Normalmente, pode ser implementada da seguinte forma:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;&lt;a name="line1"&gt; 1&lt;/a&gt; &lt;span style="color: rgb(68, 68, 68);"&gt;/*&lt;br /&gt;&lt;a name="line2"&gt; 2&lt;/a&gt;  * main.cpp&lt;br /&gt;&lt;a name="line3"&gt; 3&lt;/a&gt;  *&lt;br /&gt;&lt;a name="line4"&gt; 4&lt;/a&gt;  *  Created on: 07/04/2009&lt;br /&gt;&lt;a name="line5"&gt; 5&lt;/a&gt;  *      Author: edgar&lt;br /&gt;&lt;a name="line6"&gt; 6&lt;/a&gt;  */&lt;/span&gt;&lt;br /&gt;&lt;a name="line7"&gt; 7&lt;/a&gt;&lt;br /&gt;&lt;a name="line8"&gt; 8&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;fox-1.6/fx.h&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line9"&gt; 9&lt;/a&gt;&lt;br /&gt;&lt;a name="line10"&gt;10&lt;/a&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;#include &lt;span style="color: rgb(0, 128, 0);"&gt;"FoxTutorialMainWindow.h"&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line11"&gt;11&lt;/a&gt;&lt;br /&gt;&lt;a name="line12"&gt;12&lt;/a&gt; &lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;main&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;argc&lt;/span&gt;, &lt;strong&gt;char&lt;/strong&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="line13"&gt;13&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;FXApp&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;"Tutorial FOX"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Edgar Moraes Diniz"&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line14"&gt;14&lt;/a&gt;&lt;br /&gt;&lt;a name="line15"&gt;15&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;init&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;argc&lt;/span&gt;, &lt;span style="color: rgb(32, 64, 160);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line16"&gt;16&lt;/a&gt;&lt;br /&gt;&lt;a name="line17"&gt;17&lt;/a&gt;   &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;FoxTutorialMainWindow&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line18"&gt;18&lt;/a&gt;&lt;br /&gt;&lt;a name="line19"&gt;19&lt;/a&gt;   &lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;create&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line20"&gt;20&lt;/a&gt;&lt;br /&gt;&lt;a name="line21"&gt;21&lt;/a&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;app&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;run&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;a name="line22"&gt;22&lt;/a&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Analisando linha por linha:&lt;br /&gt;&lt;br /&gt;&lt;a&gt;12&lt;/a&gt;: Por favor, sempre declarem a função &lt;span style="font-family:courier new;"&gt;main()&lt;/span&gt; dessa forma, retornando um inteiro e recebendo dois parâmetros, &lt;span style="font-family:courier new;"&gt;argc&lt;/span&gt; inteiro e &lt;span style="font-family:courier new;"&gt;argv&lt;/span&gt; um vetor de &lt;span style="font-style: italic;"&gt;strings&lt;/span&gt;. Nada de &lt;span style="font-family:courier new;"&gt;void main(void)&lt;/span&gt;. Isso é válido para qualquer aplicativo, mesmo (e principalmente) em linha de comando.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;13&lt;/a&gt;: Instancia um objeto &lt;span style="font-family:courier new;"&gt;FXApp&lt;/span&gt;, que representa nossa aplicação. Os parâmetros são o nome da aplicação e o fabricante.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;15&lt;/a&gt;: Inicia o aplicativo, analisando os argumentos de linha de comando. Não adianta tentar burlar a regra da linha 12, passando &lt;span style="font-family:courier new;"&gt;0&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;NULL&lt;/span&gt;. O FOX não deixa.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;17&lt;/a&gt;: Instancia a nossa janela. Aqui cabe uma discussão interessante sobre o FOX Toolkit.&lt;br /&gt;&lt;br /&gt;Percebam que eu não atribuí a nenhum ponteiro. Simplesmente porque não é necessário. O único parâmetro que eu tenho para a janela é a minha aplicação. Essa aplicação vai armazenar o ponteiro para a janela. Quando a aplicação for destruída, ela destrói tudo o que é dela, incluindo essa janela.&lt;br /&gt;&lt;br /&gt;Pode parecer estranho no começo (eu levei um certo susto quando vi...), mas com o uso, percebe-se que esse é uma enorme vantagem do FOX. E isso ocorre o tempo inteiro; quando povoarmos nossa janela, isso ficará claro. Resumindo: não preciso ficar me preocupando em destruir um monte de objetos; eles são destruídos por seus donos.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;19&lt;/a&gt;: Cria a aplicação. Da mesma forma, chamar &lt;span style="font-family:courier new;"&gt;create()&lt;/span&gt; em um objeto FOX faz com que ele chame &lt;span style="font-family:courier new;"&gt;create()&lt;/span&gt; de todos os seus filhos, ou seja, aqui será criada (e, lembrem-se, exibida) nossa janela.&lt;br /&gt;&lt;br /&gt;&lt;a&gt;21&lt;/a&gt;: Roda a aplicação. É o &lt;span style="font-style: italic;"&gt;loop&lt;/span&gt; principal do programa, que vai ouvir e tratar eventos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Depois de compilado, basta executar. O resultado:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/Sd5EpKnEQnI/AAAAAAAAASk/2PadVxkqr5g/s1600-h/TutorialFOX.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 216px; height: 231px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/Sd5EpKnEQnI/AAAAAAAAASk/2PadVxkqr5g/s400/TutorialFOX.jpg" alt="" id="BLOGGER_PHOTO_ID_5322767283612041842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lembram do &lt;span style="font-family:courier new;"&gt;DECOR_ALL&lt;/span&gt;? Ele permite que você redimensione, minimize e maximize a janela (entre outros aspectos). Brinquem à vontade com isso. Mais tarde falaremos do poder que o FOX Toolkit oferece com relação a essas três operações.&lt;br /&gt;&lt;br /&gt;Obs.: Essa janela não está assim por causa do FOX. O FOX é responsável somente por essa área acinzentada interna. As bordas são de responsabilidade do decorador de janelas (por isso o prefixo &lt;span style="font-family:courier new;"&gt;DECOR_&lt;/span&gt;). Estou usando aqui o Emerald, o decorador de janelas para usar com o &lt;a href="http://compiz-fusion.org/"&gt;Compiz Fusion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://gia.deinf.ufma.br/%7Eedgar/ideiasFOX/2009-04-09/FoxTutorial.tar.gz"&gt;Código-fonte&lt;/a&gt; para este tutorial.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-5186612781287843330?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/5186612781287843330/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=5186612781287843330&amp;isPopup=true' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5186612781287843330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/5186612781287843330'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/tutorial-janela-simples.html' title='Tutorial: Janela simples'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_boFQgM_NDMg/Sd5EpKnEQnI/AAAAAAAAASk/2PadVxkqr5g/s72-c/TutorialFOX.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-1320439377028671521</id><published>2009-04-08T14:47:00.009-03:00</published><updated>2009-04-08T17:43:59.424-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Tutorial: Criando um projeto</title><content type='html'>&lt;div style="text-align: justify;"&gt;O propósito desse tutorial é ensinar a criar um projeto que utilize o FOX Toolkit.&lt;br /&gt;&lt;br /&gt;Vou explicar por que. Quem usa o Visual Studio precisa de uma atenção especial ao criar um projeto. Existem certas peculiaridades no processo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Criando um projeto no Visual Studio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na janela &lt;span style="font-style: italic;"&gt;New Project&lt;/span&gt;, selecione, em &lt;span style="font-style: italic;"&gt;Project Type&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Win32&lt;/span&gt;, dentro de Visual C++. Em &lt;span style="font-style: italic;"&gt;Templates&lt;/span&gt;, selecione &lt;span style="font-style: italic;"&gt;Win32 Project&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/SdzjfT05LxI/AAAAAAAAASE/uxZ-x9rz-X8/s1600-h/New+project.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 275px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/SdzjfT05LxI/AAAAAAAAASE/uxZ-x9rz-X8/s400/New+project.jpg" alt="" id="BLOGGER_PHOTO_ID_5322378986682658578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Na verdade, nada impede que você selecione &lt;span style="font-style: italic;"&gt;Win32 Console Application&lt;/span&gt;. A única diferença é que sempre que o programa rodar, vai aparecer um console, além da janela.&lt;br /&gt;&lt;br /&gt;Na próxima janela, em &lt;span style="font-style: italic;"&gt;Application Settings&lt;/span&gt;, marque a caixa "&lt;span style="font-style: italic;"&gt;Empty Project&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_boFQgM_NDMg/SdzjuAApu5I/AAAAAAAAASM/0aTPIEp_88k/s1600-h/Application+Settings.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 284px;" src="http://4.bp.blogspot.com/_boFQgM_NDMg/SdzjuAApu5I/AAAAAAAAASM/0aTPIEp_88k/s400/Application+Settings.jpg" alt="" id="BLOGGER_PHOTO_ID_5322379239061306258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Depois disso, é preciso configurar algumas opções do &lt;span style="font-style: italic;"&gt;Linker&lt;/span&gt;. Vá no menu &lt;span style="font-style: italic;"&gt;Project -&gt; Properties...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Em &lt;span style="font-style: italic;"&gt;Configuration Properties / Linker / Advanced&lt;/span&gt;, digite &lt;span style="font-family:courier new;"&gt;mainCRTStartup&lt;/span&gt; em &lt;span style="font-style: italic;"&gt;Entry Point&lt;/span&gt;. Isso fará com que o &lt;span style="font-style: italic;"&gt;linker&lt;/span&gt; utilize a função &lt;span style="font-family:courier new;"&gt;main()&lt;/span&gt;, em vez de procurar por &lt;span style="font-family:courier new;"&gt;WinMain()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_boFQgM_NDMg/SdzkBE4Gi_I/AAAAAAAAASU/UvXcydn7wR4/s1600-h/Entry+Point.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 278px;" src="http://1.bp.blogspot.com/_boFQgM_NDMg/SdzkBE4Gi_I/AAAAAAAAASU/UvXcydn7wR4/s400/Entry+Point.jpg" alt="" id="BLOGGER_PHOTO_ID_5322379566785137650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Essa configuração só é necessária quando se utiliza o Visual Studio. A próxima é necessária para todos os IDEs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic;"&gt;Linkando&lt;/span&gt; com a biblioteca FOX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Obviamente, para poder utilizar as classes do FOX Toolkit, é necessário &lt;span style="font-style: italic;"&gt;linkar&lt;/span&gt; com a biblioteca.&lt;br /&gt;&lt;br /&gt;No Visual Studio, ainda nas propriedades do projeto, na seção &lt;span style="font-style: italic;"&gt;Linker / Input&lt;/span&gt;, coloque &lt;span style="font-family:courier new;"&gt;FOX-1.6.lib&lt;/span&gt; em &lt;span style="font-style: italic;"&gt;Additional Dependencies&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Não importa qual IDE seja utilizado, é necessário configurar o projeto para &lt;span style="font-style: italic;"&gt;linkar&lt;/span&gt; com a biblioteca do FOX. Isso normalmente é feito nas propriedades do projeto. Só o que muda é que no gcc, não se coloca a extensão do arquivo nem o prefixo &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por exemplo, no &lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt; (que utiliza o gcc), basta informar &lt;span style="font-family:courier new;"&gt;FOX-1.6&lt;/span&gt;. Ao compilar o programa, o Eclipse chama &lt;span style="font-family:courier new;"&gt;g++ -lFOX-1.6&lt;/span&gt;. O próprio &lt;span style="font-family:courier new;"&gt;linker&lt;/span&gt; se encarrega de colocar o prefixo &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt; e a extensão correta.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_boFQgM_NDMg/Sdzkx4xFdmI/AAAAAAAAASc/svHPPNTuB4U/s1600-h/Eclipse.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 274px;" src="http://3.bp.blogspot.com/_boFQgM_NDMg/Sdzkx4xFdmI/AAAAAAAAASc/svHPPNTuB4U/s400/Eclipse.jpg" alt="" id="BLOGGER_PHOTO_ID_5322380405348071010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Daqui em diante, não vou mais me ater a um IDE específico. Falei sobre o Visual Studio porque ele possui essas peculiaridades, mas a partir daqui o processo é o mesmo para todo mundo.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-1320439377028671521?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/1320439377028671521/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=1320439377028671521&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/1320439377028671521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/1320439377028671521'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/tutorial-criando-um-projeto.html' title='Tutorial: Criando um projeto'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_boFQgM_NDMg/SdzjfT05LxI/AAAAAAAAASE/uxZ-x9rz-X8/s72-c/New+project.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-3523617275939036920</id><published>2009-04-07T18:01:00.006-03:00</published><updated>2009-04-08T17:34:22.944-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutoriais'/><category scheme='http://www.blogger.com/atom/ns#' term='básico'/><title type='text'>Tutorial: Configurando o FOX</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Download&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O FOX Toolkit encontra-se disponível para download no endereço &lt;a href="http://www.fox-toolkit.org/download.html"&gt;www.fox-toolkit.org/download.html&lt;/a&gt;. Há sempre quatro versões disponíveis:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Development snapshot&lt;/span&gt; (a versão mais atual disponível - também conhecido como &lt;span style="font-style: italic;"&gt;bleeding edge&lt;/span&gt;)&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Development&lt;/span&gt; (versão em desenvolvimento)&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Stable&lt;/span&gt; (versão estável)&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Old stable&lt;/span&gt; (versão estável anterior)&lt;br /&gt;&lt;br /&gt;Todas as versões estão disponíveis em dois pacotes diferentes: &lt;span style="font-family:courier new;"&gt;.zip&lt;/span&gt; para Windows e &lt;span style="font-family:courier new;"&gt;.tar.gz&lt;/span&gt; para Unix/Linux. Apesar disso, o conteúdo de ambos é exatamente o mesmo. Quem faz a diferença é a preferência do usuário.&lt;br /&gt;&lt;br /&gt;O mais recomendado para os usuários comuns/finais é baixar a versão estável. A versão em desenvolvimento é para quem deseja testar &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt;, enquanto o &lt;span style="font-style: italic;"&gt;snapshot&lt;/span&gt; é a versão que está em desenvolvimento ativo, ou seja, é indicada para quem quer contribuir com o FOX ajudando no desenvolvimento.&lt;br /&gt;&lt;br /&gt;Bom, depois de baixado, descompacte no local desejado, e aqui o processo se bifurca entre os usuários Windows e Linux (são os dois sistemas para os quais posso dar suporte).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Windows&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A configuração do FOX Toolkit no Windows que será explicada aqui refere-se ao uso com o Microsoft Visual Studio 2005. Para quem utiliza o &lt;a href="http://www.mingw.org/"&gt;MinGW/MSYS&lt;/a&gt; ou &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; (ambos &lt;span style="font-style: italic;"&gt;ports&lt;/span&gt; do gcc para Windows), as instruções são semelhantes à configuração no Linux.&lt;br /&gt;&lt;br /&gt;Eu normalmente recomendo descompactar em &lt;span style="font-family:courier new;"&gt;C:\&lt;span style="font-family:verdana;"&gt;,&lt;/span&gt;&lt;/span&gt; porque o acesso é mais rápido. &lt;span style="font-family:courier new;"&gt;C:\Arquivos de programas&lt;/span&gt; também é interessante, pois algumas bibliotecas que têm instalador vão pra lá; colocar o FOX Toolkit junto delas fica mais organizado. Utilizarei a notação &lt;span style="font-family:courier new;"&gt;FOX_DIR&lt;/span&gt; para me referir ao diretório onde foi descompactado o arquivo.&lt;br /&gt;&lt;br /&gt;Em &lt;span style="font-family:courier new;"&gt;FOX_DIR\windows\vcpp&lt;/span&gt; existe um &lt;span style="font-style: italic;"&gt;workspace&lt;/span&gt; do MSVC 6.0 (o antigão mesmo) chamado &lt;span style="font-family:courier new;"&gt;win32.dsw&lt;/span&gt;. Abra esse arquivo. Se você usa uma versão posterior, ele vai perguntar se deseja converter para a versão mais nova (que nem se chama mais &lt;span style="font-style: italic;"&gt;Workspace&lt;/span&gt;, mas &lt;span style="font-style: italic;"&gt;Solution&lt;/span&gt;; entretanto, vou utilizar aqui o termo &lt;span style="font-style: italic;"&gt;workspace&lt;/span&gt;, pois estou acostumado a ele e por ser o termo utilizado pela maiorias das IDEs). Apenas diga que sim, tanto para o &lt;span style="font-style: italic;"&gt;workspace&lt;/span&gt; em si como para todos os projetos que estão dentro dele.&lt;br /&gt;&lt;br /&gt;Neste &lt;span style="font-style: italic;"&gt;workspace&lt;/span&gt;, há um projeto chamado "fox". Clique com o botão direito sobre ele e selecione "&lt;span style="font-style: italic;"&gt;Set as Startup Project&lt;/span&gt;". Depois mude a configuração de &lt;span style="font-style: italic;"&gt;Debug&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;Release&lt;/span&gt; e mande construir a biblioteca em &lt;span style="font-style: italic;"&gt;Build -&gt; Build fox&lt;/span&gt;. Aguarde um momento enquanto a biblioteca é compilada; não demora muito.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SdvB3vqu5HI/AAAAAAAAAR0/jwxTu49C61E/s1600-h/fox-solutions.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 236px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SdvB3vqu5HI/AAAAAAAAAR0/jwxTu49C61E/s400/fox-solutions.jpg" alt="" id="BLOGGER_PHOTO_ID_5322060548101039218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Será então criado um arquivo chamado &lt;span style="font-family:courier new;"&gt;FOX-1.6.lib&lt;/span&gt; em &lt;span style="font-family:courier new;"&gt;FOX_DIR\lib.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora é preciso configurar os diretórios de &lt;span style="font-family:courier new;"&gt;include&lt;/span&gt; e &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt;, para que o Visual Studio ache os arquivos de cabeçalho do FOX e a biblioteca. Essa é uma parte que eu acho chata quando se usa o Visual Studio, tem que informar quais são os diretórios.&lt;br /&gt;&lt;br /&gt;Vá em &lt;span style="font-style: italic;"&gt;Tools -&gt; Options...&lt;/span&gt; e selecione "&lt;span style="font-style: italic;"&gt;VC++ Directories&lt;/span&gt;" dentro de "&lt;span style="font-style: italic;"&gt;Projects and Solutions&lt;/span&gt;". Configure os diretórios conforme as figuras abaixo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_boFQgM_NDMg/SdvDBl-qnsI/AAAAAAAAAR8/xolUUwuDVh4/s1600-h/options-include-library.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 114px;" src="http://2.bp.blogspot.com/_boFQgM_NDMg/SdvDBl-qnsI/AAAAAAAAAR8/xolUUwuDVh4/s400/options-include-library.jpg" alt="" id="BLOGGER_PHOTO_ID_5322061816810610370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notem que eu destaquei também o &lt;a href="http://sourceforge.net/projects/opencvlibrary/"&gt;OpenCV&lt;/a&gt; (&lt;span style="font-style: italic;"&gt;Open Source Computer Vision Library&lt;/span&gt;). Essa é uma biblioteca que vem com um instalador para Windows, e se instala em Arquivos de Programas (apenas uma curiosidade).&lt;br /&gt;&lt;br /&gt;Pronto! O Visual Studio está configurado para a programação com FOX Toolkit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Linux&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para quem usa Linux, descompacte de preferência em um diretório sem espaços e de fácil acesso pelo terminal. A instalação é a padrão:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ ./configure&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ make&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isso é o suficiente para começar a usar o FOX Toolkit no Linux. Os arquivos se espalham por &lt;span style="font-family:courier new;"&gt;/usr/local&lt;/span&gt; (&lt;span style="font-family:courier new;"&gt;include&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;bin&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;man&lt;/span&gt; etc.). Como é um diretório padrão, o gcc encontra os cabeçalhos e bibliotecas naturalmente.&lt;br /&gt;&lt;br /&gt;Obs.: Ao contrário do que ocorre no Visual Studio, compilar o FOX com gcc demora bastante...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-3523617275939036920?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/3523617275939036920/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=3523617275939036920&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3523617275939036920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3523617275939036920'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/tutorial-configurando-o-fox.html' title='Tutorial: Configurando o FOX'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_boFQgM_NDMg/SdvB3vqu5HI/AAAAAAAAAR0/jwxTu49C61E/s72-c/fox-solutions.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-4302662156500961502</id><published>2009-04-06T15:25:00.004-03:00</published><updated>2009-04-08T16:01:44.334-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dúvidas'/><title type='text'>Dúvida: Designer</title><content type='html'>Uma dúvida bastante freqüente quando se fala em bibliotecas de interface gráfica é se elas possuem um editor visual. Com relação ao FOX Toolkit, a resposta é não. Pelo menos não algum que possa ser realmente utilizado.&lt;br /&gt;&lt;br /&gt;Isso pode ser um balde de água fria (principalmente considerando que esse é o nosso segundo post), mas creio que é algo que deva ser dito com antecedência.&lt;br /&gt;&lt;br /&gt;Para explicar a ausência de uma ferramenta desse tipo, as palavras de Jeroen van der Zijp, o próprio idealizador do FOX:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Sem dúvida, desenho de interface WYSIWYG (&lt;span style="font-style: italic;"&gt;What You See Is What You Get&lt;/span&gt; - O que você vê é o que você tem) é legal. Mas eu suspeito que há motivos para que nenhum projeto de construtor de interface tenha sido levado a cabo até agora:&lt;br /&gt;&lt;br /&gt;1) A construção de componentes do FOX Toolkit é feita com C++ bem compacto.&lt;br /&gt;&lt;br /&gt;Já que isso é feito dentro de seu ambiente de edição confortável, cortar e colar código é mais rápido que devanear pela tela.&lt;br /&gt;&lt;br /&gt;Pelo menos é isso que eu faço. Todos os meus menus são copiados e modificados a partir do primeiro que eu digitei. Quero apostar que posso fazer isso mais rápido em meu editor que abrir um construtor de interface, carregar um arquivo que descreve a interface, sair clicando com o mouse e escrever o arquivo de volta.&lt;br /&gt;&lt;br /&gt;2) Muitos usuários do FOX Toolkit vêm de ambientes onde colocação programática e gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; eram a norma.&lt;br /&gt;&lt;br /&gt;Colocar componentes usando gerenciadores aninhados requer um pouco mais de planejamento que desenhar interativamente na tela; entretanto, eu arrisco dizer que também leva a interfaces melhores.&lt;br /&gt;&lt;br /&gt;Diálogos redimensionáveis são bem fáceis quando se usam gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, e um desenhista de interface competente determinará que controles podem tirar vantagem desta capacidade de desenhar e acordo.&lt;br /&gt;&lt;br /&gt;Como contra-exemplo, pense na minúscula caixa de texto onde você é forçado a informar suas opções de compilador no Visual Studio.&lt;br /&gt;&lt;br /&gt;Então há a habilidade de mudar tamanhos de fonte, conteúdo de rótulos (&lt;span style="font-style: italic;"&gt;labels&lt;/span&gt;), e ícones. Gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; automaticamente se recalculam baseados em seu conteúdo, e então mudar fontes ou legendas nos botões não requer nenhum redesenho ou devaneio com um construtor de interface.&lt;br /&gt;&lt;br /&gt;Este recurso também será muito útil quando programadores passarem para outra linguagens.&lt;br /&gt;&lt;br /&gt;3) A interface é apenas uma pequena parte de um projeto de programação típico.&lt;br /&gt;&lt;br /&gt;Se você puder construir um controle de interface em uma única linha de código, mas gasta dúzias de linhas tratando sua funcionalidade na aplicação, você não economizou trabalho algum só por eliminar essa única linha.&lt;br /&gt;&lt;br /&gt;É melhor tentar eliminar essas dúzias de outras linhas.&lt;br /&gt;&lt;br /&gt;E é exatamente isso o que fazemos no FOX Toolkit por meio do FXDataTarget e a capacidade de interconexão entre componentes para reduzir a quantidade de "cola" entre os componentes e aquilo que eles controlam.&lt;br /&gt;&lt;br /&gt;4) As tentativas até agora não suportaram a evolução a longo prazo das interfaces.&lt;br /&gt;&lt;br /&gt;Vamos encarar, nenhum programa começa com a interface toda em sua forma final. Se uma ferramenta de design não provê suporte para toda a duração do projeto, realmente não será extremamente útil.&lt;br /&gt;&lt;br /&gt;Em particular, deve suportar a modificação de &lt;span style="font-style: italic;"&gt;design&lt;/span&gt; de interfaces que já estão enganchadas a funcionalidades da aplicação.&lt;br /&gt;&lt;br /&gt;5) Usar interfaces criadas programaticamente, junto com gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, torna fácil criar blocos de controles de interface dirigidos por dados.&lt;br /&gt;&lt;br /&gt;Misturar controles gerados por construtores de interface com controles programáticos pode ser difícil devido à rigidez das posições no código gerado pelo construtor de interface.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta não é uma desculpa para a falta de um &lt;span style="font-style: italic;"&gt;designer&lt;/span&gt; de interface para o FOX Toolkit, mas uma análise justa dos fatos, pelo menos como eu os vejo.&lt;br /&gt;&lt;br /&gt;Eu gosto do conceito de Construtores de Interface, mas eu provavelmente teria que admitir que eu mesmo preferiria não me importar em usá-los para meus próprios projetos mesmo se existissem, devido ao efeito bem marginal [e possivelmente até negativo!] em minha produtividade.&lt;br /&gt;&lt;br /&gt;Eu já usei construtores de interface e o conhecimento adquirido dessa experiência é que eu fico muito feliz em fazer desenhos com essas ferramentas, mas não consigo muito no sentido de trabalho real.&lt;/blockquote&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Esta dúvida foi retirada da lista de &lt;span style="font-style: italic;"&gt;e-mails&lt;/span&gt; de usuários do FOX Toolkit. Leia a conversa toda &lt;a href="http://www.nabble.com/Designer-td2848627.html"&gt;aqui&lt;/a&gt; (em inglês).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-4302662156500961502?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/4302662156500961502/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=4302662156500961502&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4302662156500961502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/4302662156500961502'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/duvida-designer.html' title='Dúvida: Designer'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4011251917444130390.post-3310866293831143057</id><published>2009-04-03T11:44:00.001-03:00</published><updated>2009-04-08T16:00:23.980-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sobre'/><title type='text'>O que é o FOX Toolkit?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;FOX&lt;/span&gt; é um &lt;span style="font-style: italic;"&gt;toolkit&lt;/span&gt; em C++ para desenvolvimento fácil e efetivo de Interfaces Gráficas de Usuário (GUI - &lt;span style="font-style: italic;"&gt;Graphical User Interface&lt;/span&gt;). Oferece uma coleção ampla e crescente de controles, e provê o estado da arte em facilidades como arrastar e soltar, seleção, assim como &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; &lt;a href="http://www.opengl.org/"&gt;OpenGL&lt;/a&gt; para manipulação de gráficos 3D. FOX também implementa ícones, imagens e recursos de conveniência como ajuda na barra de status e dicas de ferramentas. Dicas de ferramentas podem ser usadas até em objetos 3D!&lt;br /&gt;&lt;br /&gt;Uma importância considerável é dada para fazer do FOX um dos mais rápidos &lt;span style="font-style: italic;"&gt;toolkits&lt;/span&gt; disponíveis, e para minimizar o uso de memória: o FOX Toolkit utiliza técnicas para acelerar o desenho da interface. A memória é conservada ao permitir que os programadores criem e destruam elementos da interface sob demanda (&lt;span style="font-style: italic;"&gt;on the fly&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Apesar de o FOX Toolkit já oferecer uma ampla coleção de controles, o FOX alavanca o C++ para permitir aos programadores construírem controles e elementos de interface adicionais, simplesmente pegando controles existentes e criando classes derivadas que simplesmente adicionam ou redefinem o comportamento desejado.&lt;br /&gt;&lt;br /&gt;Um dos objetivos cordiais do projeto do FOX Toolkit é a facilidade de programação; dessa forma, a maioria dos controles pode ser criada usando uma única linha de código C++; a maioria dos parâmetros têm valores sensatos, que podem ser omitidos, e os gerenciadores de &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;layout managers&lt;/span&gt;) asseguram que os desenhistas de interface não precisem se preocupar com alinhamentos precisos.&lt;br /&gt;&lt;br /&gt;Outro recurso legal do FOX Toolkit que reduz significativamente o número de linhas de código que devem ser escritas é a sua habilidade de ter &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; conectados entre si, e de passar certos comandos entre eles; por exemplo, um item de menu "Esconder barra de ferramentas" pode ser diretamente conectada à barra de ferramentas, fazendo com que fique oculta.&lt;br /&gt;&lt;br /&gt;Finalmente, o FOX Toolkit deixa fácil manter o estado da interface de uma aplicação fazendo que os elementos atualizem-se automaticamente, perguntando o estado da aplicação. Este recurso elimina um grande esforço que pode passar por sensibilizar, desativar, marcar/desmarcar etc. dependendo do estado da aplicação.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;FOX é Independência de Plataforma!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A lista de plataformas está crescendo! Atualmente, temos o FOX Toolkit rodando em um grande número de sistemas operacionais, desde o Linux, FreeBSD, SGI IRIX, HP-UX, IBM AIX, SUN Solaris, DEC/Compaq Tru64 UNIX, até sistemas operacionais MS-Windows como Windows9x, Windows NT, Windows ME e Windows 2000. Como a maioria da implementação do FOX Toolkit é completamente inconsciente da plataforma subjacente (em muitos casos nem inclui arquivos de cabeçalho), as aplicações funcionam praticamente de forma idêntica em todas essas plataformas.&lt;br /&gt;&lt;br /&gt;Por exemplo, &lt;a href="http://www.fox-toolkit.org/art/wintextedit.png"&gt;aqui&lt;/a&gt; é a aplicação de amostra do FOX textedit rodando sob Windows NT. E &lt;a href="http://www.fox-toolkit.org/art/sgitextedit.png"&gt;aqui&lt;/a&gt; é a mesma aplicação rodando em um sistema &lt;a href="http://www.sgi.com/"&gt;Silicon Graphics&lt;/a&gt; Octane.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Texto traduzido da página oficial. Leia o original &lt;a href="http://www.fox-toolkit.org/home.html"&gt;aqui&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4011251917444130390-3310866293831143057?l=ideiasfox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ideiasfox.blogspot.com/feeds/3310866293831143057/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4011251917444130390&amp;postID=3310866293831143057&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3310866293831143057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4011251917444130390/posts/default/3310866293831143057'/><link rel='alternate' type='text/html' href='http://ideiasfox.blogspot.com/2009/04/o-que-e-o-fox.html' title='O que é o FOX Toolkit?'/><author><name>Edgar Diniz</name><uri>http://www.blogger.com/profile/16414842873992464892</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_boFQgM_NDMg/SdYQacC6w2I/AAAAAAAAAQE/dPWUTR1in9g/S220/Edgar.jpg'/></author><thr:total>1</thr:total></entry></feed>
