winapi - quitar - personalizar formularios visual basic
¿Quitar el borde de la ventana? (4)
Tengo una ventana con un borde sólido a su alrededor. ¿Cómo puedo eliminar el borde (todo el área no cliente) usando SetWindowLong y GetWindowLong ?
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 se define como (WS_BORDER | WS_DLGFRAME). Puede salirse con la suya eliminando solo estos dos estilos, ya que el menú maximizar y minimizar el sistema desaparecerá cuando desaparezca el título, pero también es mejor eliminarlos.
También es mejor eliminar los estilos de borde extendido.
LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);
Y finalmente, para obtener su ventana para volver a dibujar con los estilos modificados, puede usar SetWindowPos.
SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
Esta línea de código a continuación elimina el borde de cualquier ventana dada, y sigue siendo solo su cliente:
SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);
Puede usar WS_POPUPWINDOW
en su lugar en el tercer parámetro de la función SetWindowLong
. También elimina los bordes de la ventana dada y también funciona, pero la diferencia es que también dibuja el rectángulo negro delineado en todo el cliente restante de la ventana. El grosor de ese rectángulo es de 1 píxel. WS_POPUP
no dibuja ese rectángulo, en realidad no dibuja nada, solo elimina los bordes de la ventana.
Si está a punto de devolver los bordes de la ventana, antes de usar esa línea de código que publiqué arriba, llame primero a la siguiente línea de código:
GetWindowLong(hWnd /*The handle of the window that you want to remove its borders and later return them back to it*/, GWL_STYLE);
pero, por supuesto, esta función retoma los estilos de la ventana, así que crea una nueva variable que mantendrá estos estilos, es decir, establece esta variable en el valor de retorno de esa función.
Luego usa SetWindowLong
como muestro arriba para eliminar sus bordes, y cuando más tarde quiera restablecer sus bordes, simplemente vuelva a llamar SetWindowLong
, los primeros dos parámetros son los mismos (hWnd y GWL_STYLE), pero el tercer parámetro son los estilos del ventana que regresó de GetWindowLong
. Si no desea llamar a GetWindowLong
, pero aún así devolver los bordes de la ventana, puede usar SetWindowLong
con los mismos primeros dos parámetros, y en el tercer parámetro, puede usar uno de los siguientes: WS_OVERLAPPED
o / y WS_OVERLAPPEDWINDOW
y / y WS_SIZEFRAME
.
NOTA: Si prueba mi respuesta, pero no funciona para usted, puede ser porque ambas funciones, SetWindowLong
y GetWindowLong
han sido reemplazadas y no funcionan para usted, y porque son compatibles solo con 32- versión bit de Windows. Probablemente está utilizando la versión de 64 bits de Windows, luego use SetWindowLongPtr
y GetWindowLongPtr
, que son compatibles con las versiones de Windows de 32 bits y de 64 bits . MSDN informa eso acerca de estas funciones en la sección Nota . Simplemente búscalos en ese sitio. Aquí están los enlaces a ellos:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms633584(v=vs.85).aspx
Espero que todo esto responda tu pregunta.
Esto elimina la barra de título y las barras de desplazamiento vertical ...
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;
}
Los siguientes códigos Delphi lo hacen:
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);
Por supuesto, estas llamadas API tienen el mismo aspecto en todos los idiomas.