我想在窗口中显示一张地图的一部分,然后移动鼠标,可以拖拉地图,该如何实现

f26511314 2003-11-16 07:45:03
我想在窗口中显示一张地图的一部分,然后移动鼠标,可以拖拉,可以旋转,该怎样做啊
...全文
97 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_heart 2003-11-16
  • 打赏
  • 举报
回复
up
yintongshun 2003-11-16
  • 打赏
  • 举报
回复
旋转:
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
f26511314 2003-11-16
  • 打赏
  • 举报
回复
谢谢这为朋友,能不能可以旋转这张位图啊
yintongshun 2003-11-16
  • 打赏
  • 举报
回复
// 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=
yintongshun 2003-11-16
  • 打赏
  • 举报
回复
一个可以滚动显示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

{

// Construction

public:

CScrollBitmap();



//...加载图片

BOOL LoadBmp(LPCTSTR lpszResourceName);

//...初始化

void InitBmp();

// Attributes

public:



// Operations

public:



// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CScrollBitmap)

protected:



//}}AFX_VIRTUAL



// Implementation

public:



virtual ~CScrollBitmap();



// Generated message map functions

protected:

//{{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_FILE

static 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_MAP

END_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;

}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧