Как установить точные размеры клиентской области окна?
// Способ первый
// Для своего окна
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientWidth := 200;
ClientHeight := 200;
end;
// Способ первый
// Для любого окна
procedure SetClientRect(AHandle: THandle; AClientWidth, AClientHeight: Integer);
var
r: TRect;
b: Boolean;
begin
GetWindowRect(AHandle, r);
r.Right := r.Left + AClientWidth;
r.Bottom := r.Top + AClientHeight;
// Определяем есть ли меню
b := GetMenu(AHandle) > 0;
if b then
// Если есть, то видно ли оно
if GetMenuItemCount(GetMenu(AHandle)) = 0 then
// Если видно, корректируем размер
r.Bottom := r.Bottom - GetSystemMetrics(SM_CYMENU);
// Альтернативный способ определения видимости меню
// b := (GetMenu(AHandle) > 0) and (GetMenuItemCount(GetMenu(AHandle)) > 0);
// Корректируем размер с учетом видимости горизонтальной полосы прокрутки
if GetWindowLong(AHandle, GWL_STYLE) and WS_HSCROLL = WS_HSCROLL then
r.Right := r.Right + GetSystemMetrics(SM_CXHSCROLL);
// Корректируем размер с учетом видимости вертикальной полосы прокрутки
if GetWindowLong(AHandle, GWL_STYLE) and WS_VSCROLL = WS_VSCROLL then
r.Bottom := r.Bottom + GetSystemMetrics(SM_CYVSCROLL);
// Вычисление нового размера окна
AdjustWindowRectEx(r, GetWindowLong(AHandle, GWL_STYLE),
b, GetWindowLong(AHandle, GWL_EXSTYLE));
SetWindowPos(AHandle, HWND_TOP, r.Left, r.Top, r.Right - r.Left,
r.Bottom - r.Top, SWP_NOZORDER or SWP_NOMOVE);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetClientRect(Handle, 200, 200);
end;
|