Re[4]: ActiveX и мышка
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 30.05.02 17:14
Оценка: 3 (1)
Здравствуйте 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. Компиляемся, наслаждаемся
ActiveX и мышка
От: Прах Украина  
Дата: 30.05.02 10:34
Оценка:
Здравствуйте.
Подскажите,pls как получить доступ к текущим "глобальным" координатам мышки (за пределами ограничевающего прямоугольника элемента ActiveX, и если возможно, самого контейнера).Совсем хорошо если это будет запрашиваться из ActiveX'а?
Ashes
Re: ActiveX и мышка
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 30.05.02 12:15
Оценка:
Здравствуйте Прах, Вы писали:

П>Здравствуйте.

П>Подскажите,pls как получить доступ к текущим "глобальным" координатам мышки (за пределами ограничевающего прямоугольника элемента ActiveX, и если возможно, самого контейнера).Совсем хорошо если это будет запрашиваться из ActiveX'а?

А чем тебя не устраивает GetCursorPos?
Re[2]: ActiveX и мышка
От: Прах Украина  
Дата: 30.05.02 13:05
Оценка:
Здравствуйте DarkGray, Вы писали:
DG>А чем тебя не устраивает GetCursorPos?

Пардон.Вопрос поставил некорректно.Дубль 2:
"Как заставить Актив-Хы регистрировать любое перемещение мыша, даже вне его области(Актив-Ха), на какое событие повесить GetCursorPos?"
Ashes
Re[3]: ActiveX и мышка
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 30.05.02 13:12
Оценка:
Здравствуйте Прах, Вы писали:

П>Пардон.Вопрос поставил некорректно.Дубль 2:

П>"Как заставить Актив-Хы регистрировать любое перемещение мыша, даже вне его области(Актив-Ха), на какое событие повесить GetCursorPos?"

Для windowless-контрола у контейнера вызываешь IOleInPlaceSiteEx::SetCapture
Для обычного контрола, просто SetCapture

И сообщения будут приходит тебе, даже если мышка не на объекте.

Но есть много ограничений, посмотри в MSDN-е примечание к SetCapture
Re[4]: ActiveX и мышка
От: Прах Украина  
Дата: 30.05.02 13:25
Оценка:
Пасибки!
Ashes
Re[5]: ActiveX и мышка
От: Прах Украина  
Дата: 31.05.02 12:57
Оценка:
Здравствуйте DarkGray, Вы писали:
DG>3. ...Компиляемся, наслаждаемся.

ура! УРА!!! Это — другое дело,пойду переваривать код
СПА-СИ-БО!DarkGray'ю.
Желаю всем вдохновения.
Ashes
Re[5]: ActiveX и мышка
От: Прах Украина  
Дата: 01.06.02 11:02
Оценка:
Здравствуйте DarkGray, Вы писали:
"...и бурно радуемся нашему прозрачному контролу."
Поразительно точно, и прозорливо сказано.
Делаем это до поросячьего визга...
Успокаиваемся...
Успокоились.
Проверяем...
Спрашиваем.
Почему, на диалоговой форме — Line вызывает ошибку?

И еще непонятно, где и кем объявляется переменная m_spInPlaceSite, (или это какое-то соглашение?).
Вот эта часть:
…“
//переменная m_spInPlaceSite — это указатель на контейнер CComQIPtr<IOleInPlaceSiteWindowless> site = m_spInPlaceSite;

С ув. Ashes.
Ashes
Re[6]: ActiveX и мышка
От: Прах Украина  
Дата: 04.06.02 07:04
Оценка:
Последние два вопроса снимаются.
Я уже сам во всем разобрался.
Всем Мастерам, от кого получал наставления — благодарность.
До скорого.
Ashes.
Ashes
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.