Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Вниз

WM_NCHITTEST и его сообщения? 


Sava   (2002-02-06 14:39) [0]

Уважаемые мастера! У меня вот такая вот проблемма. Мне надо узнать в какой области находится указатель мыши, в клиентской или системной и тому подобное. Вся вроде ничего но вот беда... Привожу отрывок кода:

Procedure MuveWind(var message : TMessage); message WM_NCHITTEST ;
.....
Procedure TForm1.MuveWind(var message: TMessage);
Begin
form1.Caption:=inttostr(message.LParamLo)+":"+inttostr(message.LParamHi);
form1.Caption:=form1.Caption+" "+ inttostr(message.WParam);
end;

Так вот беда в том, что координаты перемещения отслеживает, а вот над какой областью всегда ноль (HTNOWHERE), вот как это победить? И еще вопрос координаты отсчитывает от размера экрана а не от размара формы, это так и должно быть? Что то мне кажется я что-то не знаю и никак найти не могу.
Я не очень разбираюсь в API хотелось бы услышать еще и коментарии к ответу, буду очень признателен!
Что-то подобное искал, но не смог найти, вот с другим сообщением WC_NCMOUSEMOVE все нормально, вот только для системной области работает:(((



VuDZ   (2002-02-06 15:10) [1]

ClientToScreen()
ScreenToClien()

WM_NCMOUSEMOVE
The WM_NCMOUSEMOVE message is posted to a window when the cursor is moved within the nonclient area of the window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.

WM_MOUSEMOVE
The WM_MOUSEMOVE message is posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.



Sava   (2002-02-06 15:35) [2]

> VuDZ

> ClientToScreen()
> ScreenToClien()
За эти процедурки спасибо, но это не основной вопрос:((

>WM_NCMOUSEMOVE
>WM_MOUSEMOVE

С этим тоже все понятно, но вопрос в том как узнать над какой областью находится мыша, а не просто отслеживать ее перемещения в заранее известрый облостях, беда в том, что не могу получить значение WParam, для WM_NCHITTEST, всегда ноль!!!
А хотелось бы видеть еще и :

HTERROR = -2;
{$EXTERNALSYM HTTRANSPARENT}
HTTRANSPARENT = -1;
{$EXTERNALSYM HTNOWHERE}
HTNOWHERE = 0;
{$EXTERNALSYM HTCLIENT}
HTCLIENT = 1;
{$EXTERNALSYM HTCAPTION}
HTCAPTION = 2;
{$EXTERNALSYM HTSYSMENU}
HTSYSMENU = 3;
......

Ну и тому подобное:)



VuDZ   (2002-02-06 15:43) [3]

WM_NCMOUSEHOVER ?



Sava   (2002-02-06 15:58) [4]

>VuDZ

> WM_NCMOUSEHOVER
????????
Этого сообщения я не нашел, но нашел более другое WM_MOUSEHOVER, но что с ним делать не понял:(((
Если не сложно объясни, или ссылку на описаноье кинь.
ПЛИЗЗЗЗ.

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

....
message.Result:= HTCAPTION;
....

ведет себя соответствино, конечно глюки возникают, но не в этом суть, почему ен выдает WParam????????



Юрий Зотов   (2002-02-06 16:05) [5]

У WM_NCHITTEST параметр WParam и должен быть всегда нулем. Результат проверки Вы получаете не в нем, а в Message.Result.

procedure TForm1.MuveWind(var message: TMessage);
begin
inherited; // Чтобы все сработало
with Message do
Caption := Format("%d:%d, %d", [LParamLo, LParamHi, Result])
end;



VuDZ   (2002-02-06 16:08) [6]

Platform SDK: Windows User Interface
WM_NCMOUSEHOVER
The WM_NCMOUSEHOVER message is posted to a window when the cursor hovers over the nonclient area of the window for the period of time specified in a prior call to TrackMouseEvent.

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_NCMOUSEHOVER
WPARAM wParam, // hit-test value
LPARAM lParam // cursor position
);
Parameters
wParam
Specifies the hit-test value returned by the DefWindowProc function as a result of processing the WM_NCHITTEST message. For a list of hit-test values, see WM_NCHITTEST.
lParam
Specifies a POINTS structure that contains the x- and y-coordinates of the cursor. The coordinates are relative to the upper-left corner of the screen.
Return Values
If an application processes this message, it should return zero.

Remarks
Hover tracking stops when this message is generated. The application must call TrackMouseEvent again if it requires further tracking of mouse hover behavior.

You can also use the GET_X_LPARAM and GET_Y_LPARAM macros to extract the values of the x- and y- coordinates from lParam.

xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Requirements
Windows NT/2000 or later: Requires Windows 2000 or later.
Windows 95/98/Me: Requires Windows 98 or later.
Header: Declared in Winuser.h; include Windows.h.


ЗЫ MSDN лучший друг программёра :>



Sava   (2002-02-06 16:27) [7]

Ура заработала, но есть куча вопросов:
1. inherited; почему вначале?
2. Почему не во всех WM результат не в WParam?
3. И как узнать в каком WM где результат?
4. Зачем нужен WParam если он должен быть ноль?

а вот за :
Caption := Format("%d:%d, %d", [LParamLo, LParamHi, Result])
большое спасибо, век живи век учись:)

Буду очень признателен если получу ответы на данные вопросы, хочется понять а не запоминать:)



Sava   (2002-02-06 16:31) [8]

>VuDZ
> ЗЫ MSDN лучший друг программёра:>

Не спорю, но есть некоторые проблеммы с импортным :( Так вроде все понятно, а как к конкретной задаче припоять... :((



VuDZ   (2002-02-06 16:34) [9]

а для этого нужна практика... и это не есть гуд знать только один язык



Юрий Зотов   (2002-02-06 17:31) [10]

> 1. inherited; почему вначале?
Чтобы унаследованный код сделал всю фактическую проверку и заполнил поле Result. Только после этого мы его и получим.

> 2. Почему не во всех WM результат не в WParam?
Во всех WM результат в Result. LParam и WParam используются для передачи параметров, а у разных сообщений могут быть разные параметры. Скажем, для WM_CLOSE вообще никаких параметров не нужно (просто незачем), а у некоторых других сообщений параметры - это указатели на большие структуры данных. Просто разные сообщения требуют разных данных, вот в чем дело.

> 3. И как узнать в каком WM где результат?
Всегда в Result. И всегда надо внимательно читать описание сообщения - если уж не в MSDN, то хотя бы в SDK. Потому что у каждого сообщения свои параметры и свои нюансы.

> 4. Зачем нужен WParam если он должен быть ноль?
Формат всех сообщений один и тот же. Даже если параметр и не нужен, он все равно передается - просто не используется при обработке, вот и все.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.023 c
1-22749           DikobraZ              2002-03-26 15:40  2002.04.08  
Убрать показ ошибок!


1-22628           snoup                 2002-03-27 20:33  2002.04.08  
Как сделать простую инсталяху которая копирует на винт пару файло


1-22677           snoup                 2002-03-26 07:49  2002.04.08  
Как сделать так, что бы например по истечению 10 сек. происходило кокоето событие (пример имеется ввиде TTimer)


14-22810          Феликс                2002-02-22 18:04  2002.04.08  
Матч Россия-США?


1-22710           Aleksandr             2002-03-26 16:47  2002.04.08  
Как корректно проверить наличие объекта в памяти?