![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WMNCHITTEST и HTCAPTION
DevilDevil © (2007-08-27 18:09:00):)
была проблема с прорисовкой содержимого панели:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1186402346
всё помогло, но...
теперь панели не приходят мышиные события (в частности MouseDown и MouseUp). Подозреваю, что и MouseMove Не приходит.
В общем, очень нужно решить проблему. Помогите, пожалуйста.
DevilDevil (2007-08-29 10:54:00) [1]> Юрий Зотов © (28.08.07 20:17) [12]
повторение - мать
Юрий Зотов (2007-08-28 20:17:00) [2]> DevilDevil © (28.08.07 16:17) [11]
> если TWMNCHITTEST.Result = HTCAPTION, то автоматически происходит
> очень интересна чтука - окно (компонент) "автоматически" перемещается,
> дополнительного ничего реализовывать не надо
И об этой "очень интересной чтуке" было сказано в [3].
:о)
DevilDevil (2007-08-28 16:17:00) [3]> Юрий Зотов © (28.08.07 15:35) [10]
ты про панель на тулбаре ?
- это не то.
Проблему решил. Если кому пригодится, мой отчёт:
- еслиTWMNCHITTEST.Result = HTCAPTION, то автоматически происходит очень интересна чтука - окно (компонент) "автоматически" перемещается, дополнительного ничего реализовывать не надо
- в качестве минуса - не приходят мышиные события
- по идее должны приходить неклинтские мышиные сообщения
-WM_NCLBUTTONDOWNприходит,MouseMoveнаверное тоже... а вотWM_NCLBUTTONUPмне по какой то причине перехватить не удалось - само сообщение не приходит. Хотя, возможно, у меня слишком кривые руки
- проблема решается ОЧЕНЬ ПРОСТО, вPaint-е моего окна, вызываюRefreshу фрейма.
Вот и всё.
Всем участникам большое спасибо!
Юрий Зотов (2007-08-28 15:35:00) [4]> DevilDevil © (28.08.07 14:40) [9]
Плавающие панели инструментов.
DevilDevil (2007-08-28 14:40:00) [5]> Юрий Зотов © (28.08.07 13:55) [8]
что есть и как в моём случае использовать " стандартные панели инструментов" ?
Юрий Зотов (2007-08-28 13:55:00) [6]> DevilDevil © (28.08.07 12:02) [6]
А ради чего такие изврашения? Не проще ли использовать стандартные панели инструментов?
DimaBr (2007-08-28 12:41:00) [7]А если попробывать убрать фрэйм, и просто накидать контролов ???
type
TPanel = class(ExtCtrls.TPanel)
procedure WMNCHITTEST(var M: TWMNCHITTEST); message WM_NCHITTEST;
procedure paint;override;
end;
TForm3 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Edit1: TEdit;
Button2: TButton;
CheckBox2: TCheckBox;
Label1: TLabel;
Panel3: TPanel;
Label2: TLabel;
Edit2: TEdit;
Button3: TButton;
CheckBox3: TCheckBox;
private
{ Private declarations }
public
end;
var
Form3: TForm3;
implementation
procedure TPanel.paint;
begin
inherited;
Canvas.Brush.Color := clBtnFace;
Canvas.FillRect(ClientRect);
Canvas.Brush.Color := clBlue;
Canvas.FillRect(Rect(0,0,Width,20));
end;
procedure TPanel.WMNCHITTEST(var M: TWMNCHITTEST);
var R: TRect;
P: TPoint;
begin
if not (csDesigning in ComponentState) then begin
R := ClientRect;
R.Bottom := R.Top + 20;
P := ScreenToClient(Point(M.XPos, M.YPos));
if PtInRect(R,P)
then M.Result := HTCAPTION
else inherited;
end
else inherited
end;
Накидал на панель кучу контролов, и скопировал её - получилось две одинаковые панели. Таскаются и перерисовываются нормально.
DevilDevil (2007-08-28 12:02:00) [8]хмм... попробовал повторить в новом прокте - пока не получается...
так изложу суть.
есть так называемые окна. на основе TCustomControl. на панели похожи. Их можно за заголовок таскать.
иерархия каждого "окна": Panel->Frame->Все остальные компоненты.
На одном из таких окон множество различных панелей, эдитов, etc.
Так вот если над этим окном поперемещать другое окно, то все компоненты такого окна оень плохо (читай редко) перерисовываются. Вот я и спрашиваю, как корректнее решить такую проблему.
DimaBr (2007-08-28 11:17:00) [9]Не видя ни строчки вашего кода я не вижу и проблеммы. У меня все окна перерисовываются корректно.
DevilDevil (2007-08-28 10:36:00) [10]эээ...
в том то и дело, что если указывать HTCAPTION, то окна под моим прорисовываются корректно.
Тогда возвращаемся к сабжу того топика.
Как можно решить иначе?
DimaBr (2007-08-28 10:22:00) [11]Действительно. проблема в логике.
Каждое окно (TWinControl) обладает некиими зонами (зона заголовка, зоны бордюра, зона системного меню, тело окна..... и т.д.).
Перехватим событие WM_NCHITTESTмы обманываем систему, указывая что мышь находится в зоне ЗАГОЛОВКА ОКНА. Тогда нажав левую кнопку мыши можно таскать окно, при этом никакиеOnMouseDown, OnMouseMove, OnMouseUp,SetBoundsне нужны.
Данный метод никоим образом не влияет на прорисовку окна.
DevilDevil (2007-08-28 10:11:00) [12]> DimaBr © (28.08.07 08:36) [1]
помоему, проблема в логике.
у моего "окна" есть заголовок, перемещение окна производится вручную, при помощиOnMouseDown,OnMouseMove,OnMouseUpиSetBounds. + в мышиных событиях производится ещё несколько полезных действий.
ЕслиM.Result := HTCAPTION, то блокируются мышиные события.
Может есть другой способ перерисовки окон снизу ?
Заранее благодарен.
DimaBr (2007-08-28 08:36:00) [13]Подозреваю что виноват Inherited, событие от мыши дальше не обрабатывается