Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andre.fabbro

Form simples no C++

Recommended Posts

Galera,

Tô precisando de uma força em C++ aqui.. a problemática é a seguinte: crio um Windows Application no Dev, tem que ser lá porque o form não pode pedir nenhuma DLL ou coisa do tipo (pra rodar em qualquer windows, o Builder ele pede umas bibliotecas), coloco dois botões, quando clicar nesses botões, deve-se executar uma ação qualquer, por exemplo abrir um MessageBox, mas devo diferenciar quais dos botões é clicado.. como posso saber qual o botão que foi clicado?? Segue abaixo até onde cheguei, se alguém puder me ajudar por favor eu agradeceria muito:

 

#include <windows.h> /*  Declare Windows procedure  */LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /*  Make the class name into a global variable  */char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance,                    HINSTANCE hPrevInstance,                    LPSTR lpszArgument,                    int nFunsterStil) {    HWND hwnd;               /* This is the handle for our window */    MSG messages;            /* Here messages to the application are saved */    WNDCLASSEX wincl;        /* Data structure for the windowclass */     /* The Window structure */    wincl.hInstance = hThisInstance;    wincl.lpszClassName = szClassName;    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */    wincl.cbSize = sizeof (WNDCLASSEX);     /* Use default icon and mouse-pointer */    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);    wincl.lpszMenuName = NULL;                 /* No menu */    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */    wincl.cbWndExtra = 0;                      /* structure or the window instance */    /* Use Windows's default color as the background of the window */    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;     /* Register the window class, and if it fails quit the program */    if (!RegisterClassEx (&wincl))        return 0;     /* The class is registered, let's create the program*/    hwnd = CreateWindowEx (           0,                   /* Extended possibilites for variation */           szClassName,         /* Classname */           "Windows App",       /* Title Text */           WS_OVERLAPPEDWINDOW, /* default window */           CW_USEDEFAULT,       /* Windows decides the position */           CW_USEDEFAULT,       /* where the window ends up on the screen */           544,                 /* The programs width */           375,                 /* and height in pixels */           HWND_DESKTOP,        /* The window is a child-window to desktop */           NULL,                /* No menu */           hThisInstance,       /* Program Instance handler */           NULL                 /* No Window Creation data */           );            // botão 1    HWND hwndButton1 = CreateWindow("BUTTON", "PROGRAMA 1", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,      10,         // starting x position     20,         // starting y position     100,        // button width     100,        // button height     hwnd, // parent window     NULL,       // No menu     (HINSTANCE) 0, //(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),     NULL);      // pointer not needed         // botão 2    HWND hwndButton2 = CreateWindow("BUTTON", "PROGRAMA 2", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,      120,         // starting x position     20,         // starting y position     100,        // button width     100,        // button height     hwnd, // parent window     NULL,       // No menu     (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),     NULL);      // pointer not needed      /* Make the window visible on the screen */    ShowWindow (hwnd, nFunsterStil);     /* Run the message loop. It will run until GetMessage() returns 0 */    while (GetMessage (&messages, NULL, 0, 0))    {        /* Translate virtual-key messages into character messages */        TranslateMessage(&messages);        /* Send message to WindowProcedure */        DispatchMessage(&messages);    }         /* The program return-value is 0 - The value that PostQuitMessage() gave */    return messages.wParam;} /*  This function is called by the Windows function DispatchMessage()  */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)                  /* handle the messages */    {        case WM_DESTROY:            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */            break;        case WM_COMMAND:            if(LOWORD(wParam) == BN_CLICKED)             {                    MessageBox(hwnd, "O botão que foi clicado é o ????", "teste", MB_OK);                                    };            break;        default:                      /* for messages that we don't deal with */            return DefWindowProc (hwnd, message, wParam, lParam);    }     return 0;}

 

Abraços

André

Compartilhar este post


Link para o post
Compartilhar em outros sites

No momento da execução daquela MessageBox() o valor de LOWORD(lParam) é o handle do botão clicado. E, o handle de cada botão você obtém na criação dos mesmos:

 

HWND hwndButton1 = CreateWindow(...HWND hwndButton2 = CreateWindow(...

Basta compará-los (utilizando LOWORD para a conversão e deixando os valores acima em um escopo alcançável pela função).

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Graymalkin, mas ainda estou com dúvida em uma coisa, como posso comparar os dois? Eu consegui deixar os hwndButton1 e hwndButton2 num escopo alcançável pela função, declarei eles no escopo principal do prog, e funcionou, porém estou tendo problemas para compará-los, por exemplo:

 

if(LOWORD(lParam) == hwndButton2)

 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){            switch (message)                  /* handle the messages */    {        case WM_DESTROY:            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */            break;        case WM_COMMAND:            if(LOWORD(wParam) == BN_CLICKED)             {               if(LOWORD(lParam) == hwndButton2) {                    MessageBox(hwnd, "O botão que foi clicado é o hwndButton2"," teste " , MB_OK);               }                     }            break;        default:                      /* for messages that we don't deal with */            return DefWindowProc (hwnd, message, wParam, lParam);    }    return 0;}
Seria esse o caminho?

 

Obrigado pela força!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça assim:

 

if (LOWORD(lParam) == LOWORD(hwndButton2))

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.