用VC++如何浏览大图片呢?本文向初学者介绍一款基于VC++编写的图片浏览器,即使图片的大小超过窗口的大小,也能够通过拖动滚动条看到图片的每个部位。bitblt这里我们通过BitBlt 函数和有滚动条的视图类CScrollView 来实现浏览大图的功能。具体的程序代码+步骤:
(1)通过AppWizard 生成一个MDI 的应有程序PicSee,并且视的基类选择为CScrollView。bitblt
(2)为了使新建文档的功能失效,将ID_FILE_NEW 消息响应,使其响应函数不执行任何操作:
void CPicSeeDoc::OnFileNew()
{
//不做任何工作
}
(3)通过ClassWizard 响应文档类的DeleteContents 函数,清除位图对象。代码如下:
void CPicSeeDoc::DeleteContents()
{
//清除位图资源
if (m_Bitmap.m_hObject != NULL)
m_Bitmap.DeleteObject();
CDocument::DeleteContents();
}
(4)在文档类的OnOpenDocument 函数中打开位图文件,并初始化位图对象,其代码如下:
BOOL CPicSeeDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (IsModified())
TRACE0("Warning: OnOpenDocument replaces an unsaved document\n");
DeleteContents();
//设置等待鼠标
BeginWaitCursor();
//打开位图文件
HBITMAP hImage = (HBITMAP)LoadImage(NULL, lpszPathName, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE);
EndWaitCursor();
if (!hImage) {
DWORD LastError = GetLastError();
AfxMessageBox("LoadImage failed");
return FALSE;
}
//构造位图对象
if (!m_Bitmap.Attach(hImage)) {
AfxMessageBox("Bitmap could not be attached");
return FALSE;
}
SetModifiedFlag(FALSE);
//更新所有视图
UpdateAllViews(NULL);
return TRUE;
}
(5)在文档类的头问件中加入如下代码:
public:
HBITMAP GetHandle() const {return (HBITMAP)m_Bitmap.m_hObject;};
void SelectOldBitmap(CDC *pDCMem) {pDCMem->SelectObject(m_pOldBitmap);};
void SelectBitmap(CDC *pDCMem)
{m_pOldBitmap=pDCMem->SelectObject(&m_Bitmap);};
int GetBitmap(BITMAP* pBitMap) {return m_Bitmap.GetBitmap(pBitMap);};
protected:
CBitmap m_Bitmap;
CBitmap* m_pOldBitmap;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27467-1.html
除了总吨位超过外
渠道管理
我来个去
宋茜森林的精灵