-
Доброе время суток. Перевожу пример 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
-
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;
-
юзаешь kolform.onmessage и там обрабатываешь
-
Пробую вот так, но похоже без особого эффекта.
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); IF PtInRegion(rTitleBar, p.X, p.Y) AND (NOT PtInRect(SB1.BoundsRect, p))
THEN
Result := htCaption;
end;
end; 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;
...
Result.Form.OnMessage := Result.KOLForm1Message;
-
Есть ещё волшебная штука:
// onMouseDown if (позиция мыши совпадает с нужной, чтобы двигать окно) and (Mouse.Button=mbLeft) and (не нажаты шифт и т.п.) then begin ReleaseCapture; Form.Perform(WM_SYSCOMMAND, $F012, 0); // включает перетаскивание окна end;
-
если ты про это, конечно:)
-
Зачем определять регионы htCaption, если можно тупо принудительно послать сообщение Винде, что я УЖЕ НАЧАЛ двигать окно. Так проще, хоть это и недокументированно (и неправильно походу). Я еще в Win3.1 и 95 так делал на асме. Работает на ура и сейчас. Кстати, начиная с Висты, появилось несколько новых сообщений, например, "Окно передвинуто к левому/правому краю рабочего стола, и его надо развернуть по высоте полностью, а по ширине - наполовину ширины стола". Ни в msdn, ни в Делфях XE, ни в VS201x я не нашел упоминаний о новых константах... Методом тыка они конечно были найдены...
Мораль: честное программирование - зло:) Экспериментальное программирование ВСЕГДА спасает.
Даже Кладов согласен - он это доказал, создав MCK!:)
|