Página 1 de 1

Ajuda com Hello World

MensagemEnviado: 02 Set 2016 09:33
por denis
Bom dia pessoal,

Estou tentando alterar um programa em C/C++ utilizando Win32 API, minhas dúvidas são:

Colocar uma rotina no loop principal para enviar/receber dados da serial, estou acostumado em C
onde coloco tudo na "main" com um laço. Coloquei um breakpoint dentro do "while" e ele só acontece quando tenho
alguma atividade na minha janela, como fazer isso rodar constantemente?

Gostaria de atualizar a mensagem impressa, preciso criar um novo case na função "WndProc"? Como fazer isso?

Código: Selecionar todos
#include <windows.h>

const char g_szClassName[] = "myWindowClass";
LPSTR TextArray[] =    { "Hello World" };

// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            TextOutA(hdc, 10, 10, TextArray[0], 5);
            EndPaint(hwnd, &ps);
        }
        break;

        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    static HWND hwnd;
    MSG Msg;
    static uint8_t count = 0;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
       MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
       return 0;
    }

    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

      // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}



Qualquer ajuda é bem vinda.
Denis

Re: Ajuda com Hello World

MensagemEnviado: 02 Set 2016 12:13
por andre_luis
Não está bem claro qual o compilador/IDE que voce tá usando, mas quando mexi com o Borland Builder, usava uma thread que ficava constantemente monitorando o buffer de recepção. Na verdade, como era dificil manipular esse buffer, coloquei o tamanho dele sendo = 1.

Re: Ajuda com Hello World

MensagemEnviado: 02 Set 2016 13:28
por denis
Andre,

A rotina que envia/recebe dados da serial eu ja tenho pronta, eu queria saber onde colocar neste programa.
Precisava de algo que fica checando constantemente.

Re: Ajuda com Hello World

MensagemEnviado: 02 Set 2016 14:58
por EDSONCAN
Não entendi o motivo dessas chaves:
cpp code
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOutA(hdc, 10, 10, TextArray[0], 5);
EndPaint(hwnd, &ps);
}
break;


Em visualbasic uso um timer para ficar checando..

Characteristics of a Timer
The timer in VCL applications is made available through the TTimer class. To add it to your application at design time, from the System property page of the Component Palette, click Timer and click on the form......

Re: Ajuda com Hello World

MensagemEnviado: 02 Set 2016 15:52
por andre_luis
denis escreveu:A rotina que envia/recebe dados da serial eu ja tenho pronta, eu queria saber onde colocar neste programa.
Precisava de algo que fica checando constantemente.


Então, se voce colocar numa thread em separado, qualquer pooling em loop infinito não vai impactar no programa principal, que por sua vez apenas verificaria o status do flag de "pacote recebido" e leria o conteudo salvo, obviamente ressetando esse flag após a leitura.

Re: Ajuda com Hello World

MensagemEnviado: 02 Set 2016 20:21
por barboza
EDSONCAN escreveu:Não entendi o motivo dessas chaves:
cpp code
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOutA(hdc, 10, 10, TextArray[0], 5);
EndPaint(hwnd, &ps);
}
break;




Para criar a variável local ps.

Re: Ajuda com Hello World

MensagemEnviado: 03 Set 2016 16:40
por denis
andre_teprom escreveu:
denis escreveu:A rotina que envia/recebe dados da serial eu ja tenho pronta, eu queria saber onde colocar neste programa.
Precisava de algo que fica checando constantemente.


Então, se voce colocar numa thread em separado, qualquer pooling em loop infinito não vai impactar no programa principal, que por sua vez apenas verificaria o status do flag de "pacote recebido" e leria o conteudo salvo, obviamente ressetando esse flag após a leitura.


Entendi, uma thread só para tratar os dados da serial.

Re: Ajuda com Hello World

MensagemEnviado: 03 Set 2016 16:43
por denis
barboza escreveu:
EDSONCAN escreveu:Não entendi o motivo dessas chaves:
cpp code
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOutA(hdc, 10, 10, TextArray[0], 5);
EndPaint(hwnd, &ps);
}
break;




Para criar a variável local ps.


Além de criar a variável local as vezes ajuda quando se tem um case muito grande também.