1. 程式人生 > >window環境下利用MFC生成二維碼並顯示在對話方塊上

window環境下利用MFC生成二維碼並顯示在對話方塊上

要達成如題的目的,首先要對以下知識做一些瞭解:

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。。。。。。。。