logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

Explicando a sopa de letrinhas da programação C/C++ para Windows: MFC

Outros posts dessa mesma série:   Win32     COM     ATL

MFC: A Microsoft Foundation Classes é um framework e uma biblioteca de classes C++ que encapsula grande parte da API Win32. Ela foi criada pela Microsoft para facilitar a programação em Win32 usando C++, já que a API Win32 é exportada como funções C. Ela é um framework no sentido de que todos os aplicativos MFC devem "se encaixar" nesse framework de alguma forma, seguindo certos requisitos. Ela não foi feita para ser incluída em um projeto só para usar algumas classes, como é o caso do WTL (eu falarei de WTL em outro post).

Como um trecho de código vale mais do que 2 + 2 palavras, vamos à ele:

#include <afxwin.h>

//
// Minha janela principal
//
class CMyWindow : public CFrameWnd
{
private:
  CButton m_btnTest;

  DECLARE_MESSAGE_MAP();

public:
  //
  // essa função não é da MFC, eu a criei para inicializar meus 
  // controles daqui
  //
  BOOL InitializeControls()
  {
    m_btnTest.Create("blah",BS_PUSHBUTTON , CRect(10,10,100,60),this, 1);
    m_btnTest.ShowWindow(SW_SHOW);

    return TRUE;
  }

  //
  // função que trata o evento de clique do botão
  //
  LRESULT OnButtonTestClick()
  {
    AfxMessageBox("button click!");
    return 0;
  }

  //
  // evento de duplo click
  //
  LRESULT OnLButtonDblClk(UINT, CPoint)
  {
    AfxMessageBox("dbl click!");
    return 0;
  }

  //
  // evento de resize
  //
  LRESULT OnSize(UINT nType, int cx, int cy)
  {
    CString str;

    //
    // vamos colocar a nova altura e largura como título
    // da janela
    //
    str.Format("largura: %d, altura:%d", cx, cy);

    SetWindowText(str);

    return 0;
  }
};

//
// mapa de mensagens da classe CMyWindow
// aqui colocamos de modo declarativo qual evento será
// tratado por qual função
//
BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd)
  ON_BN_CLICKED(1, OnButtonTestClick)
  ON_WM_LBUTTONDBLCLK()
  ON_WM_SIZE()
END_MESSAGE_MAP( )

//
// classe que representa a aplicação em si,
// herda de CWinApp
//
class CMyApp : public CWinApp
{
  //
  // Função chamada pela MFC assim que o aplicativo é
  // inicializado. Coloque aqui o que seria colocado
  // no WinMain
  //
  BOOL InitInstance()
  {
    CMyWindow* pMyWindow = new CMyWindow;

    //
    // vamos criar nossa janela e mostrá-la
    //
    pMyWindow->Create(NULL, "www.1bit.com.br");

    pMyWindow->InitializeControls();
    pMyWindow->ShowWindow(SW_SHOW);
    pMyWindow->UpdateWindow();

    m_pMainWnd = pMyWindow;

    return TRUE;
  }
};


CMyApp theApp;

A MFC é a principal biblioteca de classes para C++ da Microsoft. Ela vem junto com o Visual C++, e a IDE tem total suporte para ela, facilitando a nossa vida com wizards e "clique com o botão direito e...". Fazer um "Dialog Application" usando MFC e o Visual C++ é quase tão fácil quanto fazer um programa em VB (meus alunos de C++ disseram isso). Como no VB, você desenha um botão visualmente, dá um duplo clique no botão criado e a MFC cria um handler para o evento de clique do botão. Além disso, a MFC contém diversas macros e funções para associar variáveis com controles Win32. Esse recurso é chamado de DDX, e é muito útil para formulários cheios de CheckBoxes e TextBoxes. Eu acho esse um dos recursos mais úteis da MFC, e reduz bastante o tempo de desenvolvimento de programas com essas características.

A MFC também tem suporte à bancos de dados ODBC ou OLEDB. No caso de OLEDB, um wizard cria classes com propriedades (variáveis membro) equivalentes aos campos do banco de dados. Mas o grande destaque da MFC é "Document/View Model", que provê um framework para aplicativos que usam o conceito de documento (como o Word, CorelDRAW!, etc). Junto com o suporte a serialização, fica bem mais fácil fazer um aplicativo de edição de documentos com open/save, área de transferência e várias views de um mesmo documento.

A MFC é bastante criticada por não usar recursos modernos do C++ e não ser totalmente type-safe. Apesar das melhorias no quesito type-safe a partir da MFC 7, as críticas ainda persistem. Apesar de tudo isso, a MFC ainda é muito usada, e é possível achar muita informação sobre ela na Internet. A literatura é vasta e existem diversos sites com seções especializadas em MFC (como o Code Project e o Code Guru). Muitas empresas (inclusive brasileiras) desenvolvem aplicativos em MFC, e a finada certificação "Developing Desktop Applications Using Microsoft Visual C++" era toda sobre MFC.

Usando a MFC você tem a opção de fazer um link estático com a MFC ou usar a MFC em uma DLL (de aproximadamente 1 MB). No exemplo de código acima, o link estático fez o executável ficar com 100kb a mais, mas eu já vi casos onde o executável fica 300kb maior - o que em muitas situações é desprezível.

Mais informações

Documentação da MFC na MSDN
Hierarquia de classes da MFC
Code Project
Livros sobre MFC na Amazon


Em 23/08/2005 17:51, por Rodrigo Strauss


  
 
 
Comentários
Everton Paulo | e-mail | em 09/09/2005 | #
Gostaria que voçês me mandasem um e mail falando mais sore programação em c c++.
Evaristo Tone | e-mail | em 13/10/2005 | #
Muito bem Rodrigo!!!

Eu começava a programar em C, contudo, gostaria de pedir-te se é possível mandares-me uns bons links para iniciantes em C/C++ e Win32.

Obs: Estou a começar a programar em PHP, estou a achar interessante, contudo, acho-o um pouco condicionado a web, eu quero uma linguagem poderosa como o C, onde por exemplo posso modificar o meu sistema operativo e coisas assim...


Obs2: Podes mandares-me uma dica de como resolver o problema da tela azul do windows sem formatar o disco... :)
Obrigado por tudo, sobretudo, pelas tuas contribuições para o avanço da ciência!!

Evaristo, um abraço meu e de Angola inteira pra você:)
Rodrigo Strauss | website | em 13/10/2005 | #
Dê uma olhada em http://www.1bit.com.br/content.1bit/weblog/faq_win32
Mi | e-mail | em 22/10/2005 | #
program eu;
uses crt;
var
aaz:string;
begin
clrscr;
writeln(' Nossa... Rodrigo vc é evoluido hein!!! Eu que tô começando só sei do Turbo Pascal... i vc nem "fala dele"... coitado, eu digo di mim i du Pascal... i agora thauzim q eu tenho q estudar i muituuuu... um dia eu chego lá. Adolei seu site :-) Bom, pra mim vai ser muito útil ');
readln(aaz);
readkey;
end.
marcio luiz | e-mail | em 05/06/2006 | #
Vc tem alguma coisinha sobre framework?
Marcelo | em 11/11/2007 | #
Até quando a Microsoft vai manter a MFC. Será que ela vai ser descontinuada ... ???
Rodrigo Strauss | website | em 20/11/2007 | #
Não será não. Inclusive, a nova versão está cheia de novidades...
Marcelo | e-mail | em 24/11/2007 | #
Ola Rodrigo!
Que bom que a MFC não será descontinuada. Trabalho algum tempo com o Delphi e não tenho nada a reclamar dele. Só que agora eu quero migrar todos os meus programas para o Visual C++ e achei legal usar a MFC. Leio os seus artigos e, também não consigo ser apenas um programador de cadastros. Preciso ir além!
Estou começando com a MFC, depois vou dar uma olhadinha do WTL e no wxWidgets ... Você acha que estou no caminho certo ?

Rodrigo | website | e-mail | em 01/05/2008 | #
já tenho noção de programação e sou um dos maiores fãs de c++, ahhhh como eu queria me interessar por programação no tempo do DOS e Win 3.11, hoje estaria no topo do conhecimento, mas deixando de sonhar um pouco, voltei a programar novamente, mas não em Delphi e VB mas sim C++, com total interesse em Win32, passei 4 dias pra terminar meu programa de mudar papel de parede criado com o objeto IActiveDesktop e foi o maior sucesso..rsrs, a dificuldade toda é que a microsoft MSDN não colocou uma simples linha de código que precede o CoCreateInstance, e meu programa ia ler o setor zero da memórioa, e desanimado vi uma tag no debug "CoInitialize não inicializado"...kkkkk que bug de otário, em breve esse programinha vai entrar na inicialização de cada computador da minha lanhouse.

Não esquecendo a dica do amigo strauss, de colocar um L"sstr" precedendo a funções que pedem ponteiro para string e o L transforma a string numa macro ou sei lá o q como strauss fala num de seus artigos

Em breve mais notícias
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::