web-dev-qa-db-fra.com

Supprimer la bordure de la fenêtre?

J'ai une fenêtre avec une bordure solide autour d'elle. Comment puis-je supprimer la bordure (toute la zone non-client) en utilisant SetWindowLong et GetWindowLong?

29
Kristina Brooks

En C/C++

LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);

WS_CAPTION est défini comme (WS_BORDER | WS_DLGFRAME). Vous pouvez vous en sortir en supprimant uniquement ces deux styles, car le menu de réduction et de maximisation disparaîtra lorsque la légende disparaît, mais il est préférable de les supprimer également.

Il est également préférable de supprimer les styles de bordure étendus.

LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);

Et enfin, pour que votre fenêtre se redessine avec les styles modifiés, vous pouvez utiliser SetWindowPos.

SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
49
John Knoeller

Les codes Delphi suivants le font:

  SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_BORDER and not WS_SIZEBOX and not WS_DLGFRAME );
  SetWindowPos(Handle, HWND_TOP, Left, Top, Width, Height, SWP_FRAMECHANGED);

Bien sûr, ces appels d'API se ressemblent dans toutes les langues.

8
Andreas Rejbrand

Cette ligne de code ci-dessous supprime la bordure d'une fenêtre donnée et ne reste que son client:

SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);

Vous pouvez utiliser WS_POPUPWINDOW à la place dans le troisième paramètre de la fonction SetWindowLong. Il supprime également les bordures de la fenêtre donnée et fonctionne également, mais la différence est qu'il dessine également un rectangle noir délimité sur tout le client restant de la fenêtre . L'épaisseur de ce rectangle décrit est de 1 pixel. WS_POPUP ne dessine pas ce rectangle, en fait il ne dessine rien, il suffit de supprimer les bordures de la fenêtre.

Si vous êtes sur le point de retourner les bordures de la fenêtre, avant d'utiliser cette ligne de code que j'ai publiée ci-dessus, appelez d'abord cette ligne de code ci-dessous:

GetWindowLong(hWnd /*The handle of the window that you want to remove its borders and later return them back to it*/, GWL_STYLE);

mais bien sûr que cette fonction réaccorde les styles de la fenêtre, alors créez une nouvelle variable qui gardera ces styles, c'est-à-dire définissez cette variable sur la valeur de retour de cette fonction.

Ensuite, vous utilisez SetWindowLong comme je le montre ci-dessus pour supprimer ses bordures, et lorsque vous souhaitez restaurer plus tard ses bordures, rappelez-vous à nouveau SetWindowLong, les deux premiers paramètres sont identiques (hWnd et GWL_STYLE) , mais le troisième paramètre correspond aux styles de la fenêtre renvoyée par GetWindowLong. Si vous ne voulez pas appeler GetWindowLong, mais renvoyez toujours les bordures de la fenêtre, vous pouvez utiliser SetWindowLong avec les mêmes deux premiers paramètres, et dans le troisième paramètre, vous pouvez utiliser l'un des éléments suivants: WS_OVERLAPPED ou et WS_OVERLAPPEDWINDOW ou et WS_SIZEFRAME.

REMARQUE: Si vous essayez ma réponse, mais que cela ne fonctionne pas pour vous, cela peut être, car les deux fonctions SetWindowLong et GetWindowLong ont été remplacés et ne fonctionnent pas pour vous, et cela parce qu'ils sont compatibles avec uniquement Version 32 bits de Windows. Vous utilisez probablement la version 64 bits de Windows, puis utilisez SetWindowLongPtr et GetWindowLongPtr à la place, qui sont compatibles avec les deux 32 bits et 64 bits versions de Windows. MSDN informe que sur ces fonctions dans la section Remarque . Recherchez-les simplement sur ce site. Voici les liens vers eux:

http://msdn.Microsoft.com/en-us/library/windows/desktop/ms633591 (v = vs.85) .aspxhttp://msdn.Microsoft.com /en-us/library/windows/desktop/ms633584(v=vs.85).aspx

J'espère que tout cela répond à votre question.

6
user2133061

Cela supprime la barre de titre et les barres de défilement verticales ...

int main()
{
    HWND hwnd = GetConsoleWindow();
    // remove title bar
    LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
    lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
    SetWindowLong(hwnd, GWL_STYLE, lStyle);
    //remove vertical scrollbar
    ShowScrollBar(hwnd, SB_VERT, FALSE);

    cout << "Hello World! \n";
    system("pause");

    return 0;
}
1
pollaris