window环境下利用MFC生成二维码并显示在对话框上

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013919153/article/details/79693626

要达成如题的目的,首先要对以下知识做一些了解:

1.MFC创建对话框工程以及在对话框下的空间操作。

2.MFC加载图片以及显示图片。

3.二维码的相关知识。

首先,了解bmp图片格式。

BMP格式介绍

BITMAP结构体参数介绍

然后,了解什么是二维码以及实现过程。

二维码介绍

接着,了解libqr(一个二维码生成库的介绍,源码相关库点击这里)

libqr库介绍

最后,将生成的数据绘制图片或者输出到文件,之后将图片加载即可(我就用的后一种方式,太笨了哭)

这里就直接上代码了。。。。 

  //定义bitmap指针 调用函数LoadImage装载位图  

    HBITMAP m_hBitmap;  
CString str;
GetPath(str);    //得到图片路径
if (str.IsEmpty())
{
return -1;
}

       str= str+BmpName; //BmpName是图片名字

        m_hBitmap=(HBITMAP)LoadImage(NULL,str,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);  
          
    /*************************************************************************/  
    /* 1.要装载OEM图像,则设此参数值为0  OBM_ OEM位图 OIC_OEM图标 OCR_OEM光标 
    /* 2.BmpName要装载图片的文件名                   
    /* 3.装载图像类型:  
    /*   IMAGE_BITMAP-装载位图 IMAGE_CURSOR-装载光标 IMAGE_ICON-装载图标     
    /* 4.指定图标或光标的像素宽度和长度 以像素为单位     
    /* 5.加载选项: 
    /*   IR_LOADFROMFILE-指明由lpszName指定文件中加载图像 
    /*   IR_DEFAULTSIZE-指明使用图像默认大小 
    /*   LR_CREATEDIBSECTION-当uType参数为IMAGE_BITMAP时,创建一个DIB项 
    /**************************************************************************/  

  

    //m_bitmap是一个CBitmap对象

    if( m_bitmap.m_hObject )  
    {  
        m_bitmap.Detach();           //切断CWnd和窗口联系  
    }  
    m_bitmap.Attach(m_hBitmap);      //将句柄HBITMAP m_hBitmap与CBitmap m_bitmap关联  
      
    //获取控件的边界大小  
    CRect rect;  
    GetDlgItem(IDC_PICTURE)->GetClientRect(&rect);  
  
    //图片显示(x,y)起始坐标  
    int m_showX=rect.left;  
    int m_showY=rect.top;  
    int m_nWindowWidth = rect.Width();   //计算客户区宽度  
    int m_nWindowHeight = rect.Height();  //计算客户区高度  
          
    //定义并创建一个内存设备环境DC  
    CDC *pDC = GetDlgItem(IDC_PICTURE)->GetDC();
    CDC dcBmp;  
    if( !dcBmp.CreateCompatibleDC(pDC) )   //创建兼容性的DC  
        return -1;  
      
    BITMAP m_bmp;                          //临时bmp图片变量  
    m_bitmap.GetBitmap(&m_bmp);            //将图片载入位图中  
      
    CBitmap *pbmpOld = NULL;        
    dcBmp.SelectObject(&m_bitmap);         //将位图选入临时内存设备环境  
      
    //图片显示调用函数stretchBlt  
    pDC->StretchBlt(m_showX,m_showY,m_nWindowWidth,m_nWindowHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY);  
    /*******************************************************************************/  
    /* BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,  
    /*                 int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop ); 
    /* 1.参数x、y位图目标矩形左上角x、y的坐标值       
    /* 2.nWidth、nHeigth位图目标矩形的逻辑宽度和高度       
    /* 3.pSrcDC表示源设备CDC指针                           
    /* 4.xSrc、ySrc表示位图源矩形的左上角的x、y逻辑坐标值  
    /* 5.dwRop表示显示位图的光栅操作方式 SRCCOPY用于直接将位图复制到目标环境中             
    /*******************************************************************************/  
  
    dcBmp.SelectObject(pbmpOld);           //恢复临时DC的位图  
    DeleteObject(&m_bitmap);               //删除内存中的位图  
    dcBmp.DeleteDC();                      //删除CreateCompatibleDC得到的图片DC  
    ReleaseDC(pDC);                        //释放获取的DC句柄。

Ending。。。。。。。。

猜你喜欢

转载自blog.csdn.net/u013919153/article/details/79693626
今日推荐