您的位置:程序门 -> vc/mfc -> 界面



对话框中显示图片问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


对话框中显示图片问题[已结贴,结贴人:fulingwei]
发表于:2007-05-23 14:33:33 楼主
现有一对话框,用来显示图片,在此对话框中要对图片进行缩放、移动处理,载入图片前大小未知,而对话框大小固定(600*400左右),当载入图片大于显示范围或放大图片到超出显示范围时,自动出现滚动条,请提供思路或demo,谢谢!

我现在载入图片时只能截取对话框大小的部分,超出部分被截除了,当拖动滚动条时,图片被拉得乱七八糟。
发表于:2007-05-23 14:36:171楼 得分:30
网上搜对话框中位图处理.....
发表于:2007-05-23 14:48:042楼 得分:30
在滚动之后你要调用updatewindow();
发表于:2007-05-23 14:50:023楼 得分:0
可以在对话框中添加一个cscrollview类,在这上面画
发表于:2007-05-23 16:42:054楼 得分:0
对话框中好象不能使用cscrollview类啊
发表于:2007-05-23 16:46:515楼 得分:0
可以的。vckbase上有例子,看看。
发表于:2007-05-24 13:51:326楼 得分:0
可以给个demo吗?
发表于:2007-05-24 22:56:307楼 得分:40
写得比较粗糙,那个pview也没有释放,仅供参考:

//   testmfc2dlg.h   :   头文件
//

#pragma   once
#include   "afxwin.h "

class   cmyscrollview   :   public   cscrollview
{
public:
void   ondraw(cdc   *pdc)   {
pdc-> textout(0,   0,   _t( "hello   world "));
}
declare_dyncreate(cmyscrollview)
lpctstr   geticonwndclass(dword   dwdefaultstyle,   uint   nidresource);
void   oninitialupdate();
};


//   ctestmfc2dlg   对话框
class   ctestmfc2dlg   :   public   cdialog
{
//   构造
public:
ctestmfc2dlg(cwnd*   pparent   =   null);//   标准构造函数

//   对话框数据
enum   {   idd   =   idd_testmfc2_dialog   };

protected:
virtual   void   dodataexchange(cdataexchange*   pdx);//   ddx/ddv   支持


//   实现
protected:
hicon   m_hicon;

//   生成的消息映射函数
virtual   bool   oninitdialog();
afx_msg   void   onpaint();
afx_msg   hcursor   onquerydragicon();
declare_message_map()
};

//   testmfc2dlg.cpp   :   实现文件
//

#include   "stdafx.h "
#include   "testmfc2.h "
#include   "testmfc2dlg.h "

#ifdef   _debug
#define   new   debug_new
#endif


//   ctestmfc2dlg   对话框


ctestmfc2dlg::ctestmfc2dlg(cwnd*   pparent   /*=null*/)
:   cdialog(ctestmfc2dlg::idd,   pparent)
{
m_hicon   =   afxgetapp()-> loadicon(idr_mainframe);
}

void   ctestmfc2dlg::dodataexchange(cdataexchange*   pdx)
{
cdialog::dodataexchange(pdx);
}

begin_message_map(ctestmfc2dlg,   cdialog)
on_wm_paint()
on_wm_querydragicon()
//}}afx_msg_map
end_message_map()

implement_dyncreate(cmyscrollview,   cscrollview)

//   ctestmfc2dlg   消息处理程序

lpctstr   cmyscrollview::geticonwndclass(dword   dwdefaultstyle,   uint   nidresource)
{
hinstance   hinst   =   afxfindresourcehandle(
makeintresource(nidresource),   rt_group_icon);
hicon   hicon   =   ::loadicon(hinst,   makeintresource(nidresource));
if   (hicon   !=   null)
{
createstruct   cs;
memset(&cs,   0,   sizeof(createstruct));
cs.style   =   dwdefaultstyle;
precreatewindow(cs);
//   will   fill   lpszclassname   with   default   wndclass   name
//   ignore   instance   handle   from   precreatewindow.

wndclass   wndcls;
if   (cs.lpszclass   !=   null   &&
getclassinfo(afxgetinstancehandle(),   cs.lpszclass,   &wndcls)   &&
wndcls.hicon   !=   hicon)
{
//   register   a   very   similar   wndclass
return   afxregisterwndclass(wndcls.style,
wndcls.hcursor,   wndcls.hbrbackground,   hicon);
}
}
return   null;                 //   just   use   the   default
}

void   cmyscrollview::oninitialupdate()
{
setscrollsizes(mm_text,   csize(1000,   800));
cscrollview::oninitialupdate();
}

bool   ctestmfc2dlg::oninitdialog()
{
cdialog::oninitdialog();

//   设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//     执行此操作
seticon(m_hicon,   true);//   设置大图标
seticon(m_hicon,   false);//   设置小图标

//   todo:   在此添加额外的初始化代码
cmyscrollview   *pview   =   (cmyscrollview   *)runtime_class(cmyscrollview)-> createobject();
pview-> create(
pview-> geticonwndclass(ws_visible   ¦   ws_child,   idr_mainframe),   _t( "test "),   ws_visible   ¦   ws_child,
crect(0,   0,   300,200),   this,   0);
pview-> sendmessage(0x0364/*wm_initialupdate*/,   0,   0);
return   true;     //   除非设置了控件的焦点,否则返回   true
}

//   如果向对话框添加最小化按钮,则需要下面的代码
//     来绘制该图标。对于使用文档/视图模型的   mfc   应用程序,
//     这将由框架自动完成。

void   ctestmfc2dlg::onpaint()  
{
if   (isiconic())
{
cpaintdc   dc(this);   //   用于绘制的设备上下文

sendmessage(wm_iconerasebkgnd,   reinterpret_cast <wparam> (dc.getsafehdc()),   0);

//   使图标在工作矩形中居中
int   cxicon   =   getsystemmetrics(sm_cxicon);
int   cyicon   =   getsystemmetrics(sm_cyicon);
crect   rect;
getclientrect(&rect);
int   x   =   (rect.width()   -   cxicon   +   1)   /   2;
int   y   =   (rect.height()   -   cyicon   +   1)   /   2;

//   绘制图标
dc.drawicon(x,   y,   m_hicon);
}
else
{
cdialog::onpaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
hcursor   ctestmfc2dlg::onquerydragicon()
{
return   static_cast <hcursor> (m_hicon);
}
发表于:2007-05-24 22:57:338楼 得分:0
以上是对话框中使用cscrollview的源码
发表于:2007-05-25 08:08:059楼 得分:0
to     changy()   :
            谢谢,我先试试,不管可行不可行,你的分先记着了!
发表于:2007-05-25 10:55:1410楼 得分:0
to     changy()   :
      是可以把cscrollview引入对话框,但在载入图片时只能截取窗口区域大小,超出部分没有了,也不会出现滚动条,请继续关注,谢谢!
发表于:2007-05-25 13:35:2911楼 得分:0
滚动条是要你自己设定的,
根据图片大小自己cscrollview::setscrollsizes
发表于:2007-05-25 15:08:4912楼 得分:0
引入图片的问题已解决,现在在处理图片!
谢谢   changy()   ,cosobin(cosobin)

对于图片的缩放、移动,希望能给出宝贵的意见!
发表于:2007-05-26 11:16:3113楼 得分:0
问题解决了,谢谢!


快速检索

最新资讯
热门点击