zoukankan      html  css  js  c++  java
  • VC:添加图片

          总体:对于普通的BMP\DIB格式的图片,GDI中提供了LoadImage()函数;对于PNP、JPG、GIF、等格式的文件VC++中提供了OleLoadPicture()函数。

    一、

    1、创建一个单文档应用程序,并在View类中添加函数、变量如下:

           void LoadPicture();

           LPPICTURE m_picture;

           float size;

           CString filename;

    2、LoadPicture();函数代码如下:

    void CTestView::LoadPicture()

    //LPPICTRUE LoadPicture(CStirng filename)

    {

           HANDLE hfile=CreateFile(filename,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

           _ASSERTE(INVALID_HANDLE_VALUE!=hfile);

           DWORD dfilesize=GetFileSize(hfile,NULL);

           _ASSERTE(-1!=dfilesize);

           LPVOID p=NULL;

           HGLOBAL h=GlobalAlloc(GMEM_MOVEABLE,dfilesize);

           _ASSERTE(NULL!=h);

           p=GlobalLock(h);

           _ASSERTE(NULL!=p);

           DWORD dw=0;

           BOOL bread=ReadFile(hfile,p,dfilesize,&dw,NULL);

           _ASSERTE(FALSE!=bread);

           GlobalUnlock(h);

           CloseHandle(hfile);

           LPSTREAM pstm=NULL;

           HRESULT hr=CreateStreamOnHGlobal(h,TRUE,&pstm);

           _ASSERTE(SUCCEEDED(hr)&&pstm);

           if(m_picture)

                  m_picture->Release();

           hr=::OleLoadPicture(pstm,dfilesize,FALSE,IID_IPicture,(LPVOID *)&m_picture);

           _ASSERTE(SUCCEEDED(hr)&&m_picture);

           pstm->Release();

    //return m_picture;

    }

    3、在工具栏中添加两个按钮,扩大、缩小。在View类中,添加文件打开:

    void CTestView::OnFileOpen()

    {

           // TODO: Add your command handler code here

           static char sfile[]="JPEG(*.JPEG;*.JPE;*.JIF;*.JPG)|*.JPEG;*.JPE;*.JIF;*.JPG|BMP Windows位图(*.BMP;*.DIB;*.RLE)|*.BMP;*.DIB;*.RLE|PNG(*.PNG)|*.PNG||";

           CFileDialog dlg(TRUE,"jpg"," ",OFN_ALLOWMULTISELECT,sfile);

           if(IDOK==dlg.DoModal())

           {

                  filename=dlg.GetPathName();

                  LoadPicture();

           }

           Invalidate();   

    }

    void CTestView::OnBig()

    {

           // TODO: Add your command handler code here

           size=size*0.909;

           Invalidate();

    }

    void CTestView::OnSmall()

    {

           // TODO: Add your command handler code here

           size=size*1.1;

           Invalidate();

    }

    4、编写OnDraw函数代码:

    void CTestView::OnDraw(CDC* pDC)

    {

           CTestDoc* pDoc = GetDocument();

           ASSERT_VALID(pDoc);

           // TODO: add draw code for native data here

           if(m_picture)

           {

          

                  long width;

                  long height;

                  m_picture->get_Width(&width);

                  m_picture->get_Height(&height);

                  int nwidth=MulDiv(width,GetDeviceCaps(pDC->GetSafeHdc(),LOGPIXELSX),

                         2540);

                  int nheight=MulDiv(height,GetDeviceCaps(pDC->GetSafeHdc(),LOGPIXELSY),

                         2540);    

          

                  CRect rc;

                  GetClientRect(&rc);     

                  m_picture->Render(pDC->GetSafeHdc(),(rc.Width()-nwidth/size)/2,(rc.Height()-nheight/size)/2,

                                      nwidth/size,nheight/size,0,height,width,-height,&rc);

           }

    }

    二、

    1、添加位图资源

    2、函数如下:

    void CTestDlg::OnPaint()

    {

           if (IsIconic())

           {

                  CPaintDC dc(this); // device context for painting

                  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                  // Center icon in client rectangle

                  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;

                  // Draw the icon

                  dc.DrawIcon(x, y, m_hIcon);

           }

           else

           {

                  CPaintDC dc(this);

            CRect rect;

            GetClientRect(&rect);//得到窗体的大小

            CDC dcMem;

            dcMem.CreateCompatibleDC(&dc);

            CBitmap bmpBackground;

            bmpBackground.LoadBitmap(IDB_BITMAP1);//加载背景图片

            BITMAP bitMap;

            bmpBackground.GetBitmap(&bitMap);

            CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);

            dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体

    //            CDialog::OnPaint();

           }

    }

    三、

    1、位图:

           CPaintDC dc(this);

            CRect rect;

            GetClientRect(&rect);//得到窗体的大小

            CDC dcMem;

            dcMem.CreateCompatibleDC(&dc);

            CBitmap bmpBackground;

            bmpBackground.LoadBitmap(IDB_BITMAP1);//加载背景图片

            BITMAP bitMap;

            bmpBackground.GetBitmap(&bitMap);

            CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);

                  long width;

                         width=bitmap.bmWidth;

                         //m_picture->get_Width(&width);

                  long height;

                         height;=bitmap.bmHeight;

                         //m_picture->get_Height(&height);

                  COLORREF color1,color2;

                  for(long i=0;i<height/2;i++)

                  {

                         for(long j=0;j<width;j++)

                         {

                                color1=dcMem.GetPixel(j,i);

                                color2=dcMem.GetPixel(width-j,height-i);

                                dcMem.SetPixel(j,i,color2);

                                dcMem.SetPixel(width-j,height-i,color1);

                         }    

                  }*/

            dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体

    2、图片:

           /*CPaintDC dc(this);

                 CDC dcMem;

            dcMem.CreateCompatibleDC(&dc);

                  long width;

                         m_picture->get_Width(&width);

                  long height;

                         m_picture->get_Height(&height);

                  COLORREF color1,color2;

                  for(long i=0;i<height/2;i++)

                  {

                         for(long j=0;j<width;j++)

                         {

                                color1=dcMem.GetPixel(j,i);

                                color2=dcMem.GetPixel(width-j,height-i);

                                dcMem.SetPixel(j,i,color2);

                                dcMem.SetPixel(width-j,height-i,color1);

                         }    

                  }*/

  • 相关阅读:
    git创建分支与合并分支
    web实现点击左侧导航,右侧加载不同的网页(这种布局多用于后台管理系统)
    小程序通过用户授权获取手机号之getPhoneNumber
    git 本地仓库与远程仓库建立连接
    multipartUpload上传图片到阿里云
    5月23日——SPA单页面应用的原理
    5月23日——谈谈对BFC规范的理解
    5月11日——IOS下如何检测用户是否安装微信
    5月10日——华为内置虚拟键问题
    移动端WEB开发,click,touch,tap事件浅析
  • 原文地址:https://www.cnblogs.com/shenchao/p/2940567.html
Copyright © 2011-2022 走看看