zoukankan      html  css  js  c++  java
  • VC 图像控件的加载绘制图像的使用总结

    (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
    (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)

    为方便说明,我们已经建好一个基于对话框的工程,名为Ttest,对话框类为CTestDlg

    (一)vc picture控件非动态载入图片.

    方法1.先从最简单的开始,用picture 控件来实现.
    步骤:
    先在资源里Import一张图片,ID为 IDB_BITMAP2,然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着下面就出现一个 Image下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到.

    方法2.vc picture控件.通过背景图同样如上,先载入一张图片,ID为IDB_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.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll, 把它们copy到windows/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, 0, 0, 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(), 1, 1, NULL);
         maskdc.SelectObject( &maskbitmap );
         maskdc.BitBlt( 0, 0, 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

    除此之外,还有一种加载绘制图像的方法,如下:

    建立一个基于对话框的程序,在主对话框上加载一个 PictureBox,然后加载一个Button,添加点击Button事件。具体代码如下:
    CFileDialog dlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件(*.BMP)|*.BMP||");
    dlg.DoModal();
    HBITMAP hBitmap;
    HDC hSrcDC;
    HDC hDesDC;
    CBitmap bmp;
    CWnd *hwnd;
    RECT rect;
    BITMAP bm;
    hwnd = GetDlgItem(IDC_STATIC);
    hDesDC = hwnd->GetDC()->m_hDC;
    hSrcDC = CreateCompatibleDC(hDesDC);
    hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),dlg.GetPathName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    GetObject(hBitmap, sizeof BITMAP, &bm);
    SelectObject(hSrcDC, hBitmap);

    hwnd->GetClientRect(&rect);
    ::SetStretchBltMode(hDesDC,COLORONCOLOR);
    ::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/mooncher/p/3077045.html
Copyright © 2011-2022 走看看