Здравствуйте 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. Компиляемся, наслаждаемся