WNDCLASSEX Style Frage



  • Guten Tag Community,

    Ich hoffe das ist im richtigen Bereich...

    Ich erstelle meine Windows GUI mit folgendem Code:

    WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = CreatePatternBrush(LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1)));
        wc.lpszMenuName  = NULL;
    	wc.lpszClassName = wTitle;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
    hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            wTitle,
            wTitle,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, wSizeY, wSizeX,
            NULL, NULL, hInstance, NULL);
    

    Jetzt die Frage, bei C# WinForms ist es ja möglich den Style "None" einzustellen. Damit das Windows Fenster weg ist und man eine Art eigenes Fenster z.B mit einem Bild machen kann.

    Wie ist dies jetzt aber in C++ möglich?

    MFG



  • http://social.msdn.microsoft.com/Forums/vstudio/en-US/b98c4c06-9581-44d3-8e5a-4adb2316e653/win32-about-styles-how-can-i-do-a-borderless-window?forum=vclanguage
    1. Antwort

    ich habe es gerade selbst ausprobiert und lief.

    EDIT: Richtiger Ort wäre gewesen: WinAPI subforum.



  • Huch danke schön.

    ===
    Das nächste mal versuche ich drauf zu achten in welchen Thread es gehört.

    Eine Frage habe ich noch. Wie kann ich dieses jetzt "Central" machen ?
    Sprich im Center Screen.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • AtomTiger schrieb:

    Eine Frage habe ich noch. Wie kann ich dieses jetzt "Central" machen ?
    Sprich im Center Screen.

    Mit der WinAPI hast du viel Handarbeit was GUIs betrifft. Du musst dir die Funktion selbst schreiben.

    Hier hätte ich eine Funktion für dich:

    void centerToParent(HWND hwndParent) {
    	RECT rcMain;
    	RECT rcChild;
    	GetWindowRect(hWndWindow, &rcChild);
    
    	if(hwndParent != NULL) 
    		GetWindowRect(hwndParent, &rcMain);
    	else {
    		rcMain.left = 0; 
    		rcMain.top = 0;
    		rcMain.right = GetSystemMetrics(SM_CXSCREEN);
    		rcMain.bottom = GetSystemMetrics(SM_CYSCREEN);
    	}
    
    	int x = rcMain.left+(rcMain.right-rcMain.left)-(rcChild.right-rcChild.left)-((rcMain.right-rcMain.left-(rcChild.right-rcChild.left))/2);
    	int y = rcMain.top+(rcMain.bottom-rcMain.top)-(rcChild.bottom-rcChild.top)-((rcMain.bottom-rcMain.top-(rcChild.bottom-rcChild.top))/2);
    
    	SetWindowPos(hWndWindow, NULL, x, y, NULL, NULL, SWP_NOZORDER | SWP_NOSIZE);
    }
    

    Wenn du bei 'hwndParent' NULL einsetzt, wird es auf dem Bildschirm zentriert.



  • Kann ein Moderator meinen vorherigen Post löschen?
    Hier noch einmal die richtige Funktion!

    Mit der WinAPI hast du viel Handarbeit was GUIs betrifft. Du musst dir die Funktion selbst schreiben.

    Also jetzt quasi so:

    void centerToParent(HWND hwndParent, HWND hwndChild) {
        RECT rcMain;
        RECT rcChild;
        GetWindowRect(hwndParent, &rcChild);
    
        if(hwndParent != NULL) 
            GetWindowRect(hwndParent, &rcMain);
        else {
            rcMain.left = 0; 
            rcMain.top = 0;
            rcMain.right = GetSystemMetrics(SM_CXSCREEN);
            rcMain.bottom = GetSystemMetrics(SM_CYSCREEN);
        }
    
        int x = rcMain.left+(rcMain.right-rcMain.left)-(rcChild.right-rcChild.left)-((rcMain.right-rcMain.left-(rcChild.right-rcChild.left))/2);
        int y = rcMain.top+(rcMain.bottom-rcMain.top)-(rcChild.bottom-rcChild.top)-((rcMain.bottom-rcMain.top-(rcChild.bottom-rcChild.top))/2);
    
        SetWindowPos(hwndChild, NULL, x, y, NULL, NULL, SWP_NOZORDER | SWP_NOSIZE);
    }
    

    Wenn du bei 'hwndParent' NULL einsetzt, wird es auf dem Bildschirm zentriert.



  • hello schrieb:

    Hier noch einmal die richtige Funktion!

    Mit SM_CxySCREEN sieht das aber irgendwie trotzdem falsch aus. Ich werfe mal was anderes auf den Markt:

    BOOL CenterWindow(HWND hWnd)
    {
        MONITORINFO mi;
        HWND hWndParent;
        RECT rc, rcParent;
        int x, y;
    
        if((GetWindowLongPtr(hWnd, GWL_STYLE) & WS_CHILD) && (NULL != (hWndParent = GetParent(hWnd))))
        {
            GetClientRect(hWndParent, &rcParent);
        }
        else if(NULL != (hWndParent = GetWindow(hWnd, GW_OWNER)))
        {
            GetWindowRect(hWndParent, &rcParent);
        }
        else
        {
            ZeroMemory(&mi, sizeof(mi));
            mi.cbSize = sizeof(mi);
    
            if(GetMonitorInfo(MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST), &mi))
            {
                rcParent = mi.rcWork;
            }
            else
            {
                SystemParametersInfo(SPI_GETWORKAREA, 0, &rcParent, 0);
            }
        }
    
        GetWindowRect(hWnd, &rc);
        x = (((rcParent.right - rcParent.left) - (rc.right - rc.left)) / 2) + rcParent.left;
        y = (((rcParent.bottom - rcParent.top) - (rc.bottom - rc.top)) / 2) + rcParent.top;
        return(SetWindowPos(hWnd, NULL, x, y, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER));
    }
    


  • Wo musst ich dann CenterScreen(NULL) einfügen?
    Da wenn ich es einfach bei ShowWindow einfüge, bleibt es trotzdem in der linken oberen Ecke.



  • AtomTiger schrieb:

    Wo musst ich dann CenterScreen(NULL) einfügen?

    Nirgendwo, das funktioniert nämlich nicht. Der Parameter von CenterWindow ist das Handle des Fensters, das zentriert werden soll. Mit NULL wird das nix.

    Rufe die Funktion nach Deinem CreateWindowEx-Aufruf auf. CreateWindowEx liefert Dir auch das benötigte Handle:

    hwnd = CreateWindowEx(...);
    CenterWindow(hwnd);
    

Anmelden zum Antworten