![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Координаты [D7, Win95/98]
tytus © (2003-04-27 13:33:00)Как узнать координаты мышки на форме и попал ли указатель мышки на кнопку? Пробовал WMMouse - не получаеться, пишет пятизначные цифры (координаты вывожу в Edit).
procedure TForm1.MouseEnter(var Msg:TWMMouse);
begin
edit1.Text:=IntToStr(msg.XPos);
edit2.Text:=inttostr(msg.YPos);
end;
default (2003-04-27 16:31:00) [1]без разницы
Illusion (2003-04-27 16:10:00) [2]это код написанный в билдере за 2 минуты... Те показать обработчик нормального окна, который я юзаю в VC++? :)
default (2003-04-27 16:06:00) [3]to Illusion
чё уж ты здесь особо с нуля-то...
в Delphi всё то же самое, дык всё Win32 API
Illusion (2003-04-27 16:03:00) [4]в паскаль перегнать не должно составить труда... Звиняте, что не на дельфях, давно уже снёс за ненадобностью... На всё хватает Билдера и MSVC++...
Illusion (2003-04-27 16:02:00) [5]2 tytus
сорри, стормозил... Это те на VС++, где всё с нуля обрабатываешь... Я просто всё делаю вручную и несколько иначе :). В дельфи видно различают указатели отедльных частей окон... Так быть и должно, в приницпе... Я знаю, чтог теюе от этого не легче:)... вот потому и предлагаю тебе такой код. В билдере пашет...
main.h
...
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall OnIdle(System::TObject* Sender, bool &Done);
void __fastcall MouseMove(int x, int y);
};
...
main.cpp
...
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = OnIdle;
}
void __fastcall TForm1::OnIdle(System::TObject* Sender, bool &Done)
{
if(Form1->Active)
{
POINT pt;
GetCursorPos(&pt);
MouseMove(pt.x,pt.y);
}
}
void __fastcall TForm1::MouseMove(int x, int y)
{
x;
y;
}
...
в x,y у тебя будет координата мышки относительно ЭКРАНА, а не формы.... Чтобы получить относительно формы
x = x - Form1->Left;
y = y - Form1->Top;
tytus (2003-04-27 15:34:00) [6]Ладно. ВСЕМ спасибо, С ПРАЗДНИКОМ ВАС. Немного подучусь... А сейчас более не смею более утруждать мастеров. До скорых встреч. BYE!!!
tytus (2003-04-27 15:24:00) [7]to default
Рисую я TCustomControl, а потом в конструкторе Parent:=AOwner as TWinControl; Не знаю, может не правильно, но работает.....
to Illusion
procedure move(var msg:TWMMouse);message WM_MOUSEMOVE;
procedure TForm1.move(var msg:TWMMouse);
begin
caption:="X="+inttostr(msg.XPos)+" | "+"Y="+inttostr(msg.YPos);
end;
Работает, но когда мышь над кнопкой - не работает...
Мне что, вписать в процу Sender:TObject????
Illusion (2003-04-27 15:13:00) [8]MouseEnter по сути тот же моус мув... Только работаю с Маус Муом ты можешь контролировать ВЕСЬ процесс, и написать только что тебе нужно, в отличии от MouseEnter, где програмисты Борладна написали свой код, над заметить, не совсем быстрый. Все заорут, ну и что, млин, подумаешь на пару тактов проца будет больше и т.п... А ничё, отвечу я... Это сейчас для вас не критично. А вот будете писать OpenGL API, с контекстом окна, и обрабатывая мышку, вот тогда это буедт оч. критично.
З.Ы. Установив ОДИН оброточик MouseMove на форму, можно отлавливать ВСЕ перемещения мышки по форме, в то время, когда у тебя много компонентов, и на каждый ставить MouseEnter и т.п... это всё дело разбирать несчастному WNDProc-у... Да, на 4 пне, если просто окошко даже ничего заметно не будет... Только опретиву жрать... Но ведь не у всех 4 пни, и паралельно может быть запущенно всё что угодно...
default (2003-04-27 15:12:00) [9]ты кнопку GDI(или оболочку - TCanvas) рисуешь что ли или она потомок TWinControl?
default (2003-04-27 15:00:00) [10]в обраб-ке FormMouseMove что по сути тоже самое
default (2003-04-27 14:58:00) [11]to tytus
ну ты даёшь...
обработчик-то как называется?
Button1MouseMove
обрабатывай WM_MOUSEMOVE формы и вычисляй по координатам факт попадания курсора мыши на твою кнопку
tytus (2003-04-27 14:58:00) [12]...для кнопки работает... а для формы - нет....
tytus (2003-04-27 14:53:00) [13]написал такой обработчик:procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
caption:=sender.ClassName;
end;
но кроме кнопки ничего не определяет (на форму накидал ListBox, Button,RadioButton....)
Song (2003-04-27 14:38:00) [14]А чем тебя CM_MOUSEENTER не устраивает?
Illusion (2003-04-27 14:37:00) [15]2 tytus
ты про MouseMove слышал? делаешь флаг, когда MouseMove указывает, что ты навёл на контрол, устанавливаешь его true, когда видишь. что сваливает, делаешь false. Что тебе делать с этим флагом? всё что хочешь...
tytus (2003-04-27 14:31:00) [16]to Default
Цель простая - нужно отследить событие когда мышка появляется над контролом и когда его покидает. (к примеру можно потом менять цвет контрола - я пробую рисовать свои кнопки, но пока дальше регистрации компонента дело не заходит - не получаеться нарисовать внешне).
default (2003-04-27 14:22:00) [17]to tytus
цель какая?
Illusion (2003-04-27 14:04:00) [18]не знаю как в Дельфях, но в Билдере MouseEnter несколько другое делает... :)
tytus (2003-04-27 14:00:00) [19]Yanis
Да это понятно. Но мне бы хотелось разобраться с WMMouse; procedure MouseEnter(var Msg:TWMMouse);message CM_MOUSEENTER;
procedure MouseLeave(var Msg:TWMMouse);message CM_MOUSELEAVE;
Подскажи что сдесь не так. И мне бы хотелось применить это сообщение к кнопке...
Yanis (2003-04-27 13:52:00) [20]
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Form1.Caption:=("X="+IntToStr(x)+"|"+"Y="+IntToStr(y));
end;
Чем тебя это не устраивает?