Re: WTL: Подсказка в любом месте экрана
От: swap Россия  
Дата: 09.11.07 10:52
Оценка:
Данный код не работает (тултипы не появляются) если есть макрос
#define _WIN32_WINNT 0x0501
который например нужен для atltheme.h
Re[2]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 09.11.07 11:11
Оценка:
Здравствуйте, swap, Вы писали:

S>Данный код не работает (тултипы не появляются) если есть макрос

S>#define _WIN32_WINNT 0x0501
S>который например нужен для atltheme.h :(

У меня в текущем проекте он используется в том числе с кодом для отрисовки тем. Там, правда определён макрос
"#define _WIN32_WINNT 0x0500"

Ты уверен что дело в макросе, есть какие-нибудь другие "симптомы"?
Re[2]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 09.11.07 11:37
Оценка:
Толькло что попробовал с макросом 0x0501 -- всё работает.
Покажи как ты используешь класс.

S>Данный код не работает (тултипы не появляются) если есть макрос

S>#define _WIN32_WINNT 0x0501
S>который например нужен для atltheme.h :(
Re[3]: WTL: Подсказка в любом месте экрана
От: swap Россия  
Дата: 09.11.07 11:58
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>Толькло что попробовал с макросом 0x0501 -- всё работает.

WM>Покажи как ты используешь класс.

Да, дело в нем. Если ставишь 0x0500 все работает, но atltheme.h требует 0x0501.

Использую так:
WTL 7.5, VC 80 SP1, создаю через визард WTL проект с главным дилоговым окном. в CMainDlg объявляю переменнкю UI::Tooltip m_tooltip.
В OnInitDialog делаю

m_tooltip.Create(m_hWnd);

И, например, в CMainDlg::OnLButtonDown делаю

m_tooltip.SetText("bla bla bla");
m_tooltip.ShowAtCursor();

в stdafx.h такие макросы:

#define WINVER 0x0500
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0100
Re[4]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 09.11.07 12:19
Оценка:
У меня другая версия VS и, видимо, ATL. Возможно дело в этом.
Можешь посмотреть отладчиком, создаётся ли вообще окно,
и что происходит после вызова ShowAtCursor() -- GetLastError()
в смысле.

Да, и для подержки тем, по идее, не нужен _WIN32_WINNT 0x0501,
достаточно вручную прописать
#ifndef WM_THEMECHANGED
#   define WM_THEMECHANGED                 0x031A
#endif

По крайней мере, с моей версией библиотек, больше ничего не потребовалось.


WM>>Толькло что попробовал с макросом 0x0501 -- всё работает.

WM>>Покажи как ты используешь класс.

S>Да, дело в нем. Если ставишь 0x0500 все работает, но atltheme.h требует 0x0501.


S>Использую так:

S>WTL 7.5, VC 80 SP1, создаю через визард WTL проект с главным дилоговым окном. в CMainDlg объявляю переменнкю UI::Tooltip m_tooltip.
S>В OnInitDialog делаю

S>m_tooltip.Create(m_hWnd);


S>И, например, в CMainDlg::OnLButtonDown делаю


S>m_tooltip.SetText("bla bla bla");

S>m_tooltip.ShowAtCursor();

S>в stdafx.h такие макросы:


S>#define WINVER 0x0500

S>#define _WIN32_WINNT 0x0501
S>#define _WIN32_IE 0x0501
S>#define _RICHEDIT_VER 0x0100
Re[5]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 09.11.07 12:29
Оценка:
Про поддержку тем, это я загнул конечно. Просто у меня используется своя библиотека для поддержки тем, ей действительно плевать на макросы.
Re[5]: WTL: Подсказка в любом месте экрана
От: swap Россия  
Дата: 09.11.07 12:34
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>У меня другая версия VS и, видимо, ATL. Возможно дело в этом.

WM>Можешь посмотреть отладчиком, создаётся ли вообще окно,
WM>и что происходит после вызова ShowAtCursor() -- GetLastError()
WM>в смысле.

WM>Да, и для подержки тем, по идее, не нужен _WIN32_WINNT 0x0501,

WM>достаточно вручную прописать
WM>
WM>#ifndef WM_THEMECHANGED
WM>#   define WM_THEMECHANGED                 0x031A
WM>#endif
WM>

WM>По крайней мере, с моей версией библиотек, больше ничего не потребовалось.

Окно создается, все ::SendMessage возвращают вроде то что должны (для тех сообщений что должны что-то возвращать), GetLastError после ShowAtCursor возвращает 0.
Вопщем с виду все ОК вроде, но тултип не появляется, меняешь на 0x0500 — появляется

У меня в atltheme.h есть такой код
#if (_WIN32_WINNT < 0x0501)
#error atltheme.h requires _WIN32_WINNT >= 0x0501
#endif // (_WIN32_WINNT < 0x0501)
Re[4]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 09.11.07 14:41
Оценка:
Посмотри как выполняется SubclassWindow( hWnd ), в Create(). Инициализирован-ли m_hWnd?
Re[5]: WTL: Подсказка в любом месте экрана
От: swap Россия  
Дата: 12.11.07 10:13
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>Посмотри как выполняется SubclassWindow( hWnd ), в Create(). Инициализирован-ли m_hWnd?


Да, там все нормально, видимых в отладчике ошибок нет. Более того, на другой машине с той же версией WTL c VC8 (не SP1) все работает.
Ума не приложу в чем дело
Re: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 11:03
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>В своё время меня не устроил стандартный CTooltipCtrl -- мне была нужена подсказка которая бы появлялась и пропадала когда ей скажут. Кроме того, нужно было, что бы подсказка была прозрачна для всех сообщений мыши (я делал т.н. inplace tooltip). Этот простой класс делает всё вышеперечисленное...


Я новичек в ВТЛ подскажите пожалуйста как обработать сообщения мыши тултипа... В дебагере смотрел он даже в OnMouseMessage не заходит
Re: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 11:18
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>В своё время меня не устроил стандартный CTooltipCtrl -- мне была нужена подсказка которая бы появлялась и пропадала когда ей скажут. Кроме того, нужно было, что бы подсказка была прозрачна для всех сообщений мыши (я делал т.н. inplace tooltip). Этот простой класс делает всё вышеперечисленное...


Да и еще кто-нибудь сталкивался с проблемой определения координат иконки в трее? Я там хочу тултип выводить когда окно свернуто...?
P.S. Идею с перемещение курсора мыши на иконку и получения координат через сообщение считаю не спортивной, так как:
а)трей может свернуться, и придется заного водить туда мышь
б)в трей может добавиться еще другая прога и придется заного водить туда мышь
в)а также если запущенны два экземпляра программы, то нужно будет еще различать где какой
Re[2]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 14.11.07 12:22
Оценка:
Здравствуйте, kaz, Вы писали:

kaz>Здравствуйте, WinterMute, Вы писали:


WM>>В своё время меня не устроил стандартный CTooltipCtrl -- мне была нужена подсказка которая бы появлялась и пропадала когда ей скажут. Кроме того, нужно было, что бы подсказка была прозрачна для всех сообщений мыши (я делал т.н. inplace tooltip). Этот простой класс делает всё вышеперечисленное...


kaz>Я новичек в ВТЛ подскажите пожалуйста как обработать сообщения мыши тултипа... В дебагере смотрел он даже в OnMouseMessage не заходит


Не понятно что именно надо, опиши задачу подробнее. Если ты о том, чтобы показывать подсказку по сообщению мыши, то это нужно делать вручную, вызвав Show().
Re[3]: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 13:24
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>Здравствуйте, kaz, Вы писали:


kaz>>Здравствуйте, WinterMute, Вы писали:


WM>>>В своё время меня не устроил стандартный CTooltipCtrl -- мне была нужена подсказка которая бы появлялась и пропадала когда ей скажут. Кроме того, нужно было, что бы подсказка была прозрачна для всех сообщений мыши (я делал т.н. inplace tooltip). Этот простой класс делает всё вышеперечисленное...


kaz>>Я новичек в ВТЛ подскажите пожалуйста как обработать сообщения мыши тултипа... В дебагере смотрел он даже в OnMouseMessage не заходит


WM>Не понятно что именно надо, опиши задачу подробнее. Если ты о том, чтобы показывать подсказку по сообщению мыши, то это нужно делать вручную, вызвав Show().


Задача такая: при клике мышой на тултипе скрывать его... А мышиные сообщения не обрабатываются... пробовал субклассить тултип... но тоже без результатов:




LRESULT CALLBACK SubclasProc(HWND hwnd, UINT ms, WPARAM wp, LPARAM lp)
{
if(ms > WM_MOUSEFIRST && ms<WM_MOUSELAST)
{
MessageBox(hwnd, "Close", 0,0);
return 0;
}

return CallWindowProcA (oldTipProc, hwnd, ms, wp, lp);;
}

WNDPROC oldTipProc;



 bool Create( HWND hWndParent, HWND hWndOwner = NULL )
{
DestroyWindow();

            HWND hWnd = ::CreateWindowEx(WS_EX_TOPMOST,
                TOOLTIPS_CLASS,
                NULL,
                TTS_NOPREFIX | TTS_ALWAYSTIP|TTS_BALLOON,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                hWndParent,
                NULL,
                NULL,
                NULL);
....
oldTipProc = (WNDPROC)::GetWindowLongPtr(hWnd, GWL_WNDPROC);
::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)SubclasProc);
 return true;
 }



LRESULT CALLBACK SubclasProc(HWND hwnd, UINT ms, WPARAM wp, LPARAM lp)
{
    if(ms > WM_MOUSEFIRST && ms<WM_MOUSELAST)
    {
        MessageBox(hwnd, "Close", 0,0);
        return 0;
    }
    
    return CallWindowProcA (oldTipProc, hwnd, ms, wp, lp);;
}
Re[2]: WTL: Подсказка в любом месте экрана
От: Xander Zerge Россия www.zerge.com
Дата: 14.11.07 13:28
Оценка:
Здравствуйте, kaz, Вы писали:

kaz>Да и еще кто-нибудь сталкивался с проблемой определения координат иконки в трее? Я там хочу тултип выводить когда окно свернуто...?

kaz>P.S. Идею с перемещение курсора мыши на иконку и получения координат через сообщение считаю не спортивной, так как:
kaz>а)трей может свернуться, и придется заного водить туда мышь
kaz>б)в трей может добавиться еще другая прога и придется заного водить туда мышь
kaz>в)а также если запущенны два экземпляра программы, то нужно будет еще различать где какой

Когда показываете пиктограмму в трее, в Shell_NotifyIcon передаётся структура, содержащая HWND окошка, которая будет принимать сообщение, ID сообщения, ID пиктограммы (чтоб различать несколько от одного окна), текст тултипа. Потом ловите это сообщение в окне, получая ID пиктограммы и WM_чототам, что случилось с пиктограммой, WM_LBUTTONDBLCLK, например. Тултип система сама выведет, кстати.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Серёжа Новиков,
программист
Re[3]: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 13:35
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>Здравствуйте, kaz, Вы писали:


kaz>>Здравствуйте, WinterMute, Вы писали:


WM>>>В своё время меня не устроил стандартный CTooltipCtrl -- мне была нужена подсказка которая бы появлялась и пропадала когда ей скажут. Кроме того, нужно было, что бы подсказка была прозрачна для всех сообщений мыши (я делал т.н. inplace tooltip). Этот простой класс делает всё вышеперечисленное...


kaz>>Я новичек в ВТЛ подскажите пожалуйста как обработать сообщения мыши тултипа... В дебагере смотрел он даже в OnMouseMessage не заходит


WM>Не понятно что именно надо, опиши задачу подробнее. Если ты о том, чтобы показывать подсказку по сообщению мыши, то это нужно делать вручную, вызвав Show().


он утебя в OnMouseMessage не заходит, пробовал ставить брекпоинт.

LRESULT OnMouseMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
        {
-->>> сюда не заходит      LRESULT ret = 0; 

            // forward message to owner window 
            if( m_hWndOwner )
            {
                POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
                ClientToScreen( &pt ); ::ScreenToClient( m_hWndOwner, &pt );
                ret = ::SendMessage( m_hWndOwner, uMsg, wParam, MAKELONG( pt.x, pt.y ) );
            }

            //bHandled = TRUE;
            bHandled = FALSE;
            return ret;
        }
Re[3]: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 13:40
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Здравствуйте, kaz, Вы писали:


kaz>>Да и еще кто-нибудь сталкивался с проблемой определения координат иконки в трее? Я там хочу тултип выводить когда окно свернуто...?

kaz>>P.S. Идею с перемещение курсора мыши на иконку и получения координат через сообщение считаю не спортивной, так как:
kaz>>а)трей может свернуться, и придется заного водить туда мышь
kaz>>б)в трей может добавиться еще другая прога и придется заного водить туда мышь
kaz>>в)а также если запущенны два экземпляра программы, то нужно будет еще различать где какой

XZ>Когда показываете пиктограмму в трее, в Shell_NotifyIcon передаётся структура, содержащая HWND окошка, которая будет принимать сообщение, ID сообщения, ID пиктограммы (чтоб различать несколько от одного окна), текст тултипа. Потом ловите это сообщение в окне, получая ID пиктограммы и WM_чототам, что случилось с пиктограммой, WM_LBUTTONDBLCLK, например. Тултип система сама выведет, кстати.


Мне надо чтобы тултип в трее выводился не по какому-то событию (WM_MOUSEMOVE, WM_LBUTTONDOWN), а по другим причинам (например, значение переменной вышло за заданный диапазон)
Re[4]: WTL: Подсказка в любом месте экрана
От: Xander Zerge Россия www.zerge.com
Дата: 14.11.07 15:09
Оценка:
Здравствуйте, kaz, Вы писали:

kaz>Мне надо чтобы тултип в трее выводился не по какому-то событию (WM_MOUSEMOVE, WM_LBUTTONDOWN), а по другим причинам (например, значение переменной вышло за заданный диапазон)

Для того balloon есть. Делается через ту же Shell_NotifyIcon, через NIF_INFO.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Серёжа Новиков,
программист
Re[4]: WTL: Подсказка в любом месте экрана
От: WinterMute Россия http://yarrr.ru
Дата: 14.11.07 15:16
Оценка:
WM>>Не понятно что именно надо, опиши задачу подробнее. Если ты о том, чтобы показывать подсказку по сообщению мыши, то это нужно делать вручную, вызвав Show().

kaz>Задача такая: при клике мышой на тултипе скрывать его... А мышиные сообщения не обрабатываются... пробовал субклассить тултип... но тоже без результатов:


Убери стиль TTF_TRANSPARENT в строчке:
m_ToolInfo.uFlags = TTF_TRACK | TTF_TRANSPARENT | TTF_SUBCLASS;

-- Тогда должны ловиться мышиные сообщения.
Re[5]: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 15:29
Оценка:
Здравствуйте, WinterMute, Вы писали:

WM>>>Не понятно что именно надо, опиши задачу подробнее. Если ты о том, чтобы показывать подсказку по сообщению мыши, то это нужно делать вручную, вызвав Show().


kaz>>Задача такая: при клике мышой на тултипе скрывать его... А мышиные сообщения не обрабатываются... пробовал субклассить тултип... но тоже без результатов:


WM>Убери стиль TTF_TRANSPARENT в строчке:

WM>m_ToolInfo.uFlags = TTF_TRACK | TTF_TRANSPARENT | TTF_SUBCLASS;

WM>-- Тогда должны ловиться мышиные сообщения.


Ок, спасибо за помощь. Только еще один ньюанс... В родительском окне (которое hwndOwner)я ловлю WM_LBUTTONDBLCLK

BEGIN_MSG_MAP(CMainDlg)

...

MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDown)

...


и при нажатии мышой на тултип приходит сообщение, но при нажатии на клиентскую облать родительского диалога оно не приходит (меня это устраивает), но
так... интересно как же его если что отловить!
Re[5]: WTL: Подсказка в любом месте экрана
От: kaz  
Дата: 14.11.07 15:35
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Здравствуйте, kaz, Вы писали:


kaz>>Мне надо чтобы тултип в трее выводился не по какому-то событию (WM_MOUSEMOVE, WM_LBUTTONDOWN), а по другим причинам (например, значение переменной вышло за заданный диапазон)

XZ>Для того balloon есть. Делается через ту же Shell_NotifyIcon, через NIF_INFO.
Да, я догодался уже, через NIF_MODYFY оно появляется... Но все равно спкасибо за беспокойство!

правда обидно что максимальный размер 255, а у меня возможна такая ситуация когда размер выводимого в тултипе текста 32000*64...
поэтому я вывожу тултип в трее несколько раз, если размер выводимого текста > 256...
Может есть способ это обойти? Т.е. увеличить размер буффера передаваемогоо через NOTIFYICONDATA?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.