NANDA KUMAR Ответов: 1

Как прокручивать автоматически, когда я выбираю область на изображении в picturecontrol, которая является большой?


у меня есть элемент управления picture, в котором у меня есть как вертикальные, так и горизонтальные полосы прокрутки, так что когда я щелкаю и перетаскиваю область на изображении, так что если область выделения больше в picturecontrol, как она автоматически прокручивается в диалоговом окне mfc vc++

Что я уже пробовал:

m_ROIPicctrl.GetClientRect( &rectStaticClient );
	rectStaticClient.NormalizeRect();
	m_size.cx=rectStaticClient.Size().cx;
	m_size.cy=rectStaticClient.Size().cy;
	m_size.cx = rectStaticClient.Width();    // zero based
	m_size.cy = rectStaticClient.Height();    // zero based

	// Convert to screen coordinates using static as base,
	// then to DIALOG (instead of static) client coords 
	// using dialog as base
	m_ROIPicctrl.ClientToScreen( &rectStaticClient );
	ScreenToClient(&rectStaticClient);

	m_pt.x = rectStaticClient.left;
	m_pt.y = rectStaticClient.top;
	GetObject( m_hBmpNew , sizeof(BITMAP), &m_bmInfo );
	VERIFY(m_hBmpOld = (HBITMAP)SelectObject(m_dcMem, m_hBmpNew )  );
	CRect irectnew;
	GetDlgItem(IDC_STC_ROIPICCTRL)->GetClientRect(irectnew);
	GetDlgItem(IDC_STC_ROIPICCTRL)->GetWindowRect(irectnew);
	//m_nLastPicctlValue = m_recDispViewWnd.right ;
	ScreenToClient(irectnew);

	
	m_noffsetx= m_pt.x;
	m_noffsety=m_pt.y;
	m_vbar.MoveWindow(m_noffsetx+m_size.cx,m_noffsety,18,m_size.cy);
	m_hbar.MoveWindow(m_noffsetx,m_noffsety+m_size.cy,m_size.cx,18);
	horz.cbSize = sizeof(SCROLLINFO);
	horz.fMask = SIF_ALL;
	horz.nMin = 0;
	horz.nMax = m_bmInfo.bmWidth-m_size.cx;
	horz.nPage =0;
	horz.nPos = 0;
	horz.nTrackPos=0;
	if(m_bmInfo.bmWidth<=m_size.cx)
	{
		if((m_size.cx-m_bmInfo.bmWidth)==0)
			m_noffsetx= m_pt.x;
		else
			m_noffsetx= m_pt.x+((m_size.cx-m_bmInfo.bmWidth)/2);
		m_vbar.MoveWindow(m_noffsetx+m_bmInfo.bmWidth,m_noffsety,18,m_size.cy);
		m_hbar.ShowWindow(false);

	}
	else
		m_hbar.ShowWindow(true);

	m_hbar.SetScrollInfo(&horz);
	vert.cbSize = sizeof(SCROLLINFO);
	vert.fMask = SIF_ALL;
	vert.nMin = 0;
	vert.nMax = m_bmInfo.bmHeight-(m_size.cy);
	vert.nPage = 0;
	vert.nPos = 0;
	vert.nTrackPos=0;
	if(m_bmInfo.bmHeight<=m_size.cy)
	{
		if((m_size.cy-m_bmInfo.bmHeight)==0)
			m_noffsety= m_pt.y;
		else
			m_noffsety= m_pt.y+((m_size.cy-m_bmInfo.bmHeight)/2);
		m_hbar.MoveWindow(m_noffsetx,m_noffsety+m_bmInfo.bmHeight,m_size.cx,18);
		m_vbar.ShowWindow(false);
		//DispImage(m_iplSrc);
	}
	else
		m_vbar.ShowWindow(true);

	m_vbar.SetScrollInfo(&vert);

	//InvalidateRect(&rectStaticClient);
	//}


}
m_vbar.setscrollpos(m_noffsetx);
m_hbar.setscrollpos(m_noffsety);

Richard MacCutchan

В чем проблема?

NANDA KUMAR

я хочу выбрать roi в picturecontrol и при перетаскивании интересующей области окно должно двигаться

Richard MacCutchan

Прокрутка-это просто перекраска содержимого окна в другое положение. Вы проверили методы элемента управления, чтобы увидеть, как он управляет прокруткой?

1 Ответов

Рейтинг:
2

KarstenK

Вы должны обрабатывать некоторые входы мыши. Здесь вы найдете некоторые Документация Microsoft об этом.

Справьтесь с движение мыши в некоторых функциях обработки сообщений делать хочется именно вам. Я думаю, что вы хотите изменить смещение в своем контроле.

То WM_MOUSEMOVE сообщение может быть правильным.