2016-04-06 13 views
1

Ich möchte ein Fenster implementieren, dessen obere Koordinate immer X ist (der Einfachheit halber 0). Das heißt, die Oberseite des Fensters ist auf 0 festgelegt, was die Oberseite des Bildschirms ist.Erstellen eines veränderbaren Fensters mit fester oberer Koordinate

Ich habe bereits das Fenster implementiert, setze seine Position mit SetWindowPos, aber ich habe Mühe, seinen oberen Koordinatenwert beizubehalten.

+0

Ist das für ein Kind Fenster? Wenn Sie zeigen, was Sie bereits getan haben, wäre es leichter zu verstehen. –

+0

Nur eine einfache exe erstellen Sie ein Fenster mit 'CreateWindowEx'. Viele Hilfsklassen sind an der Erstellung des Fensters beteiligt, so dass es schwierig ist, den gesamten relevanten Code zu veröffentlichen. Ich bin hoffentlich auf der Suche nach einer einfachen Möglichkeit, das vorhandene 'HWND' zu manipulieren, um das zu erreichen. – idanshmu

+0

Sie meinen, Sie möchten nicht, dass der Benutzer das Fenster verschieben kann? (Dazu müssen Sie die Beschriftung entfernen und eine benutzerdefinierte Größenanpassung implementieren.) - oder suchen Sie nach "SetWindowPos (hwnd, 0, 0, 0, width, height, SWP_NOMOVE)", das die Größe des Fensters ändert, aber nicht die obere linker Eckwert –

Antwort

1

Sie können ein Fenster ohne Titelleiste, zum Beispiel

CreateWindow(className, title, WS_THICKFRAME | WS_POPUP, ...) 

Dann WM_NCHITTEST außer Kraft schaffen die Anforderungen zum Bewegen des Fensters nach unten und zu ändern.

Wenn Fenster Titelleiste hat, zum Beispiel:

CreateWindow(className, title, WS_OVERLAPPEDWINDOW, ...) 

Dann überschreiben hinzufügen für WM_WINDOWPOSCHANGING auch:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 

    case WM_NCHITTEST: 
    { 
     LRESULT lresult = DefWindowProc(hwnd, msg, wParam, lParam); 
     switch (lresult) 
     { 
     case HTTOP:  lresult = HTCLIENT; break; 
     case HTTOPLEFT: lresult = HTLEFT; break; 
     case HTTOPRIGHT: lresult = HTRIGHT; break; 
     } 
     return lresult; 
    } 

    case WM_WINDOWPOSCHANGING: 
    { 
     WINDOWPOS* wndpos = (WINDOWPOS*)lParam; 
     wndpos->y = 100;//choose a fixed position 
     break; 
    } 

    ... 
    } 

    return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
Verwandte Themen