Форум: "Начинающим";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
ВнизПри SetWindowRgn заголовок окна меняет стиль на Win98 Найти похожие ветки
← →
И. Павел © (2010-09-06 09:39) [0]Здравствуйте.
Я написал функцию для анимации появления и закрытия окна. Функция меняет форму окна, вызывая SetWindowRgn. Но после первого же вызова SetWindowRgn, стиль заголовка моего окна меняется с WinXP на Win98 - появляется градиент, меняются системные кнопки. Можно, конечно, рисовать заголовки самому, но может быть есть более простой и удобный способ?
Подскажите, пожалуйста, как оставить заголовок окна исходным после SetWindowRgn? Или хотя бы “сбросить” регион окна после анимации?
Заранее спасибо.
← →
И. Павел © (2010-09-06 09:50) [1]Вот так получилось:
BorderStyle := bsNone;
BorderStyle := bsSizeable;
Но это обходной путь. Может быть есть какая-нибудь специальная, предназначенная именно для этого функция?
← →
Leonid Troyanovsky © (2010-09-06 10:46) [2]
> И. Павел © (06.09.10 09:50) [1]
> предназначенная именно для этого функция?
RecreateWnd?
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-09-06 10:53) [3]
> И. Павел © (06.09.10 09:39)
> Функция меняет форму окна, вызывая SetWindowRgn
А чего не AnimateWindow?
--
Regards, LVT.
← →
И. Павел © (2010-09-06 11:21) [4]> RecreateWnd
Спасибо. Работает. Жаль только он protected, придется либо "вскрывать" либо выкручиваться через ООП.
> AnimateWindow
У меня окно разворачивается по своему: как в "Штирлице", но не линиями, а четырьмя радиусами :)
← →
brother © (2010-09-06 11:27) [5]> но не линиями, а четырьмя радиусами :)
а можно демо?
← →
И. Павел © (2010-09-06 11:35) [6]> а можно демо?
У нас на работе все известные мне файлообменники закрыты.
Вот функция. Первый параметр - ссылка на форму. Если второй параметр = true, то форма открывается, если = false, то форма закрывается.
В onActivate можно вызвать ShowAnim(self, true), а в OnClose: ShowAnim(self, false).procedure ShowAnim(Frm: TForm; showing: boolean);
var R: Array [0..8] of HRGN;
P: Array [1..2, 1..8, 1..3] of TPoint;
P8: Array [1..8, 1..3] of TPoint;
w, h, i, j, k, AddX, AddY: integer;
ok: boolean;
Mas: Array[1..2] of integer;
pastTop: integer;
PastBorderStyle: TFormBorderStyle;
begin
Frm.Enabled := false;
for i := 1 to 2 do
for j := 1 to 8 do
begin
P[i][j][1].x := Frm.Width div 2; P[i][j][1].y := Frm.Height div 2;
end;
P[1][1][2].x := Frm.Width div 2; P[1][1][2].y := 0;
P[1][2][2].x := 0; P[1][2][2].y := 0;
P[1][3][2].x := 0; P[1][3][2].y := Frm.Height div 2;
P[1][4][2].x := 0; P[1][4][2].y := Frm.Height;
P[1][5][2].x := Frm.Width div 2; P[1][5][2].y := Frm.Height;
P[1][6][2].x := Frm.Width; P[1][6][2].y := Frm.Height;
P[1][7][2].x := Frm.Width; P[1][7][2].y := Frm.Height div 2;
P[1][8][2].x := Frm.Width; P[1][8][2].y := 0;
for i := 1 to 8 do
P[1][i][3] := P[1][i][2];
P[2][1][2].x := Frm.Width div 2; P[2][1][2].y:=0;
P[2][2][2].x := 0; P[2][2][2].y := 0;
P[2][3][2].x := 0; P[2][3][2].y := Frm.Height div 2;
P[2][4][2].x := 0; P[2][4][2].y := Frm.Height;
P[2][5][2].x := Frm.Width div 2; P[2][5][2].y := Frm.Height;
P[2][6][2].x := Frm.Width; P[2][6][2].y := Frm.Height;
P[2][7][2].x := Frm.Width; P[2][7][2].y := Frm.Height div 2;
P[2][8][2].x := Frm.Width; P[2][8][2].y := 0;
P[2][8][3].x := Frm.Width div 2; P[2][8][3].y := 0;
for i := 1 to 7 do
P[2][i][3] := P[2][i + 1][2];
for i := 1 to 8 do
begin
P8[i][1] := P[1][i][1];
P8[i][2] := P[1][i][2];
P8[i][3] := P[1][i][3];
end;
for i := 1 to 8 do
R[i] := CreateRectRgn(0, 0, 0, 0);
k := 0;
for j := 1 to 20 do
begin
k := k + 1;
for i := 1 to 8 do
if ((j <= 10) and (i mod 2 = 1)) or ((j > 10) and (i mod 2 = 0)) then
begin
if P[1][i][3].x <> P[2][i][3].x
then
begin
if P[1][i][3].x < P[2][i][3].x then P8[i][3].x := Ceil(P[1][i][3].x + (P[2][i][3].x - P[1][i][3].x) * k / 10.0)
else P8[i][3].x := Ceil(P[1][i][3].x - (P[1][i][3].x - P[2][i][3].x) * k / 10.0);
end;
if P[1][i][3].y <> P[2][i][3].y
then
begin
if P[1][i][3].y < P[2][i][3].y then P8[i][3].y := Ceil(P[1][i][3].y + (P[2][i][3].y - P[1][i][3].y) * k / 10.0)
else P8[i][3].y := Ceil(P[1][i][3].y - (P[1][i][3].y - P[2][i][3].y) * k / 10.0);
end;
DeleteObject(R[i]);
R[i] := CreatePolygonRgn(P8[i], 3, 1);
end;
if showing
then
begin
R[0] := CreateRectRgn(0, 0, 0, 0);
CombineRgn(R[0], R[0], R[1], RGN_OR);
CombineRgn(R[0], R[0], R[2], RGN_OR);
CombineRgn(R[0], R[0], R[3], RGN_OR);
CombineRgn(R[0], R[0], R[4], RGN_OR);
CombineRgn(R[0], R[0], R[5], RGN_OR);
CombineRgn(R[0], R[0], R[6], RGN_OR);
CombineRgn(R[0], R[0], R[7], RGN_OR);
CombineRgn(R[0], R[0], R[8], RGN_OR);
end
else
begin
R[0] := CreateRectRgn(0, 0, Frm.Width, Frm.Height);
CombineRgn(R[0], R[0], R[1], RGN_XOR);
CombineRgn(R[0], R[0], R[2], RGN_XOR);
CombineRgn(R[0], R[0], R[3], RGN_XOR);
CombineRgn(R[0], R[0], R[4], RGN_XOR);
CombineRgn(R[0], R[0], R[5], RGN_XOR);
CombineRgn(R[0], R[0], R[6], RGN_XOR);
CombineRgn(R[0], R[0], R[7], RGN_XOR);
CombineRgn(R[0], R[0], R[8], RGN_XOR);
end;
CombineRgn(R[0], R[0], CreateRectRgn(427, 0, 432, 5), RGN_OR);
CombineRgn(R[0], R[0], CreateRectRgn(0, 352, 5, 357), RGN_OR);
CombineRgn(R[0], R[0], CreateRectRgn(427, 0, 432, 5), RGN_XOR);
CombineRgn(R[0], R[0], CreateRectRgn(0, 352, 5, 357), RGN_XOR);
SetWindowRgn(Frm.Handle, R[0], true);
Application.ProcessMessages;
sleep(20);
if (k = 10) then k := 0;
end;
if showing
then
begin
R[0] := CreateRectRgn(0, 0, Frm.Width, Frm.Height);
CombineRgn(R[0], R[0], CreateRectRgn(427, 0, 432, 5), RGN_XOR);
CombineRgn(R[0], R[0], CreateRectRgn(0, 352, 5, 357), RGN_XOR);
end
else R[0] := CreateRectRgn(0, 0, 0, 0);
SetWindowRgn(Frm.Handle, R[0], false);
for i := 0 to 8 do DeleteObject(R[i]);
Frm.Enabled := true;
end;
← →
Leonid Troyanovsky © (2010-09-06 11:59) [7]
> И. Павел © (06.09.10 11:21) [4]
> придется либо "вскрывать" либо выкручиваться через ООП
Да он, вроде, и так виден. Попробуй на Self.
--
Regards, LVT.
← →
И. Павел © (2010-09-06 12:13) [8]> Попробуй на Self.
У меня функция анимации не является методом формы. Но все равно ее только 1 раз нужно использовать - под конец, так что буду просто вызывать после ShowAnim.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c