我想在窗口中显示一张地图的一部分,然后移动鼠标,可以拖拉,可以旋转,该怎样做啊

解决方案 »

  1.   

    一个可以滚动显示BMP的类本文旨在讲述如何创建一个能够在以滚动方式显示图片的组件.同时VC入门用户还可以学习一下GDI的运用以及坐标点的转化.图1为应用软件的主界面.   下面,让我们来看看如何一步一步创建CscrollBitmap类,并如何使用之.(1)  创建一个对话框应用程序.(2)  然后,新建一个类CscrollBitmap,从Cstatic继承,此时VC自动为您创建了.h和.cpp文件,打开scrollBitmap.h文件,修改CscrollBitmap的继承类,也即改成CWnd.然后打开scrollBitmap.Cpp文件,将所有的Cstatic替换成CWnd.(3)  下面列出CscrollBitmap类的源码“ScrollBitmap.h”#if !defined(AFX_SCROLLBITMAP_H__9DBF033E_05C7_4A94_A38F_3D3D865126C0__INCLUDED_)#define AFX_SCROLLBITMAP_H__9DBF033E_05C7_4A94_A38F_3D3D865126C0__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// ScrollBitmap.h : header file// /////////////////////////////////////////////////////////////////////////////// CScrollBitmap window class CScrollBitmap : public CWnd{// Constructionpublic:    CScrollBitmap();     //...加载图片    BOOL LoadBmp(LPCTSTR lpszResourceName);    //...初始化    void InitBmp();// Attributespublic: // Operationspublic: // Overrides    // ClassWizard generated virtual function overrides    //{{AFX_VIRTUAL(CScrollBitmap)    protected:     //}}AFX_VIRTUAL // Implementationpublic:     virtual ~CScrollBitmap();     // Generated message map functionsprotected:    //{{AFX_MSG(CScrollBitmap)    afx_msg void OnPaint();    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);    afx_msg BOOL OnEraseBkgnd(CDC* pDC);    //}}AFX_MSG     DECLARE_MESSAGE_MAP()      CScrollBar  m_vbar;  //竖直滚动条    CScrollBar  m_hbar;  //水平滚动条     CDC m_dcMem;     // Compatible Memory DC for dialog        HBITMAP m_hBmpOld;    // 保存旧的Bitmap对象句柄    HBITMAP m_hBmpNew;    // 保存新的Bitmap对象句柄       BITMAP m_bmInfo;        // bmp位图信息结构    CPoint m_pt;                CSize m_size;       CRect rectStaticClient;    SCROLLINFO horz,vert;    BOOL    flag, erase;    int sourcex, sourcey,offsetx,offsety;}; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_SCROLLBITMAP_H__9DBF033E_05C7_4A94_A38F_3D3D865126C0__INCLUDED_)  “ScrollBitmap.cpp” // ScrollBitmap.cpp : implementation file// #include "stdafx.h"#include "ScrollBmpControl.h"#include "ScrollBitmap.h" #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif /////////////////////////////////////////////////////////////////////////////// CScrollBitmap CScrollBitmap::CScrollBitmap(){ } CScrollBitmap::~CScrollBitmap(){}  BEGIN_MESSAGE_MAP(CScrollBitmap, CWnd)    //{{AFX_MSG_MAP(CScrollBitmap)    ON_WM_PAINT()    ON_WM_VSCROLL()    ON_WM_HSCROLL()    ON_WM_ERASEBKGND()    //}}AFX_MSG_MAPEND_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////// CScrollBitmap message handlers  void CScrollBitmap::InitBmp(){    CClientDC dc(this);    m_dcMem.CreateCompatibleDC( &dc );       CRect tmpRect;    GetClientRect(tmpRect);    m_hbar.Create(SBS_HORZ | SBS_BOTTOMALIGN | WS_CHILD | WS_VISIBLE,       CRect(tmpRect.left,tmpRect.bottom-10,tmpRect.right, tmpRect.bottom), this, 100);     m_vbar.Create(SBS_VERT | SBS_RIGHTALIGN | WS_CHILD | WS_VISIBLE,       CRect(tmpRect.left-10,tmpRect.top,tmpRect.right, tmpRect.bottom), this, 101);        m_hbar.ShowWindow(false);    m_vbar.ShowWindow(false);} void CScrollBitmap::OnPaint() {    CPaintDC dc(this); // device context for painting         dc.BitBlt(offsetx,offsety,m_size.cx-10,m_size.cy-10,                    &m_dcMem, sourcex, sourcey,SRCCOPY);     erase=false;       // Do not call CWnd::OnPaint() for painting messages} BOOL CScrollBitmap::LoadBmp(LPCTSTR lpszResourceName){    CString file;    file = lpszResourceName;    if(m_hBmpNew != NULL )        DeleteObject(m_hBmpNew);    sourcex=sourcey=0;//    m_hBmpNew = (HBITMAP) LoadImage(        AfxGetInstanceHandle(),   // handle to instance        file,  // name or identifier of the image (root is where project is)        IMAGE_BITMAP,        // image types        0,     // desired width        0,     // desired height        LR_LOADFROMFILE);     if( m_hBmpNew == NULL ){        AfxMessageBox("Load Image Failed");        return FALSE;    }
      

  2.   

    // put the HBITMAP info into the CBitmap (but not the bitmap itself)    else{        GetClientRect( &rectStaticClient );        rectStaticClient.NormalizeRect();         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        //ClientToScreen( &rectStaticClient );        //GetParent()->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 )  );                offsetx= m_pt.x;        offsety=m_pt.y;        //m_vbar.MoveWindow(offsetx+m_size.cx,offsety,18,m_size.cy);        //m_hbar.MoveWindow(offsetx,offsety+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)                offsetx= m_pt.x;            else                offsetx= m_pt.x+((m_size.cx-m_bmInfo.bmWidth)/2);            m_vbar.MoveWindow(offsetx+m_bmInfo.bmWidth,offsety,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.nTrackPos=0;        if(m_bmInfo.bmHeight<=m_size.cy)        {            if((m_size.cy-m_bmInfo.bmHeight)==0)                offsety= m_pt.y;            else                offsety= m_pt.y+((m_size.cy-m_bmInfo.bmHeight)/2);            m_hbar.MoveWindow(offsetx,offsety+m_bmInfo.bmHeight,m_size.cx,18);            m_vbar.ShowWindow(false);        }        else            m_vbar.ShowWindow(true);        m_vbar.SetScrollInfo(&vert);                InvalidateRect(&rectStaticClient);        return TRUE;    }} void CScrollBitmap::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {    switch (nSBCode)    {    case SB_TOP:        sourcey = 0;        break;    case SB_BOTTOM:        sourcey = INT_MAX;        break;    case SB_THUMBTRACK:        sourcey = nPos;        break;    }    m_vbar.SetScrollPos(sourcey);    erase=true;    InvalidateRect(&rectStaticClient);    CWnd::OnVScroll(nSBCode, nPos, pScrollBar);} void CScrollBitmap::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {    // TODO: Add your message handler code here and/or call default    switch (nSBCode)    {    case SB_TOP:        sourcex = 0;        break;    case SB_BOTTOM:        sourcex = INT_MAX;        break;    case SB_THUMBTRACK:        sourcex= nPos;        break;    }       m_hbar.SetScrollPos(sourcex);    //Invalidate();    erase=true;    InvalidateRect(&rectStaticClient);        CWnd::OnHScroll(nSBCode, nPos, pScrollBar);} BOOL CScrollBitmap::OnEraseBkgnd(CDC* pDC) {    if(erase)        return false;    else        return CWnd::OnEraseBkgnd(pDC);} (4)  在对话框声名文件(.h),加入#include "ScrollBitmap.h" 在窗体放置一个静态控件,将ID改成IDC_IMG,按鼠标右键选择”classWizard…”菜单进入MFC ClassWizard窗口,切换到”Member variables ”,给IDC_IMG添加一个控件变量m_bmp.   打开对话框声名文件,将Cstatic m_bmp替换成CscrollBitmap m_bmp 在对话框的OnInitDialog ()过程里,初始化m_bmp    m_bmp.InitBmp(); 在对话框添加一个打开按钮,由于选择图片:   CFileDialog *pFileDialog;   pFileDialog = new CFileDialog(TRUE,".bmp",NULL,OFN_HIDEREADONLY, "位图文件 (*.bmp)|*.bmp",this);   if (pFileDialog->DoModal() == IDOK )    {      m_bmp.LoadBmp(pFileDialog->GetFileName());   } 至此,你就可以演示一下了。 地址:
    http://www.vchelp.net/vchelp/file2003_2/scrollbmpclass.asp?type_id=4&class_id=1&cata_id=1&article_id=996&search_term=
      

  3.   

    旋转:
    http://www.copathway.com/vchelp/archive.asp?type_id=18&class_id=1&cata_id=12&article_id=248&search_term=http://www.ittide.com/document/article/graphic/63.html(经典)
    http://www.ittide.com/document/article/graphic/13.html
    http://www.codeguru.com/bitmap/rotate_bitmap.shtml