domingo, 18 de julho de 2021

MFC - Retornando string e calculando IMC




Todos sabemos que uma string em C,
é um vetor de caracteres, ou de bytes
como muitos preferem dizer.
O estudante de C deve entender que o C
não verifica limites de variáveis
ou de matrizes em tempo de execução
cabe a nós, reservar um byte a mais no 
fim da string, para o terminador null.
Quando precisamos retornar uma string
de uma função em C, O modo mais correto 
é alocar memória para a variável que 
receberá a string na própria função,
e ainda não devemos esquecer de fazer
a liberação com free no final.
Neste exemplo estamos retornando algumas
frases uma por vez ao usuário do programa,
e apesar dos poucos caracteres retornados,
que não chega a 40 bytes decidimos
por sugestão do VS alocar memória para
a variável que retornará o ponteiro 
para a função chamada.

O assunto sobre alocação de memória em C
é muito amplo, e um tanto complexo e enfadonho,
e geralmente polêmicos, porque teríamos que 
compreender perfeitamente o que são ( stack e heap ),
e como utilizá-los e isto deixaria o post muito longo.
Em algumas outras linguagens por onde passei,
umas (três ou quatro) e que possuo conhecimentos
básicos, ou intermediários, nós conhecemos o 
tipo string de uma classe string,
com seus métodos e membros prontos que ajuda muito
os programadores, mas mesmo assim ainda acho que
o C é uma ótima linguagem de programação para início.
Neste nosso caso se o retorno indicado pela função 
não tivesse sido feito, certamente
teríamos alguns erros desagradáveis,
mas na verdade isto nem chega a acontecer
porque nem a IDE, e nem muito menos 
o compilador permitiria esta ação.
Devemos assumir que aprender
programação nos dias de hoje, 
com os avanços das ferramentas que
monitora cada palavra digitada por
nós no editor de texto corrigindo 
síntaxe, oferecendo sugestões,
fazendo lembretes de ponto e vírgulas,
esquecidos, tipos de retorno errado,
ou retorno feito em funções void,
ficou muito mais fácil.
Mas nem sempre foi assim, o bloco de notas
e uma linha de comando era tudo o que
muitos tiveram no começo, e foram
com isto que formaram o que temos hoje.
Para este programa simples poderíamos
criá-lo no console do windows,
mas como tive tempo suficiente resolvi
criá-lo para rodar numa interface gráfica 
do MFC, caixa de diálogo para ser mais claro.
Hoje com o pouco de conhecimento que adiquerimos
poderíamos fazê-lo rodar numa interface gráfica
do Wind 32, C#, C++ com o Qt, C++ com o C++ Builder,
C++ com .Net (CLI), mas preferi fazê-lo em MFC.
Se precisarem de alguma ajuda e se estiver
nos meus alcances com certeza ajudarei.
Assistam o vídeo por favor.






//=========================================================================
void CCalculandoIMCDlg::Informe ( ) {

    CDC* pDC = GetDC ( );

    CFont font;
    VERIFY ( font.CreateFont (
        18,                       // nHeight
        0,                        // nWidth
        0,                        // nEscapement
        0,                        // nOrientation
        FW_NORMAL,                // nWeight
        TRUE,                    // bItalic
        FALSE,                    // bUnderline
        0,                        // cStrikeOut
        ANSI_CHARSET,             // nCharSet
        OUT_DEFAULT_PRECIS,       // nOutPrecision
        CLIP_DEFAULT_PRECIS,      // nClipPrecision
        DEFAULT_QUALITY,          // nQuality
        DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
        _T ( "Times New Roman" ) ) );
    pDC->SelectObject ( font );

    CPen PenBlack ( PS_SOLID, 3RGB ( 000 ) );
    //CBrush BrushAqua ( RGB ( 255, 0, 255 ) );

    pDC->SelectObject ( PenBlack );
    //pDC->SelectObject ( BrushAqua );
    pDC->RoundRect ( CRect ( 197275355235 ), CPoint ( 88 ) );

    pDC->SetTextColor ( RGB ( 25500 ) );
    pDC->TextOut ( 205240L"Por: " );
    pDC->SetTextColor ( RGB ( 000 ) );
    pDC->TextOut ( 235240L"Samuel Lima " );
    pDC->SetTextColor ( RGB ( 00255 ) );
    pDC->TextOut ( 205255L"sa_sp10@hotmail.com" );
}
//=========================================================================
//Criando uma moldura em MFC
void CCalculandoIMCDlg::OnDraw ( CDC* pDC ) {
    CPen PenBlue ( PS_SOLID, 10RGB ( 00255 ) );
    pDC->SelectObject ( PenBlue );
    pDC->RoundRect ( CRect ( 55545290 ), CPoint ( 1010 ) );
}
//=========================================================================

sábado, 10 de julho de 2021

C++ / CLI - Pares e ímpares em matriz de inteiros

Se seu visual studio tem as ferramentas para programar
em C++/CLI, abra-o imediatamente e crie um novo projeto,
Selecionando: Projeto CLR Vazio (.NET Framework).
Se seu visual studio não tem estes recursos instalados,
mas você tem interesse em conhece-los, instale-os
agora mesmo, se não sabe como fazer, Podemos te ajudar.

Este programa faz leitura de uma matriz nativa do C,
e marca em highlighter todos os números pares e ímpares,
em duas cores diferentes e sua impressão é numa janela gráfica 
criada em .NET com C++/CLI, sei que muitos vão me criticar
mas não me importo, eu gosto do .NET mesmo.
"VIVA O .NET E VIVA O C++" 



            /*============================================================*/
            void Cria_Moldura ( PaintEventArgse ) {
                Graphics^ g = e->Graphics;
                Image^ imagem_1 = Image::FromFile ( "C:\\Users\\Olilim\\Downloads\\" +
                    "Dez_Mil_Inteiros_Em_DrawString\\Debug\\Moldura_1.bmp" );
                g->DrawImage ( imagem_1, 00 );
            }
            /*============================================================*/
            void FlowLayoutPanel_1 ( int Xint Yint Wint H ) {
                //this->flowLayoutPanel1->AutoSize = true;
                this->flowLayoutPanel1->AutoScrollMinSize = System::Drawing::Size ( 40020100 );
                this->flowLayoutPanel1->Font = ( gcnew System::Drawing::Font ( L"Times New Roman",
                    10.25FSystem::Drawing::FontStyle::Italic, System::Drawing::GraphicsUnit::Point,
                    static_castSystem::Byte >( 0 ) ) );
                this->flowLayoutPanel1->ForeColor = System::Drawing::Color::Black;
                this->flowLayoutPanel1->BackColor = System::Drawing::Color::White;
                this->flowLayoutPanel1->Location = System::Drawing::Point ( X, Y );
                this->flowLayoutPanel1->Name = L"flowLayoutPanel1";
                this->flowLayoutPanel1->Size = System::Drawing::Size ( W, H );
                this->flowLayoutPanel1->TabIndex = 0;
            }
            /*============================================================*/
        private: System::Void MyForm_Paint ( System::Object^ sender, 
        System::Windows::Forms::PaintEventArgs^ e ) {
            Cria_Moldura ( e );

            SolidBrush^ textBrushA = gcnew SolidBrush ( Color::Red );
            SolidBrush^ textBrushB = gcnew SolidBrush ( Color::Black );

            Graphics^ g = e->Graphics;
            System::Drawing::Font^ textFont = ( gcnew System::Drawing::Font ( L"Times New Roman",
                12static_castSystem::Drawing::FontStyle >( ( System::Drawing::FontStyle::Bold |
                    System::Drawing::FontStyle::Italic ) ),
                System::Drawing::GraphicsUnit::Point, static_castSystem::Byte >( 0 ) ) );
            g->DrawString ( "C++ / CLI - PARES E ÍMPARES EM MATRIZ DE INTEIROS",
                textFont, textBrushA, 8010 );     
            g->DrawString ( "Por:", textFont, textBrushA, 240265 );
            g->DrawString ( "Samuel Lima", textFont, textBrushB, 280265 );
        }
               /*============================================================*/