![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
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!:)
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |