Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Obiekty kontrolne C++ - pomoc w poprawieniu kodu

#1
Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Witam mam problem a dokładniej to gdzie mam wstawić linijkę kodu :
Kod:
case WM_COMMAND:
        if ((HWND) lParam == Przycisk)
            MessageBox(hwnd, "Naciśnięto Przycisk",    
            "Komunikat", MB_ICONINFORMATION);
        break;
aby otrzymać [img] http://www.speedyshare.com/files/27754041/Efekt.jpg [/img]
po kliknięciu na przycisk
Oto jak wygląda cały program:
Kod:
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    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 colour 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 */
           "Code::Blocks Template 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 */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* 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;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Próbowałem wstawić tę linjkę kodu tu:
Kod:
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;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Ale wyskakuje mi błąd : " 'Przycisk' was not declared in this scope" wiem że nie przycisk nie jest zadeklarowany i nie wiem gdzie go zadeklarować.
Z góry dziękuje za każdy pomocny post
Martin3126[/quote]
 System operacyjny: windows_seven Przeglądarka: firefox
#2
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Heh, skoro "przycisk" nie jest zadeklarowany, to nie ważne gdzie to wstawisz, a i tak będzie błąd Wesoły. Najpierw zadeklaruj ten obiekt/zmienną.
Dobrze pomyślałeś o umiejscowieniu tej instrukcji. Musi się ona znaleźć w procedurze okna w miejscu obsługi komunikatów, czyli tam gdzie WM_DESTROY. Jednak z fragmentu który kodu który podałeś(jeżeli jest to całość) tego efektu jak na screenie nie osiągniesz. O przyciskach możesz poczytać tu: http://darkcult.nazwa.pl/wiki/index.php/Kontrolki
Dyskusja o FAQ i propozycje zmian w dziale "Programowanie": http://forum.pcformat.pl/Przeczytaj-zani...emat-FAQ-t
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Izi poczytałem troche na tej stronie którą mi podałeś, poprawiłem kod natomiast mam teraz inny błąd:" undefined reference to 'WindowProcedure(HWND__*,unsigned int,unsigned int long)At16'
Błąd jest w tej linijce
Kod:
wincl.lpfnWndProc = WindowProcedure;
A poprawiony kod wygląda tak:
Kod:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam,HWND Przycisk)
{

switch (message)                  /* handle the messages */
    {
         case WM_COMMAND:
          if ( (HWND) lParam == Przycisk )
          MessageBox (hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION);
         break;


        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
 System operacyjny: windows_seven Przeglądarka: firefox
#4
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
To :,HWND Przycisk, nie powinno sie znaleźć w liście argumentów procedury obsługi okna. Bo przecież, gdybyś miał 100 przycisków, 300 jeszcze innych kontrolek, musiałbyś wszystkie je tam wpisać. Undefined reference pojawia się gdy funkcja zoztsje zdefiniowana z niewłaściwą liczbą argumentów. Kontrolka jest rozpoznawana przez identyfikator który jej nadasz. Poszukam mojego starego tematu w którym zostało to dobrze wyjaśnione.

Tutaj jest bardzo dobrze wytłumaczona sprawa identyfikatorów kontrolek http://forum.pcformat.pl/Blad-linkera-w-...pid1956872
Dyskusja o FAQ i propozycje zmian w dziale "Programowanie": http://forum.pcformat.pl/Przeczytaj-zani...emat-FAQ-t
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#5
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Zadeklarowałem przycisk jako zmienną globalną , program odpala wszystko cacy ale nadal nie ma takiego efektu jak na załaczonym screene to znaczy po naciśnięciu przycisku nie wyświetla się komunikat.
Kod
Kod:
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND Przycisk, UINT, WPARAM, LPARAM);
HWND Przycisk;
/*  Make the class name into a global variable  */

char szClassName[ ] = "CodeBlocksWindowsApp";


int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
Co jest źle nie mam pojęcia macie jakieś pomysły ??
 System operacyjny: windows_seven Przeglądarka: firefox
#6
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Daj cały kod.
Dyskusja o FAQ i propozycje zmian w dziale "Programowanie": http://forum.pcformat.pl/Przeczytaj-zani...emat-FAQ-t
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#7
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Kod:
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND Przycisk, UINT, WPARAM, LPARAM);
HWND Przycisk;
/*  Make the class name into a global variable  */

char szClassName[ ] = "CodeBlocksWindowsApp";


int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)


{
    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 colour 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 */
           "Code::Blocks Template Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           700,                 /* The programs width */
           400,                 /* 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 */
           );
        HWND Przycisk=CreateWindowEx(0,"BUTTON","Przycisk",WS_CHILD|WS_VISIBLE,450,20,120,30,hwnd,NULL,hThisInstance,NULL);
        HWND poleWyboru=CreateWindowEx(0,"BUTTON","Wybór 1",WS_CHILD|WS_VISIBLE|BS_CHECKBOX,20,20,120,30,hwnd,NULL,hThisInstance,NULL);
        HWND poleOpcji=CreateWindowEx(0,"BUTTON","pole opcji",WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON,20,55,120,30,hwnd,NULL,hThisInstance,NULL);
        HWND ramka=CreateWindowEx(0,"BUTTON","ramka",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,20,85,120,60,hwnd,NULL,hThisInstance,NULL);
        HWND poleTekstowe=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,200,20,120,60,hwnd,NULL,hThisInstance,NULL);
        HWND listaRozwijalna=CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|CBS_DROPDOWN,200,85,120,60,hwnd,NULL,hThisInstance,NULL);
        SendMessage(listaRozwijalna,CB_ADDSTRING,0,(LPARAM)"Opcja 1");
        SendMessage(listaRozwijalna,CB_ADDSTRING,0,(LPARAM)"Opcja 2");
        SendMessage(listaRozwijalna,CB_ADDSTRING,0,(LPARAM)"Opcja 3");

/* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* 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_COMMAND:
          if ((HWND) lParam == Przycisk )
          MessageBox (hwnd, "Nacisnięto  przycisk!", "Komunikat", MB_ICONINFORMATION);
         break;


        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
            default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
Proszę oto cały kod programu.
 System operacyjny: windows_seven Przeglądarka: firefox
#8
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Błąd jest w WinMain. Zadeklarowałeś zmienną o takiej samej nazwie jak zmienna globalna Przycisk. W efekcie, przycisk który stworzyłeś jest w zmiennej lokalnej a żeby program zadziałał jak należy, powinien być w zmiennej globalnej. Powinno to wyglądać tak:
Kod:
Przycisk=CreateWindowEx(0,"BUTTON","Przycisk",WS_CHILD|WS_VISIBLE,450,20,120,30,hwnd,NULL,hThisInstance,NULL);
Reszta jest bez zmian.

Na przyszłość jednak nadawaj kontrolkom identyfikatory(3 argument od końca w CreateWindowEx). Było o tym w wątku do którego link podałem.
Dyskusja o FAQ i propozycje zmian w dziale "Programowanie": http://forum.pcformat.pl/Przeczytaj-zani...emat-FAQ-t
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#9
RE: Obiekty kontrolne C++ - pomoc w poprawieniu kodu
Wielkie dzięki Izi, program działa jak należy,na przyszłość postaram się nadawać identyfikatory kontrolkom
 System operacyjny: windows_seven Przeglądarka: firefox
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
obiekty kontrolne winapi

Podobne wątki (Obiekty kontrolne C++ - pomoc w poprawieniu kodu)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Java początkujący problem ze zrozumieniem kodu MatL70 6 7810 20.06.2017, 12:24
Ostatni post: MatL70
  Język c, końcówka kodu. PILNE leparkour383 1 7901 04.05.2016, 14:08
Ostatni post: Ajgor
  [C#] Sposób na dodawanie nowych funkcji bez dodawania linijek kodu w pliku głównym. dorion300 1 7191 12.06.2015, 14:45
Ostatni post: dorion300

Skocz do:


Wybrane wątki (Obiekty kontrolne C++ - pomoc w poprawieniu kodu)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Środowisko do assemblera Physicist 4 8041 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 8323 17.04.2019 10:20
Ostatni post: ptrick
  C++ - sens pogłębiania nauki gbr 5 8105 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 7744 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 6888 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 10112 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 7342 07.03.2019 15:33
Ostatni post: wiktrom12
  Mój pierwszy projekt - Pomoc rafal12999 1 7787 07.02.2019 22:01
Ostatni post: Szachista
  pomoc projekt scilab piesel18 2 9196 04.02.2019 09:03
Ostatni post: piesel18
  Szkoła Informatyczna Zikinan 1 8069 02.02.2019 17:59
Ostatni post: wojownikhaha
  [Java] Strona z zadaniami do rozwiązania i odpowiedziami rafal12999 2 8785 27.01.2019 13:44
Ostatni post: rafal12999
  kompilacja biblioteki Agui - cmake jurek2 0 8098 10.01.2019 13:12
Ostatni post: jurek2
  Zamiana całego zestawu znaków wg przyporządkowania BarHorab 5 8791 19.12.2018 16:45
Ostatni post: Szachista
  Sumowanie licz excel - problem OxyGenE 2 11472 19.12.2018 16:29
Ostatni post: Szachista
  Jaki kod pod pewne zdarzenia visualbasic 2010 aktywny27 4 9256 07.11.2018 13:41
Ostatni post: Ajgor