Вверх ↑
Этот топик читают: Гость
Ответов: 1304
Рейтинг: 405
#1: 2014-04-16 16:39:18 ЛС | профиль | цитата
Всё просто и понятно но не работает .
Помогите найти координату x для текущей позиции курсора в клиентской области активного окна, если я правильно понял цитату
Функция GetCurrentPositionEx извлекает информацию о текущей позиции в логических координатах.
Add(MainForm,2953706,140,63)
{
Width=346
Height=240
Position=1
Point(Handle)
}
Add(InlineCode,4182753,140,112)
{
WorkPoints=#5:doGet|
EventPoints=#5:onGet|9:onGetBOOL|
DataPoints=#6:Handle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: DC:HDC;|14: pos:TPoint;|9: public|21: onGet:THI_Event;|25: onGetBOOL:THI_Event;|22: Handle:THI_Event;|49: procedure doGet(var Data:TData; index:word);|5: end;|0:|14:implementation|0:|56:procedure THiAsmClass.doGet(var Data:TData; index:word);|5:begin|43: DC := GetDC(ReadInteger(Data,handle,0));|42: if GetCurrentPositionEx(DC, @pos) then |31: _hi_OnEvent(onGetBOOL, 'Да')|7: else|33: _hi_OnEvent(onGetBOOL, 'Нет');|29: _hi_OnEvent(onGet, pos.x);|5: end;|0:|4:end.|
link(Handle,2953706:Handle,[])
link(onGet,3644855:doText,[])
link(onGetBOOL,1264290:doText,[(180,125)(180,209)])
}
Add(Timer,15923945,91,112)
{
Interval=100
link(onTimer,4182753:doGet,[])
}
Add(Edit,3644855,189,112)
{
Left=45
Top=20
Width=70
}
Add(Label,11053676,189,63)
{
Left=10
Top=20
Width=29
Height=17
Caption="pos.x"
}
Add(Edit,1264290,189,203)
{
Left=205
Top=20
Width=70
}
Add(Label,10251844,189,161)
{
Left=145
Top=25
Height=17
Caption="Успешно"
}


карма: 3

0
Ответов: 9906
Рейтинг: 351
#2: 2014-04-16 17:21:13 ЛС | профиль | цитата
А где написано, что GetCurrentPositionEx имеет какое-то отношение к позиции курсора....
Лично я - не нашел
карма: 9

1
Голосовали:MAV
Ответов: 4631
Рейтинг: 749
#3: 2014-04-16 17:21:54 ЛС | профиль | цитата
Эта функция возвращает не позицию курсора, а позицию "карандаша" (Pen) для рисования. Для курсора поищи функции в других разделах, а не GDI. Например, GetCursorPos, а потом из полученных координат - ScreenToClient.

Add(MainForm,9413013,448,231)
{
Width=346
Height=240
Position=1
Point(Handle)
}
Add(InlineCode,4182753,448,280)
{
WorkPoints=#5:doGet|
EventPoints=#5:onGet|9:onGetBOOL|
DataPoints=#6:Handle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: DC:HDC;|14: pos:TPoint;|9: public|21: onGet:THI_Event;|25: onGetBOOL:THI_Event;|22: Handle:THI_Event;|49: procedure doGet(var Data:TData; index:word);|5: end;|0:|14:implementation|0:|56:procedure THiAsmClass.doGet(var Data:TData; index:word);|3:var|13: H: THandle;|5:begin|34: H := ReadInteger(Data,handle,0);|20: GetCursorPos(pos);|25: ScreenToClient(H, pos);|28: _hi_OnEvent(onGet, pos.x);|4:end;|0:|0:|4:end.|
link(onGet,3644855:doText,[])
link(onGetBOOL,1264290:doText,[(488,293)(488,377)])
link(Handle,9413013:Handle,[])
}
Add(Timer,15923945,350,280)
{
Interval=300
link(onTimer,4182753:doGet,[])
}
Add(Edit,3644855,497,280)
{
Left=45
Top=20
Width=70
}
Add(Label,11053676,497,231)
{
Left=10
Top=20
Width=29
Height=17
Caption="pos.x"
}
Add(Edit,1264290,497,371)
{
Left=205
Top=20
Width=70
}
Add(Label,10251844,497,329)
{
Left=145
Top=25
Height=17
Caption="Успешно"
}

карма: 26

1
Голосовали:MAV
Ответов: 1304
Рейтинг: 405
#4: 2014-04-16 23:00:08 ЛС | профиль | цитата
Galkov, Netspirit, спасибо за подсказку. Вы спасли мой мозг от нервного истощения . Netspirit, про пару GetCursorPos - ScreenToClient я знал, только не хотелось делать лишние вычисления по отсечению позиций внеоконных областей.
------------ Дoбавленo в 23.00:
Далее пример как с помощью функций winapi определять положение курсора для клиентской области окна.
Add(MainForm,9413013,168,28)
{
Color=-16777206
BorderStyle=0
Position=1
Point(Handle)
Point(MouseX)
Point(MouseY)
}
Add(InlineCode,4182753,168,77)
{
WorkPoints=#5:doGet|
EventPoints=#3:onX|3:onY|
DataPoints=#6:Handle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,Messages;|3:var|21: pos_x:Integer = 0;|21: pos_y:Integer = 0;|3: |4:type|28: THiAsmClass = class(TDebug)|10: private|14: pos:TPoint;|3: |9: public|19: onX:THI_Event;|19: onY:THI_Event;|22: Handle:THI_Event;|49: procedure doGet(var Data:TData; index:word);|5: end;|0:|14:implementation|0:|56:procedure THiAsmClass.doGet(var Data:TData; index:word);|3:var|13: H: THandle;|5:begin|34: H := ReadInteger(Data,handle,0);|20: GetCursorPos(pos);|25: ScreenToClient(H, pos);|80: if ((pos.x >= 0) and (pos.x < 400)) and ((pos.y >= 0) and (pos.y < 300)) then|8: begin|20: pos_x := pos.x;|20: pos_y := pos.y;|7: end;|26: _hi_OnEvent(onX, pos_x);|26: _hi_OnEvent(onY, pos_y);|4:end;|0:|4:end.|
link(Handle,9413013:Handle,[])
link(onX,3644855:doText,[])
link(onY,1264290:doText,[(226,90)(226,125)])
}
Add(Timer,15923945,56,77)
{
Interval=20
link(onTimer,8523865:doEvent1,[])
}
Add(Edit,3644855,252,77)
{
Left=60
Top=20
Width=45
}
Add(Label,11053676,294,77)
{
Left=25
Top=20
Width=29
Height=17
Caption="pos x"
}
Add(Edit,1264290,252,119)
{
Left=60
Top=45
Width=45
}
Add(Label,10251844,294,119)
{
Left=25
Top=45
Width=30
Height=17
Caption="pos y"
}
Add(Edit,192306,252,161)
{
Left=60
Top=75
Width=45
}
Add(Label,10527506,294,161)
{
Left=25
Top=75
Width=29
Height=17
Caption="pos x"
}
Add(Edit,4029270,252,203)
{
Left=60
Top=100
Width=45
}
Add(Label,14478625,294,203)
{
Left=25
Top=100
Width=30
Height=17
Caption="pos y"
}
Add(Hub,8523865,105,77)
{
link(onEvent1,4182753:doGet,[])
link(onEvent2,7750041:doEvent1,[(129,90)(129,167)])
}
Add(DoData,5137350,175,161)
{
link(onEventData,192306:doText,[])
link(Data,9413013:MouseX,[])
}
Add(DoData,34187,182,203)
{
link(onEventData,4029270:doText,[])
link(Data,9413013:MouseY,[])
}
Add(Hub,7750041,140,161)
{
link(onEvent1,5137350:doData,[])
link(onEvent2,34187:doData,[(168,174)(168,209)])
}


карма: 3

0
Ответов: 4631
Рейтинг: 749
#5: 2014-04-17 11:22:04 ЛС | профиль | цитата
Ну, а BorderStyle выставил, чтобы размер окна нельзя было изменить? Потому, что размер окна прописан в коде?
На всякий случай:
code_33430.txt
карма: 26

1
файлы: 1code_33430.txt [976B] [253]
Голосовали:MAV
Ответов: 1304
Рейтинг: 405
#6: 2014-04-18 19:52:00 ЛС | профиль | цитата
Netspirit писал(а):
Потому, что размер окна прописан в коде?

Да.
В моём проекте клиентская область заранее предопределена, поэтому в примере я и не стал добавлять GetClientRect, хотя для полноты примера стоило сделать как у тебя.

карма: 3

0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)