Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

Вот привожу код и пусть кто мне сможет сказать что нем   Найти похожие ветки 

 
Программер_   (2004-09-18 15:47) [0]

что-нить не так!


PROCEDURE  RebuildWindowRgn(Sender:TPageControl);

VAR FullRgn, Rgn,CurrentRgn: Hrgn;
   LeftCl,TopCl,ClientX, ClientY, I,P,CWidth,CHeight: Integer;
BEGIN
 WITH Sender DO
   BEGIN
     //определяем координаты закладок
     CWidth := TabRect(PageCount-1).Right;
     CHeight := TabRect(0).bottom-TabRect(0).top+3;
     // определяем относительные координаты клиенской части
     ClientX := (Width - ClientWidth) DIV 2;
     ClientY := Height - ClientHeight - ClientX;
     // создаем регион для всей формы
     FullRgn := CreateRectRgn(0, 0, Width, Height);
     // создаем регион для клиентской части формы
     // и вычитаем его из FullRgn
     Rgn := CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY +
            ClientHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
     //Создаем реион закладок и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,0,CWidth,CHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     //Создаем регион между закладками и TabSheet и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,Cheight,Width,CHeight-1);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     // теперь добавляем к FullRgn регионы каждого контрольного элемента
   END;
 WITH Sender.ActivePage DO
   BEGIN
     FOR I:= 0 TO ControlCount -1 DO
       WITH Controls[I] DO
         BEGIN
           TopCl := Top+Sender.ActivePage.Top;
           LeftCl := Left+Sender.ActivePage.Left;
           Rgn := CreateRectRgn(ClientX + LeftCl, ClientY + TopCl, ClientX + LeftCl +
                  Width, ClientY + TopCl + Height);
           CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
         END;
   END;
 SetWindowRgn(Sender.Handle,FullRgn,true);
END;


 
DiamondShark ©   (2004-09-18 15:51) [1]


> ClientY := Height - ClientHeight - ClientX;

Эт чяво?


 
Чайник   (2004-09-18 18:28) [2]

Каждый раз при вызове процедуры типа Create...Rgn под него выделяется память и его Handle помещается в стек. В приведенной процедуре я увидел пять вызовов Create. Так что удивляться, что после нескольких десятков вызовов данной процедуры стек переполняется???
   После того, как использовал регион, убивай его:
   DeleteObject(Rgn);


 
Чайник   (2004-09-18 18:32) [3]

В данной программе, как мне кажется, Rgn надо убивать каждый раз после вызова CombineRgn, а регион FullRgn - после SetWindowRgn.


 
Igorek ©   (2004-09-18 19:06) [4]


> Программер_   (18.09.04 15:47)  
> что-нить не так!

Ага. Все.


 
Программер_   (2004-09-19 14:27) [5]

Фух огромное спасибо исправился...
все или может еще что-нить не то?

PROCEDURE  RebuildWindowRgn(Sender:TPageControl);

VAR FullRgn, Rgn,CurrentRgn: Hrgn;
   LeftCl,TopCl,ClientX, ClientY, I,P,CWidth,CHeight: Integer;
BEGIN
 WITH Sender DO
   BEGIN
     //определяем координаты закладок
     CWidth := TabRect(PageCount-1).Right;
     CHeight := TabRect(0).bottom-TabRect(0).top+3;
     // определяем относительные координаты клиенской части
     ClientX := (Width - ClientWidth) DIV 2;
     ClientY := Height - ClientHeight - ClientX;
     // создаем регион для всей формы
     FullRgn := CreateRectRgn(0, 0, Width, Height);
     // создаем регион для клиентской части формы
     // и вычитаем его из FullRgn
     Rgn := CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY +
            ClientHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
     DeleteObject(Rgn);
     //Создаем реион закладок и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,0,CWidth,CHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     DeleteObject(Rgn);
     //Создаем регион между закладками и TabSheet и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,Cheight,Width,CHeight-1);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     DeleteObject(Rgn);
     // теперь добавляем к FullRgn регионы каждого контрольного элемента
   END;
 WITH Sender.ActivePage DO
   BEGIN
     FOR I:= 0 TO ControlCount -1 DO
       WITH Controls[I] DO
         BEGIN
           TopCl := Top+Sender.ActivePage.Top;
           LeftCl := Left+Sender.ActivePage.Left;
           Rgn := CreateRectRgn(ClientX + LeftCl, ClientY + TopCl, ClientX + LeftCl +
                  Width, ClientY + TopCl + Height);
           CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
           DeleteObject(Rgn);
         END;
   END;
 SetWindowRgn(Sender.Handle,FullRgn,true);
 DeleteObject(FullRgn);
END;



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.066 c
9-1086296342
Inspired
2004-06-04 00:59
2004.10.10
Как вращать, например, квадрат без искажений в OpenGL?


1-1096117436
Cherepovets
2004-09-25 17:03
2004.10.10
Проверка пути


4-1094715591
cheburator
2004-09-09 11:39
2004.10.10
Компоненты для работы с графикой из под WIN API ????


3-1094996828
Артем Владимирович
2004-09-12 17:47
2004.10.10
Взаимодействие приложения с удаленной БД


11-1081262281
m5
2004-04-06 18:38
2004.10.10
Как сделать в КОЛ всплывающее окошко с подсказками?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский