在MFC對話框程式的對話框視窗劃出一片區域,在onpaint()里通過BitBIt函式將位圖資源顯示在這個區域中,圖片比較大,只能顯示一部分,我想通過滑鼠來拖動圖片進而能看到每一部分,雙緩沖怎么實作,看了好多都不行,本人新手,望各位大蝦指教,不甚感激!
uj5u.com熱心網友回復:
BOOL CDragBmpDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}
void CDragBmpDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
if(m_hBitmap)
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP old=(HBITMAP)memDC.SelectObject(m_hBitmap);
dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,m_MouseX,m_MouseY,SRCCOPY);
memDC.SelectObject(old);
}
// CDialog::OnPaint();
}
}
CDragBmpDlg::CDragBmpDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDragBmpDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDragBmpDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_MouseX=0;
m_MouseY=0;
}
void CDragBmpDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
if(MK_LBUTTON==nFlags)
{
SetCapture();
ScreenToClient(&point);
m_MouseX=point.x-ptLast.x;
m_MouseY=point.y-ptLast.y;
if(m_MouseX <0) m_MouseX=0;
if(m_MouseY <0) m_MouseY=0;
Invalidate();
}
else
{
ReleaseCapture();
ScreenToClient(&point);
ptLast=point;
}
// CDialog::OnMouseMove(nFlags, point);
}
uj5u.com熱心網友回復:
void CDragBmpDlg::OnMouseMove(UINT nFlags, CPoint point){
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
CRect rc;
GetClientRect(rc);
if(MK_LBUTTON==nFlags)
{
// SetCapture();
ScreenToClient(&point);
m_MouseX=point.x-ptLast.x;
m_MouseY=point.y-ptLast.y;
//
if(m_MouseX <0) m_MouseX=0;
if(m_MouseY <0) m_MouseY=0;
//
if((m_MouseX + rc.Width()) >= m_bmpWidth) m_MouseX=m_bmpWidth-rc.Width();
if((m_MouseY + rc.Height()) >= m_bmpHeight) m_MouseY=m_bmpHeight-rc.Height();
// afxDump << m_MouseX << ";" << m_MouseY << "\n";
Invalidate();
}
else
{
// ReleaseCapture();
ScreenToClient(&point);
ptLast=point;
// accumulate for next dragging. - for (point.x - ptLast.x);
ptLast.x -= m_MouseX;
ptLast.y -= m_MouseY;
}
// CDialog::OnMouseMove(nFlags, point);
}
init m_hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(m_hBitmap,sizeof(BITMAP),&bm);
m_bmpWidth = bm.bmWidth ;
m_bmpHeight = bm.bmHeight ;
uj5u.com熱心網友回復:
CPaintDC dc(this); // device context for paintingCRect rc;
GetClientRect(rc);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP old=(HBITMAP)memDC.SelectObject(m_hBitmap);
dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,m_MouseX,m_MouseY,SRCCOPY);
memDC.SelectObject(old);
重點是這段
uj5u.com熱心網友回復:
這個只是將圖片顯示到指定區域,不能拖動的
uj5u.com熱心網友回復:
我試過了,拖動的時候圖片閃的很厲害
uj5u.com熱心網友回復:
創建一個臨時視窗,內容為要拖動的位圖。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/127737.html
標籤:界面
上一篇:MFC多檔案界面設計
下一篇:qt繪制pcm波形圖
