Здравствуйте DarkGray, Вы писали:
Ладно объясняю более подробно.
1. Создаем ATL-проект (ATL Com-AppWizard) с опцией (Dynamic Link Library), название ему дадим Prah
2. Добавляем новый класс (ClassView\Prah classes\ContextMenu\New Atl Object\Controls\Full control) с опциями
Name\ShortName = "Line" и Miscellaneous\Opaque = false
3. Открываем метод OnDraw для CLine и комментируем строчку Rectangle (...)
4. Компилириуемся, запускаем ActiveX Container, вставляем несколько раз Line Class и бурно радуемся нашему прозрачному контролу.
SetCapture ( в предыдущем письме я описался, SetCapture, конечно, из интерфейса IOleInPlaceSiteWindowless)
1. Всталяем в CLine два обработчика WM_LBUTTONDOWN и LBUTTONUP
2. Меняем тела OnDraw, OnLButtonDown, OnLButtonUp на следующее:
POINT begin;
POINT end;
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
TCHAR pszText[1024] = _T("");
_stprintf (pszText, _T("%d, %d - %d, %d"), begin.x, begin.y, end.x, end.y);
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//переменная m_spInPlaceSite - это указатель на контейнер
//получаем у него интерфейс IOleInPlaceSiteWindowless
CComQIPtr<IOleInPlaceSiteWindowless> site = m_spInPlaceSite;
//ставим Capture
site->SetCapture(TRUE);
//получаем координаты мышки
GetCursorPos (&begin);
//перерисовываемся
site->InvalidateRect (NULL, TRUE);
return 0;
}
LRESULT OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//получаем у контейнера интерфейс IOleInPlaceSiteWindowless
CComQIPtr<IOleInPlaceSiteWindowless> site = m_spInPlaceSite;
//проверяем, что Capture была установлена
if (site->GetCapture() == S_OK)
{
//получаем координаты мышки
GetCursorPos (&end);
//убираем Capture
site->SetCapture(FALSE);
//перерисовываемся
site->InvalidateRect (NULL, TRUE);
}
return 0;
}
3. Компиляемся, наслаждаемся
Здравствуйте.
Подскажите,pls как получить доступ к текущим "глобальным" координатам мышки (за пределами ограничевающего прямоугольника элемента ActiveX, и если возможно, самого контейнера).Совсем хорошо если это будет запрашиваться из ActiveX'а?
Здравствуйте DarkGray, Вы писали:
DG>А чем тебя не устраивает GetCursorPos?
Пардон.Вопрос поставил некорректно.Дубль 2:
"Как заставить Актив-Хы регистрировать любое перемещение мыша, даже вне его области(Актив-Ха), на какое событие повесить GetCursorPos?"
Здравствуйте Прах, Вы писали:
П>Пардон.Вопрос поставил некорректно.Дубль 2:
П>"Как заставить Актив-Хы регистрировать любое перемещение мыша, даже вне его области(Актив-Ха), на какое событие повесить GetCursorPos?"
Для windowless-контрола у контейнера вызываешь IOleInPlaceSiteEx::SetCapture
Для обычного контрола, просто SetCapture
И сообщения будут приходит тебе, даже если мышка не на объекте.
Но есть много ограничений, посмотри в MSDN-е примечание к SetCapture
Здравствуйте DarkGray, Вы писали:
DG>3. ...Компиляемся, наслаждаемся.
ура! УРА!!! Это — другое дело,пойду переваривать код
СПА-СИ-БО!DarkGray'ю.
Желаю всем вдохновения.
Здравствуйте DarkGray, Вы писали:
"...и бурно радуемся нашему прозрачному контролу."
Поразительно точно, и прозорливо сказано.
Делаем это до поросячьего визга...
Успокаиваемся...
Успокоились.
Проверяем...
Спрашиваем.
Почему, на диалоговой форме — Line вызывает ошибку?
И еще непонятно, где и кем объявляется переменная m_spInPlaceSite, (или это какое-то соглашение?).
Вот эта часть:
…“
//переменная m_spInPlaceSite — это указатель на контейнер CComQIPtr<IOleInPlaceSiteWindowless> site = m_spInPlaceSite;
”
С ув. Ashes.
Последние два вопроса снимаются.
Я уже сам во всем разобрался.
Всем Мастерам, от кого получал наставления — благодарность.
До скорого.
Ashes.