Knowledge Base Nr: 00116 VfWdraw.cpp - http://www.swe-kaiser.de

MFC: In einem Dialog in ein 'Video for Windows'-Fenster malen.
OnMouseMove(), OnLButtonUp(), OnLButtonDown funktionieren in diesem Fall nicht für ein FRAME-Control.

  
############### RC-file:
...
CONTROL "",IDC_FRAME,"Static",SS_BLACKFRAME | SS_NOTIFY,34,7,200,
139
...
POPUP "&Alarm"
BEGIN
MENUITEM "&linkes/oberes Eck", ID_ALARM_LINKSOBEN
MENUITEM "&rechtes/unteres Eck", ID_ALARM_RECHTSUNTEN
END
...
############### H-file:
...
RECT m_rAlarmZone:
...
############### CPP-file:
...
ON_COMMAND(ID_ALARM_LINKSOBEN, OnAlarmLinksoben)
ON_COMMAND(ID_ALARM_RECHTSUNTEN, OnAlarmRechtsunten)
...

void CVideoServerView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
...
SetTimer(0, 50, NULL);
}

void CVideoServerView::OnTimer(UINT nIDEvent)
{
static bool s_bLocked = false;
if (!s_bLocked)
{
s_bLocked = true;

...
DoSingleShot(); //video grabben und ausgeben (falls kein preview mode)
DrawSelection();

s_bLocked = false;
}

CFormView::OnTimer(nIDEvent);
}

void CVideoServerView::DrawSelection()
{
CDC* pDC = GetDlgItem(IDC_FRAME)->GetDC();

CBrush br(RGB(255,255,0));

pDC->FrameRect(&m_rAlarmZone, &br);

GetDlgItem(IDC_FRAME)->ReleaseDC(pDC);
}

void CVideoServerView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CWnd* pWndPreview = GetDlgItem(IDC_FRAME);

CPoint p(point);
ScreenToClient(&p);
CWnd* pWndHit = this->ChildWindowFromPoint(p);

if (pWndHit != pWndPreview) //contextmenü nur wenn rechte maustaste in video-frame gedrückt
return;

RECT rect;
GetDlgItem(IDC_FRAME)->GetWindowRect(&rect);
ScreenToClient(&rect);

m_nMouseX = p.x - rect.left;
m_nMouseY = p.y - rect.top;

CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
menu.GetSubMenu(2)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
}

void CVideoServerView::OnAlarmLinksoben()
{
m_rAlarmZone.left = m_nMouseX;
m_rAlarmZone.top = m_nMouseY;

DrawSelection();
}

void CVideoServerView::OnAlarmRechtsunten()
{
m_rAlarmZone.right = m_nMouseX;
m_rAlarmZone.bottom = m_nMouseY;

DrawSelection();
}