Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Doubhnuts VCL->KOL [Delphi, Windows]


RusSun ©   (27.11.14 19:51

Доброе время суток.

Перевожу пример Doubhnuts.

Не знаю как правильно перевести события:

procedure WMNCHITTEST(var Msg: TWMNCHitTest);
     message WM_NCHITTEST;
   procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE);
     message WM_NCACTIVATE;
   procedure WMSetText(var Msg: TWMSetText);
     message WM_SETTEXT;


...


procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest);
begin
 Inherited;
 WITH Msg DO
   WITH ScreenToClient(Point(XPos,YPos)) DO
     IF PtInRegion(rTitleBar, X, Y) AND
      (NOT PtInRect(SB1.BoundsRect, Point(X,Y))) THEN
       Result := htCaption;
end;

procedure TForm1.WMNCActivate(var Msg: TWMncActivate);
begin
 Inherited;
 TitleBar(Msg.Active);
end;

procedure TForm1.WMSetText(var Msg: TWMSetText);
begin
 Inherited;
 TitleBar(Active);
end;


Оригинал VCL:
https://yadi.sk/d/lLndGKOKcyc5M
Сделал по своему, что получилось на KOL:
https://yadi.sk/d/UjSIIegkcyc5V


RusSun ©   (27.11.14 19:59[1]

  procedure WMNCHITTEST(var Msg: TWMNCHitTest);
     message WM_NCHITTEST;
   procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE);
     message WM_NCACTIVATE;
   procedure WMSetText(var Msg: TWMSetText);
     message WM_SETTEXT;

...
procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest);
begin
 Inherited;
 WITH Msg DO
   WITH ScreenToClient(Point(XPos,YPos)) DO
     IF PtInRegion(rTitleBar, X, Y) AND
      (NOT PtInRect(SB1.BoundsRect, Point(X,Y))) THEN
       Result := htCaption;
end;

procedure TForm1.WMNCActivate(var Msg: TWMncActivate);
begin
 Inherited;
 TitleBar(Msg.Active);
end;

procedure TForm1.WMSetText(var Msg: TWMSetText);
begin
 Inherited;
 TitleBar(Active);
end;


ParanoiS ©   (13.01.15 15:05[2]

юзаешь kolform.onmessage и там обрабатываешь


RusSun ©   (17.01.15 07:59[3]

Пробую вот так, но похоже без особого эффекта.

function KOLForm1Message(Sender: PControl;var Msg: tagMSG; var Rslt: Integer): Boolean;
...
function TForm1.KOLForm1Message(Sender: PControl;var Msg: tagMSG;
 var Rslt: Integer): Boolean;
 var p: TPoint;
             Msg1: TWMNChitTest;
             Msg2: TWMncActivate;

begin
 Result := FALSE;
 case Msg.message of
                      WM_NCHITTEST:begin
         getcursorpos(p);
 Inherited;
   WITH Msg1 DO                        Begin
  ScreenToClient(Sender.Handle,p); //WITH ScreenToClient(Point(XPos,YPos)) DO
     IF PtInRegion(rTitleBar, p.X, p.Y) AND (NOT PtInRect(SB1.BoundsRect, p))
      THEN
      Result := htCaption;
                                       end;
                                    end;//end wm_NCHITTEST
                     WM_NCACTIVATE:begin
                         Inherited;//не уверен что это надо добавлять???
                         TForm1.TitleBar(Msg2.Active);
                                   end;
                     WM_SETTEXT:begin
                         Inherited;//не уверен что это надо добавлять???
                         if Msg.message =WM_NCACTIVATE then
                         active:=true else  active:=false;
                                end;

 end;//end of Case
end;

...
Result.Form.OnMessage := Result.KOLForm1Message;


ParanoiS ©   (04.03.15 00:21[4]

Есть ещё волшебная штука:

// onMouseDown
if (позиция мыши совпадает с нужной, чтобы двигать окно) and (Mouse.Button=mbLeft) and (не нажаты шифт и т.п.) then
 begin
   ReleaseCapture;
   Form.Perform(WM_SYSCOMMAND, $F012, 0);
   // включает перетаскивание окна
 end;


ParanoiS ©   (04.03.15 00:22[5]

если ты про это, конечно:)


ParanoiS ©   (04.03.15 00:46[6]

Зачем определять регионы htCaption, если можно тупо принудительно послать сообщение Винде, что я УЖЕ НАЧАЛ двигать окно. Так проще, хоть это и недокументированно (и неправильно походу). Я еще в Win3.1 и 95 так делал на асме. Работает на ура и сейчас. Кстати, начиная с Висты, появилось несколько новых сообщений, например, "Окно передвинуто к левому/правому краю рабочего стола, и его надо развернуть по высоте полностью, а по ширине - наполовину ширины стола". Ни в msdn, ни в Делфях XE, ни в VS201x я не нашел упоминаний о новых константах... Методом тыка они конечно были найдены...

Мораль: честное программирование - зло:) Экспериментальное программирование ВСЕГДА спасает.

Даже Кладов согласен - он это доказал, создав MCK!:)


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо