Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1283683267
Hapastiks
2010-09-05 14:41
2010.11.28
заголовок сообщения


3-1248293189
GanibalLector
2009-07-23 00:06
2010.11.28
cannot attach to password database


2-1284097285
12
2010-09-10 09:41
2010.11.28
FormCloseQuery. И close. одно без другого возможно (ORA-03113)


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


2-1284094963
6ruse
2010-09-10 09:02
2010.11.28
зачеркивание в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский