山寨:不是最好的,是最适合我们的!欢迎体验山寨 中文版MSDN

Blog @ Blog

当华美的叶片落尽,生命的脉络才历历可见。 -- 聂鲁达

常用链接

统计

积分与排名

BBS

Blog

Web

最新评论

vc picture控件使用

vc picture控件的分类进行总结,
(
) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
(
) 动态载入图片(即只需要在程序中指定图片的路径即可载入)
为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.
对话框类为CTestDlg
(
)   vc picture控件非动态载入图片.
方法1.先从最简单的开始,picture 控件来实现.
步骤:
先在资源里Import一张图片,IDIDB_BITMAP2
然后在对话框上添加一个picture控件,右键点击打开属性,
type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,
拉开就会看到所有已经载入好的图片,
选择你要的图片.运行程序即可看到.

 

方法2vc picture控件.通过背景图
同样如上,先载入一张图片,IDIDB_BITMAP2
TestDlg.h
CBrush m_brBk;//在public中定义
TestDlg.cpp
在初始化函数OnInitDialog()中加入:
BOOL CTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP2);
    m_brBk.CreatePatternBrush(
&bmp);
    bmp.DeleteObject();
    
return TRUE;   // return TRUE   unless you set the focus to a control
}


在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:
HBRUSH   CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr 
= CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
if (pWnd == this)
    
{
        
return m_brBk;
    }

    
return hbr;
}

()   vc picture控件动态载入图片.
方法3 图像控件(本例用KoDak 图像编辑控件)
1.  
首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocxImgcmn.dllImgedit.ocxImgscan.ocxImgshl.dll Imgthumb.ocxImgutil.dll,把它们copywindows\system目录下,然后用regsvr32.exe将它们分别注册。
2.  
打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control… 选择Kodak图象编辑控件,大小任意。
3.  
在对话框上选中该控件,为其添加变量:m_ctrlPicture。。
4.  
BOOL CTestDlg::OnInitDialog()添加如下:

BOOL CTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_ctrlPicture.SetImage(
"aa.jpg");   //保证图像在工程目录下,也可以写绝对路径
    m_ctrlPicture.Display();
    
return TRUE;   // return TRUE unless you set the focus to a control
    
// EXCEPTION: OCX Property Pages should return FALSE
}

编译运行就OK,此种方法的好处就是可能针对多种图像格式.

 

方法4 vc picture控件通过CBitmap,HBITMAP,直接用OnPaint()绘制
首先在CTestDlg类中声明一个变量:   CBitmap   m_bmp;
然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
然后:
BOOL CDisplayPic::OnInitDialog()
{
    CDialog::OnInitDialog();
    
if( m_bmp.m_hObject != NULL )//判断
        m_bmp.DeleteObject();
    
/////////载入图片
    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
        
"c:\\aaa.bmp", IMAGE_BITMAP, 00, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
    
if( hbmp == NULL )
        
return FALSE;
    
///////////////////////该断程序用来取得加载的BMP的信息////////////////////////
    m_bmp.Attach( hbmp );
    DIBSECTION ds;
    BITMAPINFOHEADER 
&bminfo = ds.dsBmih;
    m_bmp.GetObject( 
sizeof(ds), &ds );
    
int cx=bminfo.biWidth;   //得到图像宽度
    int cy=bminfo.biHeight; //得到图像高度
    //////////////////////////////////////////////////
    
/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////

    CRect rect;
    GetDlgItem(IDC_STATIC1)
->GetWindowRect(&rect);
    ScreenToClient(
&rect);
    GetDlgItem(IDC_STATIC1)
->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
    return TRUE;   // return TRUE unless you set the focus to a control
    
// EXCEPTION: OCX Property Pages should return FALSE
}
图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息
void CDisplayPic::OnPaint()
{
    
//////////////以下三种情况任选一种会是不同效果(只能一种存在)///////////
    //CPaintDC dc(this);     //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
    CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上 
    
//   CDC dc;
    
//   dc.m_hDC=::GetDC(NULL);   //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///////////////////////////////////////////////////////
    CRect rcclient;
    GetDlgItem(IDC_STATIC1)
->GetClientRect(&rcclient);
    CDC memdc;
    memdc.CreateCompatibleDC(
&dc); 
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(
&dc, rcclient.Width(), rcclient.Height());
    memdc.SelectObject( 
&bitmap );
    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 
0);
    CDC maskdc;
    maskdc.CreateCompatibleDC(
&dc);
    CBitmap maskbitmap;
    maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 
11, NULL);
    maskdc.SelectObject( 
&maskbitmap );
    maskdc.BitBlt( 
00, rcclient.Width(), rcclient.Height(), &memdc,
        rcclient.left, rcclient.top, SRCCOPY);
    CBrush brush;
    brush.CreatePatternBrush(
&m_bmp);
    dc.FillRect(rcclient, 
&brush); 
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
        
&memdc, rcclient.left, rcclient.top,SRCPAINT);
    brush.DeleteObject();
    
// Do not call CDialog::OnPaint() for painting messages
}

以上四种方法唯有KoDak可以支持多种图像,其它的只支持BMP


posted on 2008-06-16 15:08 isabc 阅读(1520) 评论(3)  编辑 收藏 引用 所属分类: 控件操作

评论

# re: vc picture控件使用 2008-06-16 16:08 isabc

在以前版本的Windows 98/2000中,集成了柯达公司的图像处理程序,但从Windows XP开始微软将其丢了出去,换成了“Windows图片和传真查看器”,如果你想找回原来的图像处理程序,那么首先要准备Windows 2000安装光盘,然后从中复制以下文件:OCKODAK.DLL、OIENG400.DLL、OIPRT400.DLL、OISLB400.DLL、OISSQ400.DLL、OITWA400.DLL、OIUI400.DLL、IMGCMN.DLL、IMGADMIN.OCX、IMGEDIT.OCX、IMGSCAN.OCX、IMGTHUMB.OCX,需要注意的是,这些文件可能被压缩为“**_”格式,你可以使用WinZip进行解压缩。
如果只有Windows 98安装光盘,那么除复制上述文件外,还要复制OIADM400.DLL、OICOM400.DLL、OIDIS400.DLL、OIFIL400.DLL、 OIGFS400.DLL、IMGSHL.DLL、IMGOCXD.HLP,并将它们放置到Windows\System32文件夹中。
接下来就要注册那些OCX文件,按下Win+R组合键打开“运行”窗口,输入:regsvr32 imgadmin.ocx,同样方法注册imgedit.ocx、imgscan.ocx和imgthumb.ocx,接下来就可以运行柯达图像处理工具。  回复  更多评论   

# re: vc picture控件使用 2008-07-18 11:31 xidechuan

这们朋友,你写的很好,我现在正在用VC做幼儿软件,
能交个朋友吗,QQ695555872  回复  更多评论   

# re: vc picture控件使用 2008-08-27 17:43 刘卓岭

挺好!  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


广告信息(免费广告联系)

中文版MSDN:
欢迎体验