mfc 对话框中如何使用鼠标拖动位图
RT,求指导。我已经蒙了
[解决办法]
可以做个全局变量,然后存储位图位置信息,然后响应左键按下.鼠标移动.左键放开的消息,如果是在这个位图所在区域,就进行movewindow! 这个仅仅是我的思路,我也没有做过! 不知道可不可行!
[解决办法]
不是才结了一个贴,和这一样。给一点代码吧。
[解决办法]
在OnMouseMove里,记录鼠标坐标,然后Invalidate,
pDC->BitBlt(x,y,bmInfo.bmWidth,bmInfo.bmHeight,&mDC,0,0,SRCCOPY);//绘制图片
修改x,y的坐标
[解决办法]
你这两天一直在问这个问题
我的博客看来确实不适合你
帮人帮到底
送佛送到西
给你一个例子你参考一下吧
以下代码实现的是在frame窗口拖动位图的一个方案
对话框原理是一样
新建win32空项目
然后更改项目属性使用mfc
新建cpp文件导入此代码即可
位图你自己找一个放工程目录下取名test.bmp即可
- C/C++ code
#include<afxwin.h>#include<winuser.h>class CMyWnd:public CFrameWnd //主窗口框架类{ CBitmap m_bitmapTest; CRect m_rtBitmap; BOOL m_bIsPick; CPoint m_ptPre;public: CMyWnd(); //构造函数protected: //消息相应函数 afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nflags,CPoint point);//鼠标移动 DECLARE_MESSAGE_MAP()public: afx_msg void OnLButtonUp(UINT nFlags, CPoint point);};BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd) ON_WM_MOUSEMOVE() ON_WM_ERASEBKGND() ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP()END_MESSAGE_MAP()class CMyApp:public CWinApp //主程序类{public: BOOL InitInstance();};CMyApp ThisApp;//////////////////////////////////////////////////////BOOL CMyApp::InitInstance(){ CMyWnd *pFrame=new CMyWnd; pFrame->Create(0,_T("Test")); pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd=pFrame; return TRUE;}CMyWnd::CMyWnd(){ BITMAP bmInfo; m_bIsPick = FALSE; m_bitmapTest.Attach((HBITMAP)LoadImage(NULL, _T("test.bmp"), IMAGE_BITMAP, NULL, NULL, LR_LOADFROMFILE)); m_bitmapTest.GetBitmap(&bmInfo); m_rtBitmap.SetRect(0, 0, bmInfo.bmWidth, bmInfo.bmHeight);}BOOL CMyWnd::OnEraseBkgnd(CDC* pDC){ return true;}void CMyWnd::OnPaint(){ CPaintDC dc(this); CDC dcMem, dcBmp; CBitmap bitmapTemp; CRect rectClient; GetClientRect(&rectClient); bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height()); dcMem.CreateCompatibleDC(&dc); dcBmp.CreateCompatibleDC(&dc); dcMem.SelectObject(&bitmapTemp); dcBmp.SelectObject(&m_bitmapTest); dcMem.SelectStockObject(WHITE_BRUSH); dcMem.Rectangle(&rectClient); dcMem.BitBlt(m_rtBitmap.left, m_rtBitmap.top, m_rtBitmap.Width(), m_rtBitmap.Height(), &dcBmp, 0, 0, SRCCOPY); dc.BitBlt(0, 0, rectClient.right, rectClient.bottom, &dcMem, 0, 0, SRCCOPY);}void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point){ if(m_rtBitmap.PtInRect(point)) { m_bIsPick = TRUE; m_ptPre = point; SetCapture(); } CFrameWnd::OnLButtonDown(nFlags, point);}void CMyWnd::OnLButtonUp(UINT nFlags, CPoint point){ m_bIsPick = FALSE; ReleaseCapture(); CFrameWnd::OnLButtonUp(nFlags, point);}void CMyWnd::OnMouseMove(UINT nflags,CPoint point){ if(m_bIsPick) { m_rtBitmap.top += point.y-m_ptPre.y; m_rtBitmap.bottom += point.y-m_ptPre.y; m_rtBitmap.right += point.x-m_ptPre.x; m_rtBitmap.left += point.x-m_ptPre.x; m_ptPre = point; Invalidate(); }}