Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.28;
Скачать: CL | DM;

Вниз

При 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1282036243
Scot Storch
2010-08-17 13:10
2010.11.28
ООП


2-1283783053
Hapastiks
2010-09-06 18:24
2010.11.28
ini файлы


3-1248350687
_drug_
2009-07-23 16:04
2010.11.28
проверка на null


15-1282595385
Юрий
2010-08-24 00:29
2010.11.28
С днем рождения ! 24 августа 2010 вторник


2-1283773342
guest
2010-09-06 15:42
2010.11.28
обновление датасета