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

Вниз

Перехват WM_LBUTTONDOWN в потомке THintWindow   Найти похожие ветки 

 
Rouse_   (2002-12-15 23:32) [0]

Здравствуйте ув. Мастера!
Вопросы я задаю очень редко, за неимением таковых, но вот столкнулся с небольшой проблемой. Создал наследника от THintWindow, и не могу поймать сообщение WM_LBUTTONDOWN. Самое интересное что он наследуется от TCustomControl в котором это сообщение абсолютно нормально перехватывается. Просто компонент не будет иметь хорошей функциональности без закрытия этого хинта щелчком мышки :(
Где руки выпрямить?

С уважением и заранее спасибо


 
Rouse_   (2002-12-15 23:45) [1]

Чтобы не быть голословным вот пример кода

type TMyHint = class(THintWindow)
public
constructor Create(Sender: TComponent); override;
procedure WMLBTNDOWN(var Message: TMessage); message WM_LBUTTONDOWN;
end;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var H: TMyHint;
begin
h := TMyHint.Create(Self);
end;

{ TMyHint }

constructor TMyHint.Create(Sender: TComponent);
var
Rect:Trect;
begin
inherited ;
Rect.Top := 100;
Rect.Left := 100;
Rect.Right := 200;
Rect.Bottom := 200;
ActivateHint(Rect,"123");
end;

procedure TMyHint.WMLBTNDOWN(var Message: TMessage);
begin
ReleaseHandle;
end;

end.


И вот что делать, ума не приложу :(


 
Snap   (2002-12-15 23:49) [2]

Извините за может быть глупый вопрос, но что разве окну сообщения типа wmlbuttondown посылаются всегда, даже если мышь была нажата за пределами этого окна?


 
Rouse_   (2002-12-15 23:55) [3]

> Самое интересное что он наследуется от TCustomControl
Имеется ввиду THintWindow наследуется :))


 
Rouse_   (2002-12-16 00:02) [4]

> Snap © (15.12.02 23:49)
Имется ввиду WM_LBUTTONDOWN посланное естественно THintWindow, тоесть по щелчку на самом хинте. Сам он постепенно сворачивавется по таймеру, по идее он выводит информацию о текущих событиях в программе, и вот когда их много (каждое новое сообщение добавляется в хинт в виде новой строки и постепенно они пропадают, каждое сообщение по отдельности) так вот когда их много хинт иногда разворачивается на большую область экрана и былобы удобно закрыть его простым щелчком по нему, но вот это и есть моя проблема :(


 
Snap   (2002-12-16 00:04) [5]

А там нет процедуры MouseClick, или типа того которую можно перекрыть. Она должна вызываться чем- то(?) как раз когда это окно получит мессагу о том мышка кликнула.


 
Rouse_   (2002-12-16 00:11) [6]

> Snap © (16.12.02 00:04)
А при чем тут MouseClick?

procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True;
if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);
end;

Вот ее реализация


 
Snap   (2002-12-16 00:18) [7]

Ладно объясню поподробнее. Если не нравится маусклик, попробуй майс даун. Так вот нет ли в предке процедуры MouseDown? Если есть, попробуй перекрыть её (override) и в новом обработчике делать то что эта фича должна делать при нажатии мышки на ней. Потому как по своему опыту знаю что процедуры с такими имеными вызываются обычно при событиях, которые отображаются в названиях. (пример: Paint).

С уважением,


 
Rouse_   (2002-12-16 00:29) [8]

:)) Ну хорошо, вот только зачем мне переопределять событие, когда я могу перехватить сообщение генерирующее вызов этого события? Если я не могу перехватить сообщение значит события OnMouseDown ну хоть тут тресни не будет (тем более что его нет в THintWindow но оно присутствует в TControl его прапрапредке). Я думаю что проблема именно в

Style := WS_POPUP or WS_BORDER;
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
if NewStyleControls then ExStyle := WS_EX_TOOLWINDOW;
AddBiDiModeExStyle(ExStyle);


Это перекрытие параметров в самом THintWindow. Но беда, если я верну параметры на место, то это уже не будет THintWindow :(


 
Rouse_   (2002-12-16 20:01) [9]

Эх уползла веточка :(

У кого нибудь еще идеи есть?

Заранее спасибо


 
Бурундук   (2002-12-16 20:07) [10]

Дело, полагаю, вот в чём:

procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTTRANSPARENT;
end;

Т.е., насколько я понимаю, Windows считает, что
у THintWindow нет клиентской области,
все сообщения мыши посылает окну, лежащему под ним.


 
Rouse_   (2002-12-17 20:02) [11]

> Бурундук (16.12.02 20:07)

Спасибо за подсказку, это действительно то из-за чего и происходил тот глюк, но вот выползает другая проблема :(

При перехвате сообщения WM_NCHitTest и возврате результата
Message.Result := HTCLIENT; хинт закрыается как и должно быть но после его закрытия перестает нормально работать окно программы. Сейчас бьюсь над решением проблемы, но если кто-то с этим уже сталкивался и смог преодолеть то былобы великолепно если бы вы подтолкнули меня в верном направлении

Заранее спасибо


 
Rouse_   (2002-12-18 23:02) [12]

Жалко конечно что нет ответов, Но!! с другой стороны это хорошо, подсказка мне дана, и я вижу верный путь. Просто у меня огромная нагрузка и я просто не успеваю решить все проблемы сразу (сейчас пишу большую коллекцию компонент для частного проекта на заказ, за деньги есессно). Обещаю что как только решу проблему, сразу опубликую ее либо здесь, либо в новой ветке (если эта канет в небытиё). но на всякий случай повторюсь, если эта проблема кем то уже решена, дайте пожалуйста пинок. (Еще один :)

С уважением и заранее спасибо



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

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

Наверх





Память: 0.59 MB
Время: 0.04 c
14-99309
Mad_Ghost
2002-12-10 10:50
2002.12.30
DBF не через BDE


14-99317
Дмитрий К.К.
2002-12-10 11:16
2002.12.30
Кто работал с эмулятором UnrealSpeccy


14-99304
Дремучий
2002-12-09 22:49
2002.12.30
Подскажите как написать подобное на MySQL....


1-99189
Sabor
2002-12-18 16:54
2002.12.30
ТForm


14-99359
mike123
2002-11-29 17:46
2002.12.30
как апустить приложение kylix





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