Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] SendMessage w obsłudze zdarzeń

Ostatnio zmodyfikowano 2013-08-29 20:13
Autor Wiadomość
korkoran
Temat założony przez niniejszego użytkownika
[WinApi] SendMessage w obsłudze zdarzeń
» 2013-08-28 18:30:48
Witam,

Kiedy próbuję w obsłudze zdarzeń dodać napis do kontrolki zdefiniowanej w funkcji głównej za pomocą funkcji SendMessage to komenda zdaje się nie działać. Myślę, że w pełni zobrazuje to kawałek programu:

C/C++
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    [...]
    HWND przyc_add = CreateWindowEx( 0, "BUTTON", "Dodaj przedmiot", WS_CHILD | WS_VISIBLE
    , 50, 65, 150, 30, hwnd,( HMENU ) ID_PRZYCISK1, hInstance, NULL );
   
    HWND lb_p = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE,
    305, 68, 140, 190, hwnd, NULL, hInstance, NULL );
    SendMessage( lb_p, LB_ADDSTRING, 0,( LPARAM ) "Test" ); //działa
   
    [...]
    // OBSŁUGA ZDARZEŃ
    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_COMMAND:
            switch( wParam )
            {
            case ID_PRZYCISK1:
                SendMessage( lb_p, LB_ADDSTRING, 0,( LPARAM ) "Test" ); // nie działa
                [...]


Nie mam niestety pojęcia co zrobić, aby program "zauważył" komendę w obsłudze zdarzeń. Nie znalazłem też na ten temat żadnych wskazówek w Internecie.

Pozdrawiam.
P-91136
pekfos
» 2013-08-28 18:40:36
Co znaczy "nie działa"? Co zwraca SendMessage()?
P-91138
korkoran
Temat założony przez niniejszego użytkownika
» 2013-08-28 19:17:26
SendMessage() zwraca 0. Nie działa to znaczy nie wyświetla się w programie.
P-91144
RazzorFlame
» 2013-08-29 10:53:02
Podaj troche więcej kodu... skąd mamy wiedzieć co robisz za SendMessage?
P-91168
korkoran
Temat założony przez niniejszego użytkownika
» 2013-08-29 13:42:35
C/C++
#include <windows.h>
#include "dziennik.h"

LPSTR NazwaKlasy = "Klasa Okienka";
HWND hwnd;
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
BOOL CALLBACK DlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );


HWND ramka_p;
HWND ramka_i;
HWND ramka_m;
HWND lb_p;
HWND przyc_add;



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    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 = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Błąd!", "Błąd!",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
   
   
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Dziennik", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Błąd!", "Błąd!", MB_ICONEXCLAMATION );
        return 1;
    }
   
    HWND ramka_m = CreateWindowEx( 0, "BUTTON", "Menu", WS_CHILD | WS_VISIBLE | BS_GROUPBOX |
    SS_LEFT, 45, 50, 160, 300, hwnd, NULL, hInstance, NULL );
   
    HWND ramka_p = CreateWindowEx( 0, "BUTTON", "Przedmioty", WS_CHILD | WS_VISIBLE | BS_GROUPBOX |
    SS_LEFT, 300, 50, 150, 200, hwnd, NULL, hInstance, NULL );
   
    HWND lb_p = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE,
    305, 68, 140, 190, hwnd, NULL, hInstance, NULL ); c
    SendMessage( lb_p, LB_ADDSTRING, 0,( LPARAM ) "Test" ); //działa
   
    HWND ramka_i = CreateWindowEx( 0, "BUTTON", "Informacje", WS_CHILD | WS_VISIBLE | BS_GROUPBOX |
    SS_LEFT, 500, 50, 250, 300, hwnd, NULL, hInstance, NULL );
   
    HWND przyc_add = CreateWindowEx( 0, "BUTTON", "Dodaj przedmiot", WS_CHILD | WS_VISIBLE
    , 50, 65, 150, 30, hwnd,( HMENU ) ID_PRZYCISK1, hInstance, NULL );
   
   
   
   
   
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
   
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
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_COMMAND:
        switch( wParam )
        {
        case ID_PRZYCISK1:
           
            SendMessage( lb_p, LB_ADDSTRING, 0,( LPARAM ) "Test" ); //nie działa
           
           
            break;
        }
        break;
       
       
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

Jak widać po SendMessage nie dzieje się już nic ważnego.
P-91191
Monika90
» 2013-08-29 18:48:51
Lokalna zmienna lb_p w WinMain, to jest inna zmienna niż globalna lb_p, której używasz w WndProc.
P-91206
korkoran
Temat założony przez niniejszego użytkownika
» 2013-08-29 20:13:54
Monika90: Masz rację - nie wiem czemu tworzyłem te zmienne lokalnie. Dziękuję za zauważenie tego błędu.
P-91213
« 1 »
  Strona 1 z 1