delphi - puedo - quitar botones cerrar minimizar maximizar vb net
¿Cómo se comportan los movimientos de Minimizar, Maximizar y Cerrar? (1)
La alta DPI es el disparador y conduce a la solución.
Las aplicaciones que exhiben el problema no son conscientes de alta DPI. La solución al problema de estacionario es informarles o activar el modo de compatibilidad asociado utilizando una de las soluciones en 1, 2 o 3.
Nota: si el resto de la aplicación se comportará correctamente cuando se activa el reconocimiento de DPI alto es otro problema y será diferente de la aplicación a la aplicación.
En el modo de compatibilidad, marque "Desactivar escalado de pantalla en configuraciones de PPP altas"
Llame a
SetProcessDPIAware
como la primera llamada en el archivo.dpr
, según lo notado por Ian Boyd, llamando a esta función puede pasar al estado de carrera y la forma preferida es usar el manifiesto. SetProcessDPIAwareUse el manifiesto personalizado con la configuración
true
otrue/PM
(el manifiesto predeterminado de Delphi incluido con "Habilitar los temas de tiempo de ejecución" no es muy sensible a DPI)
Las versiones actuales de los frameworks Delphi VCL y FMX carecen de soporte para el reconocimiento de DPI por monitor, por lo tanto, use el manifiesto true/PM
solo si usted está manejando el DPI por monitor usted mismo. Reportado a QP como VCL y FireMonkey carecen de compatibilidad DPI por monitor para Windows 8.1 (y Windows 10)
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
o
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
Actualizar:
Delphi VCL es una fuente de comportamiento TForm
, específicamente el problema está en algún lugar de la clase TForm
o sus antepasados. Cuando se usa Windows API directo, las ventanas resultantes se comportan normalmente.
Código API de Windows que se comporta correctamente:
MessageBox(0, ''Correct'', ''Caption'', MB_OK);
ShowMessage(''Correct''); // if themes are enabled -> Windows Task dialog is used
Aplicación de ejemplo completa de Delphi que crea la ventana principal sin usar VCL - se comporta correctamente
program win;
{$R *.res}
uses
Windows,
Messages,
SysUtils;
var
Msg: TMSG;
LWndClass: TWndClass;
hMainHandle: HWND;
function WindowProc(HWND, Msg: Longint; wParam: wParam; lParam: lParam): Longint; stdcall;
begin
if Msg = WM_DESTROY then PostQuitMessage(0);
Result := DefWindowProc(HWND, Msg, wParam, lParam);
end;
begin
LWndClass.hInstance := hInstance;
with LWndClass do
begin
lpszClassName := ''WinApiWnd'';
Style := CS_PARENTDC or CS_BYTEALIGNCLIENT;
hIcon := LoadIcon(hInstance, ''MAINICON'');
lpfnWndProc := @WindowProc;
hbrBackground := COLOR_BTNFACE + 1;
hCursor := LoadCursor(0, IDC_ARROW);
end;
RegisterClass(LWndClass);
hMainHandle := CreateWindow(LWndClass.lpszClassName, ''Window Title'', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, 0, 0, 360, 200, 0, 0, hInstance, nil);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Formas de VCL mal comportamiento:
var
f: TForm;
f := CreateMessageDialog(''Broken'', mtWarning, mbOKCancel, mbOk);
f.ShowModal;
f.Free;
f := TForm.Create(nil);
f.ShowModal;
f.Free;
En una aplicación Delphi, al pasar el mouse sobre un icono de borde, por ejemplo:
- Minimizar
- Maximizar
- Restaurar
no se comporta correctamente
Compare con una aplicación que se comporta correctamente:
Paso para reproducir
- Haga clic en Archivo , Nuevo , Solicitud de formularios VCL - Delphi
- Haga clic en Ejecutar (F9)
- Desplácese sobre los botones Minimizar, Maximizar o Cerrar.
¿Como arreglar?
- Windows 10, 64-bit (se ejecuta de forma nativa en la PC de escritorio)
- Delphi XE6
Editar - También falla con Delphi 7:
y en Delphi 5:
y en Delphi 4:
Supuse (es decir, tenía miedo) que fue causado por el motor de ThemeServices; donde podrían haber pensado que era genial no respetar las preferencias del usuario. Pero parece que es algo más fundamental.
Modos de compatibilidad
- ninguno : falla
- Windows 8 : falla
- Windows 7 : falla
- Windows Vista (Service Pack 2) : falla
- Windows Vista (Service Pack 2) : falla
- Windows Vista : falla
- Windows XP (Service Pack 3) (la desactivación del área no cliente): funciona
- Windows XP (Service Pack 2) (la desactivación del área no cliente está desactivada): funciona
- Windows 98 / Windows Me (tema no relacionado con el cliente desactivado): funciona
- Windows 95 (tema no relacionado con el cliente desactivado): funciona
Skype
También falla en Skype; también escrito en Delphi:
Alto DPI es el disparador
Finalmente descubrí por qué falla en cada máquina con Windows 10 que he usado; pero no para todos Alto dpi.
Establezca sus ppp en 97 (101%) o superior.
Suficientemente cerca
Las soluciones de Dalija funcionan:
Ignoraremos el problema con la información sobre herramientas y viviremos para luchar otro día.
También se debe tener en cuenta que Windows 10 sugerirá que deba cerrar sesión y volver a iniciar sesión para que algunas aplicaciones funcionen correctamente después de cambiar el DPI. Esto definitivamente es cierto para Delphi.
También se debe tener en cuenta que Delphi no tolera que el DPI cambie a sus espaldas de esta manera. Esto incluye ajustar el control deslizante del zoom . Esto también incluiría colocar la aplicación en cualquier monitor además del monitor principal.
Y nunca descubrimos cuál es el problema; solo lo impulsó en el futuro para usuarios que usan múltiples monitores.
Informe de error de QC
Porque Bor ... Impr ... CodeG ... Embarca ... El sitio de QC de Idera está detrás de un muro de pago, aquí hay una copia del informe de error:
Como puede ver: a nadie le importa.