Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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 если он должен быть ноль?
Формат всех сообщений один и тот же. Даже если параметр и не нужен, он все равно передается - просто не используется при обработке, вот и все.




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

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

Наверх





Память: 0.47 MB
Время: 0.006 c
3-22559
Mikeee
2002-03-14 09:49
2002.04.08
Общий титул на несколько колонок в DBGridEh


1-22622
most
2002-03-26 10:01
2002.04.08
События в RUN-TIME


4-22873
Turalyon
2002-02-05 13:41
2002.04.08
Запускаемые приложения


1-22765
PEC
2002-03-27 13:37
2002.04.08
С Англиским Худо !


1-22691
Grishin
2002-03-26 13:22
2002.04.08
В чем проблема?





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