Winapi prog stürzt beim klicken auf nen Button ab.



  • Und genauso, wenn ich ein editfeld einbauen möchte... Also, ich schreibe ein prog zum lernen von Vokabeln und dabei gibts halt das problem, dass das proggie immer abstürzt, wenn ich auf den Button klicke. Die aktion des Butonklicks soll aber ne messageBox aufrufen, die aber nicht erscheint( also es erscheint eine, aber das ist die von windows ' das Programm hat ein Problem festgestellt und muss beendet werden'). das selbe Problem hab ich bei Editfeldern. allerdings stürzt da das Programm ab, bevor ich auch nur die Programmoberfläche sehe... Beim Compilen und Linken gibts keine fehler. IDE ist DEV-Cpp( hab auch Turbo c++ von Borland, aber keine ahnung, wie ich da resourcendateien zum projekt hinzufüge...) nja, hier ist erstmal der code.( die ganzen header brauch ich für das programm. Der Grundcode stammt übrigends aus der Datei, die bei der Projekterstellung erstellt wurde. Der bereich zum erstellen der editbox ist auskommentier, damit ich überhaup was vom Programm sehe).

    include <windows.h>
    #include "main.h"
    #include <iostream>
    #include <fstream>
    #include <map>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <time.h>
    using namespace std;
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK ChildProc1 (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "Vokabeltrainer 2.0";
    char szChildName1[ ] = "Dateiausgabe";
    
    int WINAPI WinMain (HINSTANCE hInstance,
                        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 */
        HMENU menu;
    
            /* The Window structure */
        wincl.hInstance = hInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Ctach double-clicks */
        wincl.cbSize = sizeof(WNDCLASSEX);
    
        /* Use default icon and mousepointer */
        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;
    
        if (!RegisterClassEx (&wincl))
            return 0;
    
        wincl.lpszClassName = szChildName1;
        wincl.lpfnWndProc = ChildProc1;
        wincl.hIcon = NULL;
        wincl.hIconSm = NULL;
        wincl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    
        if (!RegisterClassEx (&wincl))
        return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               WS_EX_CLIENTEDGE,                   /* Extended possibilites for variation */
               szClassName,         
               "Vokabeltrainer 2.0",       
               WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
               CW_USEDEFAULT,       
               CW_USEDEFAULT,       
               600,                 
               400,                 
               HWND_DESKTOP,        
               NULL,                
               hInstance,       
               NULL                 
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        menu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU));
        SetMenu(hwnd, menu);
    
        /* 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)
    {
        static HWND    hChild1; //Childwindow für ausgabe des Dateiinhalts
        static HWND hEdit1; // Editfeld zur eingabe der Englischen Vokabel
        char InputEnglish[100] = "Hello World";
        static HWND hButtonEintragen; // Button zum eintragen in die datei
    
        switch (message)                  /* handle the messages */
        {
            case WM_COMMAND:
                {
                    switch (wParam){
                    case IDM_NEWVOK :
                    case IDM_OPENVOK :
                    case IDM_SAVEVOK :    
                    case IDM_PRACTICEVOK :
                    case IDM_HELP :
                    {
                        MessageBox(hwnd, (LPSTR) "Funktion noch nicht eingebaut.", (LPSTR) szClassName, MB_ICONINFORMATION | MB_OK);
                        return 0;        
                    }
                    case IDM_ABOUT :
                        {
                            MessageBox(NULL, "Vokabeltrainer 2.0 \n Copyright bei Martin 'Arathorns Sohn' Alsfasser \n Dark Grass Software", "Über das Programm", MB_OK);
                            return 0;
                        }
                    case IDM_EXIT :
                        {
                          PostQuitMessage(0);
                          return 0;   
                        }
    
                }    
                }
    
            case WM_CREATE:
                {   
                    hChild1 = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            szChildName1,
                                            NULL,
                                            WS_CHILD | WS_VISIBLE | WS_VSCROLL | 
                                                  ES_AUTOVSCROLL,
                                            310, 10, 270, 330,
                                            hwnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);
    
                    /*hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            "edit",
                                            InputEnglish,
                                            WS_CHILD | WS_VISIBLE,
                                            0, 0, 0, 0,
                                            hwnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);*/
                    hButtonEintragen = CreateWindow( "button",
                                                     "Eintragen",
                                                     WS_CHILD | WS_VISIBLE,
                                                     0, 0, 0, 0,
                                                     hwnd,
                                                     NULL,
                                                     ((LPCREATESTRUCT) lParam) -> hInstance,
                                                     NULL);
                    MoveWindow(hButtonEintragen, 70, 250, 160, 22, TRUE);
    
                    return 0;
                }    
    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
    
        }
    
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK ChildProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static RECT rectChild1;
        const char szTextTest[] = " fgfg \n dsa daius \n nuinuin \n nuiniun \n esfghi uehf \n bzububbuzb \n nbuniiuni \n huihuhu \n nuiuniun \n bnzubuzbub \n niuniuin \n nbnnuniuni \n niuniuniounui \n uzb";
        switch (message)
        {
        case WM_SIZE:
          {
             rectChild1.left    = 0;
             rectChild1.top     = 0;
             rectChild1.right   = LOWORD(lParam);
             rectChild1.bottom  = HIWORD(lParam);
    
             return 0;
          }
            case WM_PAINT:
                {
                    PAINTSTRUCT ps;
                    HDC hDC;
    
                    hDC = BeginPaint(hwnd, &ps);
                    {
                        DrawText(hDC, szTextTest, lstrlen(szTextTest), &rectChild1, DT_LEFT);
                    }
                    EndPaint(hwnd, &ps);
                    return 0;
                }        
            default :
                break;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    


  • 1: Welchen Button meinst Du? Den Button "Eintragen"?

    2: Bei der Abfrage der Actioncodes von WM_COMMAND wählt man nicht wParam, sondern (LOWORD)wParam.

    3: Die Behandlung der WM_COMMAND sollte mit break abgeschlossen werden.

    4: Ich kann nicht erkennen, daß Du den Button (bzw. dessen Handle) überhaupt abfragst, z. B. mit

    if (lParam == (LPARAM)hButtonEintragen)
    

    (könnte natürlich auch sein, daß ich was übersehen habe... 😃 )



  • THX für die antwort8 das mit dem button hab ich wohl nicht gespeichert, es war drin...
    1. Ja, ich meine edn Button eintragen
    THX, ich probiers mal aus.

    Edit: so, dass ende der WM_CREATE sieht jetzt so aus, aber wenn ich auf den button klicke passiert nix...( aja, wenn ich beim switch zu beginn der WM_COMMAND (LOWORD)lParam einsetzte gibts nen fehler, as (LOWORD) nicht gefunden wurde.

    2 fragen:
    1. Woran liegts, dass es abstürtzt, wenn ich das editfeld drinlasse?
    2. ist es möglich, eine Editfeld für den benutzer schreibzuschützen? Das childwindow funzt nämlich nicht( man kann es nicht scrollen, was dafür nötig ist).



  • kann mir denn niemand helfen?



  • Fipptehler: LOWORD(wParam) statt (LOWORD)wParam

    Ansonsten lass dir mal vom Debugger mitteilen wo er denn abstürzt 😉



  • Hey, jetzt stürzt er nicht mehr ab. ber ich hab oben noch ne frage geschrieben( glaub ich).
    ist es möglich, ei editfeld schreibzuschützen( der User kann es nicht verändern)?



  • genau,
    denn "LOWORD" und "HIWORD" sind makros, keine typen {o;



  • @Geeky:
    Natürlich LOWORD (wParam). Fein Mehler... 😃

    Hey, jetzt stürzt er nicht mehr ab.

    Na klasse, dann ist ja schon was erreicht... 🤡
    Schreibschützen kannst Du das Editfeld, indem Du WM_CHAR oder WM_KEYDOWN/WM_KEYUP-Nachrichten in der Dialogprozedur abfängst.

    Fragt sich allerdings, wozu... 😕



  • Arathorns Sohn schrieb:

    ist es möglich, ei editfeld schreibzuschützen( der User kann es nicht verändern)?

    Beim Erstellen mit dem Style ES_READONLY
    Im Programm mit der Message EM_SETREADONLY



  • THX. ich probiers aus.

    aja, ich kann aber trotzdem noch im programm in das editfeld schreiben, oder?

    Edit: ok, habs grad rausgefunden. aber damit ne neue frage: wie kann ich bei SetWindowtext nen neue zeile anfangen? ich hab \n probiert, und das funzt nicht.



  • Neue Zeile mit "\r\n"



  • Geht nicht. ich bekomme überall, wo das steht || angezeigt... 😞



  • Hat du dein EditControl auch mit dem Style ES_MULTILINE erstellt?



  • *kopf gegen die mauer hau* thx. hab ich vergessen. letzte frage: Wie kann ich die hintergrundfarbe ändern?( son gelb wie in der menüleiste kommt nicht so gut...





  • da steht, dass das nur funzt, wenn das editwindow nicht readonly ist. das ist es aber. kann mal einer ein beispiel posten?



  • Dafür gibt es WM_CTLCOLORSTATIC. Ein ReadOnly-Editfeld wird als Static behandelt.

    Mfg Ominion

    EDIT:

    case WM_CTLCOLORSTATIC:
    	switch (GetWindowLongPtr (reinterpret_cast<HWND> (lParam), GWL_ID))
    	{
    		case 1: //ID des Fensters
    
    		return (LRESULT) GetStockObject (WHITE_BRUSH);
    	}
    return 0;
    


  • thx. ich probiers aus.

    Jetzt hb ich ein weiteres prob. das felb wird erst weiß, wenn ich gescrollt habg( und auch nur da, wo es verdeckt war). das gepostete hab ich vor dem WM_CREATE eingefügt.



  • Gffs. InvalidateRect und UpdateWindow.



  • Arathorns Sohn schrieb:

    da steht, dass das nur funzt, wenn das editwindow nicht readonly ist. das ist es aber. kann mal einer ein beispiel posten?

    Deshalb hatte ich auch WM_CTLCOLOREDIT und WM_CTLCOLORSTATIC erwähnt, für den Fall, dass der Schreibschutz des EditControls sich programmbedingt ändert.

    Arathorns Sohn schrieb:

    Jetzt hb ich ein weiteres prob. das felb wird erst weiß, wenn ich gescrollt habg( und auch nur da, wo es verdeckt war). das gepostete hab ich vor dem WM_CREATE eingefügt.

    Als kleinen Hinweis noch die Funktion SetBkColor, sonst hast du u.U. hinter dem Text eine andere Hintergrundfarbe als dort, wo sich kein Text befindet.
    Ansonsten poste mal deinen Code.


Anmelden zum Antworten