-
-
Нужно отлавливать WM_THEMECHANGED и изменять что-то, только вот что?
-
> Если запустить программу и при выполнении её изменить стиль на стандартный(или классический) и наоборот.
Не парься! Вероятность это события стремится к нулю.
-
> стремится к нулю.
Но глюк, всё равно присутствует, частично.
-
Не могу понять, как обновить окно, чтобы избавиться от глюка[1]?
-
Запоминать ClientSize, по приходу WM_THEMECHANGED устанавливать его в прежнее значение.
-
Значит я делаю так: ... wWinSize : array[0..1] of Word; ... в OnCreate: wWinSize[0] := Form.ClientWidth; wWinSize[1] := Form.ClientHeight; ... OnMessage(WM_THEMECHANGED): Form.CanResize := True; Form.SetClientSize(wWinSize[0], wWinSize[1]); Form.CanResize := False; ...
Всё равно криво работает! Или я что-то не так делаю?
-
Попробуй без смены состояния CanResize.
-
У меня форма изначально CanResize := False, а при этом размеры поменять, без CanResize := True, CanResize := False, нельзя.
-
Вот примерчик. Если не обременит, проверь, как форма будет себя вести. program thickframetest;
uses
Windows, Messages, KOL;
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
private
form, btn1, btn2: PControl;
function formMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
procedure btn1Click(Sender: PObj);
end;
procedure NewForm1(var Result: PForm1; AParent: PControl);
begin
New(Result, Create);
with Result^ do
begin
form := NewForm(AParent,'Test');
form.Add2AutoFree(Result);
form.OnMessage := formMessage;
form.Style := form.Style and not (WS_THICKFRAME or WS_MAXIMIZEBOX);
btn1 := NewButton(form, 'Button1');
btn1.OnClick := btn1Click;
btn2 := NewButton(form, 'Button2').PlaceRight.ResizeParent;
end;
end;
procedure TForm1.btn1Click(Sender: PObj);
var r: TRect;
begin
r := form.ClientRect;
form.Style := form.Style xor (WS_THICKFRAME or WS_MAXIMIZEBOX);
form.ClientWidth := r.Right - r.Left;
form.ClientHeight := r.Bottom - r.top;
end;
function TForm1.formMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
begin
result := false;
end;
var Form1: PForm1;
begin
NewForm1(Form1, nil);
Run(Form1.form);
end.
-
При запуске программы и при смене тем окно остаётся нормальным, т.б. никаких глюков[1] не наблюдается!
При нажатии на Button1 форма поднимается по диагонали справа на лево и опускается слева на право.
-
При создании нужно поставить and not (WS_THICKFRAME or WS_MAXIMIZEBOX) и всё нормально(или нужно вообще убрать его и asm'блерной части - хотя не проверял).
А в XP нормально работает [9]?
-
Чтобы форма не прыгала нужно btn1Click изменить так: var r: TRect; p: TPoint; formsize: TSize;
begin
form.BeginUpdate;
r := form.ClientRect;
p := form.Position;
formsize.cx := form.Width;
formsize.cy := form.height;
form.Style := form.Style xor (WS_THICKFRAME or WS_MAXIMIZEBOX);
form.ClientWidth := r.Right - r.Left;
form.ClientHeight := r.Bottom - r.top;
form.Position := MakePoint(p.X + (formsize.cx - form.Width) div 2, p.y + (formsize.cy - form.Height) div 2);
form.EndUpdate;
end; > А в XP нормально работает [9]?Нормально.
-
Вопрос решён! Спасибо!
|