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



  • 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.



  • Das hier ist der code.

    #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);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "Vokabeltrainer 2.0";
    
    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;
    
        /* 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
        static HWND hButtonEintragen; // Button zum eintragen in die datei
        const char szTextTest[] = " fgfg \r\n dsa daius \r\n nuinuin \r\n nuiniun \r\n esfghi uehf \r\n bzububbuzb \r\n nbuniiuni \r\n huihuhu \r\n nuiuniun \r\n bnzubuzbub \r\n niuniuin \r\n nbnnuniuni \r\n niuniuniounui \r\n uzb fgfg \r\n dsa daius \r\n nuinuin \r\n nuiniun \r\n esfghi uehf \r\n bzububbuzb \r\n fgfg \r\n dsa daius \r\n nuinuin \r\n nuiniun \r\n esfghi uehf \r\n bzububbuzb \r\n";
    
        switch (message)                  /* handle the messages */
        {
            case WM_COMMAND:
                {
                    switch (LOWORD(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;   
                        }
                 if (lParam == (LPARAM)hButtonEintragen)
                        {
                if (HIWORD(wParam) == BN_CLICKED){
                   MessageBox(NULL, "Funktion noch nicht eingebaut.",szClassName, MB_ICONINFORMATION | MB_OK);
                        }            
                 }    
                } 
                break;   
                }
    
                case WM_CTLCOLORSTATIC:
                {
                  switch (GetWindowLongPtr (reinterpret_cast<HWND> (lParam), GWL_ID))
                  {
                      case 1: //ID des Fensters
    
                      return (LRESULT) GetStockObject (WHITE_BRUSH);
    
                  }
                     return 0;  
                 }
    
            case WM_CREATE:
                {   
    
                    hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            "edit",
                                            NULL,
                                            WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | 
                                                  ES_AUTOVSCROLL | ES_MULTILINE,
                                            0, 0, 0, 0,
                                            hwnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);
    
                    MoveWindow(hEdit1, 310, 10, 270, 330, TRUE);
                    SetWindowText(hEdit1, szTextTest);
    
                    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);
    }
    

    Die anordnung ist aber noch nicht perfekt, und auch z.b. das SetWindow text kommt noch woanders hin. das ist erstmal nur ein gui test( aja, invalidateRect und update window ham nicht gefunzt, daher sind sie wieder draußen, aber sie standen in der COLORSTATIC message.



  • Als erstes fällt mir auf, dass du dem EditControl keine ID vergibst, während du es anlegst - prüfst aber auf eine ID bei WM_CTLCOLORSTATIC.
    Ausserdem hast du ja schon ein statisches HWND auf das EditControl. Wieso benutzt du dieses nicht bei der Abfrage.
    InvalidateRect und UpdateWindow solltest du nicht bei Bearbeitung der Message aufrufen, dieses könnte ein dauerhaftes Neuzeichnen des Controls verursachen.

    A static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn.

    Ein UpdateWindow(hwnd) solltest du allerdings noch in deiner WinMain vor der while-Schleife einfügen.

    Hier der (unvollständige) Code, wie es funktionieren sollte:

    static HBRUSH hbrush;
    
    case WM_CREATE:
    	// Brush für Hintergrundfarbe des EditControls anlegen
    	hbrush = CreateSolidBrush(RGB(255,255,255));
    
    	// weiterer Code
    
    	return 0;
    
    case WM_CTLCOLORSTATIC:
    	// prüfen, ob es sich um dein EditControl handelt
    	if((HWND)lParam == hEdit1)
    	{
    		// Hintergrundfarbe hinter Text setzen (gleiche Farbe, wie Hintergrundbrush)
    		SetBkColor((HDC)wParam, RGB(255, 255, 255));
    		// Optional, z.B. Textfarbe auf Blau
    		SetTextColor((HDC)wParam, RGB(0, 0, 255));
    		// Hintergrundbrush zurückgeben
    		return (LRESULT)hbrush;
    	}
    	return 0;
    
    case WM_DESTROY:
    	if(hbrush)
    		DeleteObject(hbrush);
    
    	// weiterer Code
    
    	return 0;
    

    Diese Lösung ist nicht mit GetStockObject (für Rückgabe des Brushhandles) realisiert, so kannst du jede beliebige Farbe einsetzen. Beachte jedoch, dass du bei CreateSolidBrush und SetBkColor die selben Farbwerte verwendest.



  • THX. hast mir echt geholfen. wenn das funzt, kann ich erstmal ne weile ohne probs arbeiten.( der Code für das prog liegt nämlich schon ne weile ferig auf meiner HDD( war erst ein konsolen proggie)).

    Edit: es funzt. ewnn ich das selbe auch mit anderen editfeldern machen will, muss ich nur das in der COLORSTATIC message ändern( brush soll gleich bleiben), oder?


Anmelden zum Antworten