图片太大,如何使用滚动条?

silhouette_q1 2012-08-21 11:44:35
研究了半天写了个滚轮控制的图片缩放功能,放大到一定大,图片超出了视图,想要用滚动条控制来显示超出部分的图片要怎么实现?
...全文
460 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
silhouette_q1 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

http://www.codeproject.com/Articles/3175/Displaying-Bitmap-with-Scrolling
[/Quote]

之前试过这个的,根据这个我连图片都不能显示。。。
silhouette_q1 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这么多上源码的,我说下简单思路好了,昨天刚帮人解决了一个滚动轴闪烁的问题
1.无滚动轴的情况下,直接从memDC(肯定用双缓存,如果你是控件的话,根本不用发帖求助了,控件自动会跟着滚动轴显示的)读出显示

2.现在有了滚动轴之后,要根据滚动轴的位置来,修改memDC显示的位置,一般用StretchBlt显示,选择memDC中的某块位置来,显示到主界面。

楼主如果有问题,私信我,可以帮……
[/Quote]


额我真的好小白。。。控件的话。。。好像也没有滚动条啊?
whucv 2012-08-27
  • 打赏
  • 举报
回复
我写的OpenCV读取和显示图片的例子,用到了滚动视图。
cvLoadImage读取图像和StretchDlBits显示图像,每次打开图像自动调整滚动视图大小,使视图能包含完整图像。
http://download.csdn.net/detail/whucv/4193487
在放大图片后可以通过调用
SetScrollSizes(MM_TEXT, CSize(nWidth, nHeight));
设置你的滚动试图大小为图片大小。这个需要你自己修改一下
xujin_ 2012-08-27
  • 打赏
  • 举报
回复
在你建MFC工程的时候,最后一步选择基类的时候选择ScrollView,
silhouette_q1 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

这是我刚写的通过滚动窗口浏览图片的代码:
虽然是WTL,但是MFC应该差不多。
http://blog.csdn.net/zhoujielunzhimi/article/details/7899735
[/Quote]

我还是比较小白,wtl好像完全搞不懂啊><
silhouette_q1 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code
参考
// PicSeeView.cpp : implementation of the CPicSeeView class
//

#include "stdafx.h"
#include "PicSee.h"

#include "PicSeeDoc.h"
#include "PicSeeView.h"

#ifdef _DEBUG
#define new DEBUG……
[/Quote]

能不能提供下整个程序呢?
傻X 2012-08-24
  • 打赏
  • 举报
回复
这么多上源码的,我说下简单思路好了,昨天刚帮人解决了一个滚动轴闪烁的问题
1.无滚动轴的情况下,直接从memDC(肯定用双缓存,如果你是控件的话,根本不用发帖求助了,控件自动会跟着滚动轴显示的)读出显示

2.现在有了滚动轴之后,要根据滚动轴的位置来,修改memDC显示的位置,一般用StretchBlt显示,选择memDC中的某块位置来,显示到主界面。

楼主如果有问题,私信我,可以帮你调试
sumos 2012-08-24
  • 打赏
  • 举报
回复
这是我刚写的通过滚动窗口浏览图片的代码:
虽然是WTL,但是MFC应该差不多。
http://blog.csdn.net/zhoujielunzhimi/article/details/7899735
gameslq 2012-08-24
  • 打赏
  • 举报
回复
去CharlesPetzold 的<<Windows程序设计>>上找答案
silhouette_q1 2012-08-24
  • 打赏
  • 举报
回复
谢谢大家!最近好忙,等过两天实践下大家的建议!
qlizhang 2012-08-22
  • 打赏
  • 举报
回复
参考
// PicSeeView.cpp : implementation of the CPicSeeView class
//

#include "stdafx.h"
#include "PicSee.h"

#include "PicSeeDoc.h"
#include "PicSeeView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPicSeeView

IMPLEMENT_DYNCREATE(CPicSeeView, CScrollView)

BEGIN_MESSAGE_MAP(CPicSeeView, CScrollView)
//{{AFX_MSG_MAP(CPicSeeView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPicSeeView construction/destruction

CPicSeeView::CPicSeeView()
{
// TODO: add construction code here
SetScrollSizes(MM_TEXT, CSize(0, 0));

}

CPicSeeView::~CPicSeeView()
{
}

BOOL CPicSeeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CPicSeeView drawing

void CPicSeeView::OnDraw(CDC* pDC)
{
CPicSeeDoc* pDoc = GetDocument();
BITMAP BitMap;
CDC DCMem;
// Do not call CWnd::OnPaint() for painting messages
ASSERT_VALID(pDoc);
if (!pDoc->GetHandle())
return;
//创建内存设备场景
if (!DCMem.CreateCompatibleDC(pDC))
TRACE0("DCMem.CreateCompatibleDC failed\n");
pDoc->SelectBitmap(&DCMem);
pDoc->GetBitmap(&BitMap);
//将位图拷贝到显示设备场景中,进行显示
if (!pDC->BitBlt(0, 0, BitMap.bmWidth, BitMap.bmHeight, &DCMem, 0, 0, SRCCOPY))
TRACE0("BitBlt failed\n");
pDoc->SelectOldBitmap(&DCMem);
DCMem.DeleteDC();
}

/*void CPicSeeView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
*/
/////////////////////////////////////////////////////////////////////////////
// CPicSeeView printing

BOOL CPicSeeView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CPicSeeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CPicSeeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPicSeeView diagnostics

#ifdef _DEBUG
void CPicSeeView::AssertValid() const
{
CScrollView::AssertValid();
}

void CPicSeeView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}

CPicSeeDoc* CPicSeeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPicSeeDoc)));
return (CPicSeeDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPicSeeView message handlers

void CPicSeeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CPicSeeDoc* pDoc = GetDocument();
//获得主窗口指针
CFrameWnd* pParentFrame = GetParentFrame();
BITMAP BitMap;
if (!pDoc->GetHandle())
return;
//获得位图结构
pDoc->GetBitmap(&BitMap);
//设置滚动条范围
SetScrollSizes(MM_TEXT, CSize(BitMap.bmWidth, BitMap.bmHeight));
//重新规划主窗口大小
pParentFrame->RecalcLayout();
ResizeParentToFit();
}
silhouette_q1 2012-08-22
  • 打赏
  • 举报
回复
我不太会用Scrollview啊,网上好像也找不到什么具体用法的解析啊?
S_S_Ge 2012-08-21
  • 打赏
  • 举报
回复
试试VC Scrollview

15,979

社区成员

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

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