(mehrere) Fenster bei Click kreiren



  • Hi,

    ich hab schon länger überlegt und rumprobiert, wie man bei Klick auf ein Fenster (WM_LBUTTONDOWN) ein neues Fenster (muss nicht unbedingt ein child-window sein) kreiren kann.

    Dies funktioniert auch, indem ich in der WinMain-Funktion das erste Fenster an eine Prozedur anbinde und dann in einer Funktion bei einem Klick

    case WM_LBUTTONDOWN: 
    _FensterKreieren()  // Beispielsweise
    break;
    

    ein weiteres Fenster erstelle. Auch bei einfacher Wiederaufrufung der WinMain Funktion wurden die Fenster erstellt.

    Problem:
    Die Fenster reagieren bei zB klicken auf das "Schließen-Kreuz" erst nach wiederholtem klicken 😕

    Ich wäre für Vorschläge zur verbesserung dankbar.

    MFG Sys_Shutdown



  • keiner eine Idee ??

    oder braucht ihr ein bisschen beispiel-source? 😃



  • Doppelträtsel. Ich schieße es geht um WM_LBUTTONDOWN + verlorener Fokus + DefWindowProc. Was ist los mit WM_LBUTTONDOWN weiter? Return zero oder DefWindowProc? Wenn das zweite - falsch gemacht, wenn das erste - versuch mit PostMessage(WM_LBUTTONUP).



  • rück mal mit dem code rüber, mister!



  • Beispielsweise:

    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    bool Proz(HWND _hwnd, UINT _message, WPARAM _wParam, LPARAM _lParam);
    int i = 0;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        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 */
    
        /* 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 color 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 */
               "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, nFunsterStil);
    
        /* 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_LBUTTONDOWN:
    
                    i++;
                    HWND Fenster[255];               
    
                    char buf[255];
                    wsprintf(buf, "Fenster %d", i);
    
                    Fenster[i] = CreateWindowEx(0, WC_DIALOG, buf, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 300, 300, NULL, NULL, NULL, NULL);
                    SetWindowLong(Fenster[i], DWL_DLGPROC, (long)Proz);
    
                    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;
    }
    
    bool Proz(HWND _hwnd, UINT _message, WPARAM _wParam, LPARAM _lParam)
    {
         if(_message == WM_DESTROY)PostQuitMessage(0);
         if(_message == WM_CLOSE); // wenn ich hier eine PostQuitMessage(0);
                                   // einfüge, wird ja das parent-window
                                   // auch geschlossen..
    
    return false;     
    }
    


  • Die Fenster schließen sofort bei mir, keine Problemme.

    int __stdcall Proz(HWND _hwnd, UINT _message, WPARAM _wParam, LPARAM _lParam) 
    { 
    	if(_message == WM_CLOSE) DestroyWindow(_hwnd); 
    	return 0;// int, BOOL oder INT_PTR, kein 'bool'  
    }
    


  • du könntest aber auch die nonclientarray abfangen

    case WM_NCLBUTTONUP:
    		case WM_NCLBUTTONDOWN:
    			{
    				switch(wParam)
    				{
    					case HTCLOSE:
    						{
    
    					  	  DestroyWindow(_hwnd); 
    						return 0;
    						}
    					break;
    
    					case HTMENU:
    					case HTTOP:
    					case HTTOPLEFT:
    					case HTTOPRIGHT:
    					case HTCAPTION:
    					  return (DefWindowProc (hWnd, message, wParam, lParam));
    					break;
    				}			
    			}
    
    		break;
    

Anmelden zum Antworten