我想在窗口中显示一张地图的一部分,然后移动鼠标,可以拖拉地图,该如何实现 我想在窗口中显示一张地图的一部分,然后移动鼠标,可以拖拉,可以旋转,该怎样做啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个可以滚动显示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; } // 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= 旋转: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.htmlhttp://www.codeguru.com/bitmap/rotate_bitmap.shtml 刚找到工作,散分了,哈哈~_~ 关于字符串写入SQL 100分求教,256色位图的结构问题 谁有瑞星杀毒软件的精美界面具体实现的源码呀! 显示模态对话框后,无法选择,请问是什么原因? CClientDC绘图的问题 VC 如何以共享方式访问UNIX的共享文件 [求助]用vc作播放器的进度条(CSliderCtrl类)? 计算机毕业论文[代码+论文+英文文献+PPT+开题报告]只要150哦 vs2010响应桌面的鼠标消息 怎么样装MSDN呀, 如何把SDK编程的程序改成"客户区内凹,边框突出",像Windows自带的"记事本"一样....
http://www.vchelp.net/vchelp/file2003_2/scrollbmpclass.asp?type_id=4&class_id=1&cata_id=1&article_id=996&search_term=
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