Problem mit ausgabe(Anfänger)



  • Also ich mache gerade das tutorial von Henno durch(www.win-api.de).
    Nun wollte ich (bin bei Lektion 11) mal was selber schreiben. Leider klappt
    es nicht. 😞
    Das Program soll mir eine zahl ausgeben die wenn man die linke Maus taste
    drück um 1 erhöht wir. Das erste mal kommt 1 wenn man nochmal klickt passiert
    nichts mehr.

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Test";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
        HWND     hWnd;
        MSG      msg;
        WNDCLASS wc;
    
        wc.style       =  CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc =  WndProc;
        wc.cbClsExtra  = 0;
        wc.cbWndExtra  = 0;
        wc.hInstance   = hInstance;
        wc.hCursor     = LoadCursor(NULL,IDC_ARROW);
        wc.hIcon       = LoadIcon(NULL,IDI_APPLICATION);
        wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszClassName= szAppName;
        wc.lpszMenuName = NULL;
    
        RegisterClass(&wc);
    
        hWnd = CreateWindow(szAppName,
                            "Test",
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,  
                            CW_USEDEFAULT,  
                            CW_USEDEFAULT,  
                            CW_USEDEFAULT,  
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
    
                            ShowWindow(hWnd, iCmdShow);
                            UpdateWindow(hWnd);
    
                            while(GetMessage(&msg, NULL, 0, 0))
                            {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                            }
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    int zahl = 0;
    char text[100];
    int lange;
        switch(message)
        {
    
                    case WM_LBUTTONDOWN:
               {
    
                zahl++;
              lange = wsprintf(text, "%i", zahl);
    
                 HDC hDC = GetDC(hWnd);
                 TextOut(hDC, 50, 50, text, lange);
                 ReleaseDC(hWnd, hDC);
    
                   return 0;
    
               }
    
            case WM_DESTROY:
               {
                   PostQuitMessage(0);
                   return 0;
               }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Probiere mal statt:

    HDC hDC = GetDC(hWnd);
    TextOut(hDC, 50, 50, text, lange);
    ReleaseDC(hWnd, hDC);
    

    das hier:

    MessageBox (hWnd, lange, "Zahl", MB_ICONINFORMATION);
    

    Wenns klappt dann liegt es daran, dass der Text nicht richitg überschrieben wird, sondern einfach nur drunter gelegt wird.

    Mfg Ominion



  • Also lange wollte ich nicht ausgeben und die zahl direkt klappt auch nicht(also einen int). Mit dem char bleibt es immer 1. 😞



  • Mein Fehler. Ersetze lange durch text.

    Mfg Ominion



  • Wenn ich das so mache:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Test";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
        HWND     hWnd;
        MSG      msg;
        WNDCLASS wc;
    
        wc.style       =  CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc =  WndProc;
        wc.cbClsExtra  = 0;
        wc.cbWndExtra  = 0;
        wc.hInstance   = hInstance;
        wc.hCursor     = LoadCursor(NULL,IDC_ARROW);
        wc.hIcon       = LoadIcon(NULL,IDI_APPLICATION);
        wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszClassName= szAppName;
        wc.lpszMenuName = NULL;
    
        RegisterClass(&wc);
    
        hWnd = CreateWindow(szAppName,
                            "Test",
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            NULL,
                            hInstance,
                            NULL);
    
                            ShowWindow(hWnd, iCmdShow);
                            UpdateWindow(hWnd);
    
                            while(GetMessage(&msg, NULL, 0, 0))
                            {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                            }
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    int zahl = 0;
    char text[100];
    char text2[23];
    int lange;
        switch(message)
        {
    
                    case WM_LBUTTONDOWN:
               {
    
                zahl++;
              lange = wsprintf(text, "%i", zahl);
    
              MessageBox (hWnd,  text, "Zahl", MB_ICONINFORMATION);
              zahl++;
              lange = wsprintf(text2, "%i", zahl);
              MessageBox (hWnd,  text2, "Zahl", MB_ICONINFORMATION);
                 /*HDC hDC = GetDC(hWnd);
                 TextOut(hDC, 50, 50, text, lange);
                 ReleaseDC(hWnd, hDC);*/
    
                   return 0;
           }
       case WM_LBUTTONUP:
          {
    
              return 0;
          }
    
            case WM_DESTROY:
               {
                   PostQuitMessage(0);
                   return 0;
               }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Klappt es inderekt also erste box eins die zweite 2. Allerdings bleiben sie dann auch so.



  • Mache text und text2 static und staune 😃

    Mfg Ominion



  • Danke jetzt klapps. Ich hab das jetzt mit static gemacht. Alerdings musste ich dann auch die int static machen.

    Danke.



  • Es reicht wenn Du die "zahl" static machst... oder Du gibst dem Fenster eine Struktur mit, wo Du Fenster-Spezifische Dinge ablegst.
    Siehe: Set/GetWindowLong(Ptr) mit GWLP_USERDATA
    dann kannst Du auf static verzichten.


Anmelden zum Antworten