久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC繪圖CBitmap/HBITMAP/CImage/CStatic/CDC/HDC

 just4peterpan 2018-09-07

參考:http://bbs.csdn.net/topics/30173861

參考:http://bbzoh.cn/content/13/0507/21/10724725_283723432.shtml 

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  轉(zhuǎn)載請標(biāo)明來源 

所用的圖形都是繪制到設(shè)備上來的(CDC),,繪制前也需要綁定圖紙(CBitmap)

先 介紹基礎(chǔ):HDC/CDC轉(zhuǎn)換   CBitMap/HBITMAP/Bitmap轉(zhuǎn)換

HDC:         Handle to a device context (DC).                  // 設(shè)備dc的句柄

CDC:         Defines a class of device-context objects.  // 封裝設(shè)備dc

CBitmap:  Encapsulates a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate the bitmap.  //封裝Bitmap

HBITMAP: Handle to a bitmap.                                          // bitmap的句柄

Bitmap:    This class inherits from the Image class.    // 圖形,、圖紙

轉(zhuǎn)換關(guān)系上:

CDC->HDC  CBitmap->HBITMAP都是一樣的方法,,通過GetSafeXX()獲取的Handle

             HDC hDc = dc.GetSafeHdc();

             HBITMAP hBitmap= HBITMAP(bitmap.GetSafeHandle());   // dc.Detach 同樣會返回一個HBITMAP指針

HDC->CDC  HBITMAP->CBitmap 方法也類似,通常使用Attach/Detach完成使用和關(guān)閉         

             CDC dc; dc.Attach(hDc);  使用完畢后 dc.Detach().

            CBitmap bitmap; bitmap.Attach(HBITMAP); 使用完畢后 bitmap.Detach();

CBitmap->Bitmap:  通過GetBitmap獲取Bitmap,,形如:Bitmap bmp; bitmap.GetBitmap(bmp);

HBITMAP->Bitmap: 通過GetObject獲取Bitmap,,形如:Bitmap bmp;  GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&bmp);

Bitmap->HBITMAP: 通過GetHBITMAP獲取HBITMAP,形如:bmp.GetHBITMAP(RGB(0,0,0), &hBitmap);

 

構(gòu)建設(shè)備&選擇圖紙:SelectObject

當(dāng)我們創(chuàng)建一個內(nèi)存dc時,,如果沒有綁定圖紙,是不能夠繪制出信息的,,綁定圖紙的方法如下:形如memDC.SelectObject(&memBitmap);

  1. CDC memDC; //定義一個顯示設(shè)備對象
  2. CBitmap memBitmap; //定義位圖
  3. memDC.CreateCompatibleDC(m_static.GetDC()); //創(chuàng)建CDC兼容設(shè)備
  4. memBitmap.CreateCompatibleBitmap(m_static.GetDC(),iWidth,iHeight); //創(chuàng)建CDC兼容圖片
  5. <strong>memDC.SelectObject(&memBitmap);</strong> //設(shè)備選擇當(dāng)前的圖紙-位圖

接下來,,就可以使用memDC進行繪制,調(diào)用memDC.LineTo/Draw3dRect等等,,繪制完成后,,可以使用下面的BitBlt來吧內(nèi)容copy到static框中來

m_static.GetDC()->BitBlt(0,0,200,200,&memDC,50,50,SRCCOPY);

附加說明:BitBlt方法可以復(fù)制設(shè)備dc的一段圖紙的信息出來,貼到另一個設(shè)備dc中

 (注意CreareCompatibleDC對應(yīng)的DeleteDC釋放)

 (注意CreateCompatibleBitmap對應(yīng)的DeleteObject釋放)

 

采用提出要求和給出實現(xiàn)方法布置下面的實現(xiàn):  

要求: 在Dialog中添加了一個圖片組件框(綁定CStatic變量),,要把某個圖片顯示到這個里面

實現(xiàn)方法1:借用CImage中對圖片的支持

a. 修改Static框為Bitmap模式

   設(shè)置屬性-雜項-type:Bitmap

(也可以在OnInitDialog代碼中添加屬性修改:m_staticPic.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 加載圖片&設(shè)置到Static中,,在OnInitDialog中

  1. <strong> CImage image; //使用圖片類
  2. image.Load(m_cstrPicName); //裝載路徑下圖片信息到圖片類
  3. m_staticPic.SetBitmap(image.Detach());</strong>


 

實現(xiàn)方法2:導(dǎo)入到工程里的Bitmap文件,借用LoadBitmap

a. 同樣的修改CStatic框為BItmap模式 

	m_static.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 加載圖片&設(shè)置到Static中

  1. HBITMAP hBitmap=::LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP_TEST)); // 加載圖片
  2. m_static.ModifyStyle(<strong>SS_ENHMETAFILE</strong>,SS_BITMAP|SS_CENTERIMAGE);
  3. m_static.SetBitmap(hBitmap);


 

實現(xiàn)方法3:借助Gdiplus::Bitmap加載圖片

a. 同樣的修改CStatic框為Bitmap模式

	m_static.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 在構(gòu)造函數(shù)中初始化gdi/關(guān)閉gdi

  1. Dlg中聲明變量
  2. ULONG_PTR m_gdiplus;
  3. 構(gòu)造函數(shù)中初始化gdi:
  4. Gdiplus::GdiplusStartupInput input;
  5. Gdiplus::GdiplusStartup(&m_gdiplus,&input,NULL);
  6. 析構(gòu)函數(shù)中關(guān)閉gdi:
  7. Gdiplus::GdiplusShutdown(m_gdiplus);

c. 使用gdi相關(guān)的函數(shù)打開文件&設(shè)置給static框

  1. Gdiplus::Bitmap gdiBitmap(cstrPathFile); //傳入圖片路徑
  2. HBITMAP hBitmap;
  3. gdiBitmap.GetHBITMAP(Gdiplus::Color(255, 255, 255), &hBitmap);
  4. m_static.SetBitmap(hBitmap);




 實現(xiàn)方法四:OnPaint中直接繪制

a. 重載Dialog的OnPaint函數(shù),,在OnPaint函數(shù)中添加代碼:例如,,繪制一個彩色的框

    聲明一個CPaintDC,綁定static框,,然后繪制

  1. CPaintDC dcStatic((CWnd*)&m_static);
  2. dcStatic.FillSolidRect(0, 0, 100, 10, RGB(0,255,0));

 


實現(xiàn)方法五:使用CBitmap內(nèi)存中創(chuàng)建一個圖形,,綁定給static框

a. 同樣的修改CStatic框為Bitmap模式

	m_static.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 創(chuàng)建圖形&圖形綁定給static框 

  1. CDC memDC; //定義一個顯示設(shè)備對象
  2. CBitmap memBitmap; //定義位圖
  3. memDC.CreateCompatibleDC(m_static.GetDC()); //創(chuàng)建CDC兼容設(shè)備
  4. memBitmap.CreateCompatibleBitmap(m_static.GetDC(),iWidth,iHeight); //創(chuàng)建CDC兼容圖片
  5. CBitmap* pOldBmp = memDC.SelectObject(&memBitmap); //設(shè)備選擇當(dāng)前的圖紙-位圖
  6. memDC.Draw3dRect(0, 0, iWidth, iHeight, RGB(0,0,0), RGB(225,225,225)); //圖紙上繪制信息
  7. <strong>m_static.SetBitmap(&memBitmap);</strong>
  8. memBitmap.DeleteObject();
  9. memBitmap.Detach(); memDC.selectObject(pOldBmp); memDC.DeleteDC();

最后一步綁定static框,也可以采用復(fù)制的方法,,從memdc中直接復(fù)制一段信息:

m_static.GetDC()->BitBlt(0,0,200,200,&memDC,50,50,SRCCOPY);

 

 實現(xiàn)方法六:使用Cimage在內(nèi)存中創(chuàng)建一個圖形,,綁定給 static框

a. 同樣的修改CStatic框為Bitmap模式

	m_static.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 創(chuàng)建圖形,使用SetPixelRGB設(shè)置顏色

  1. int iWidth = 500, iHeight = 500;
  2. CImage image;
  3. image.Create(iWidth, iHeight, 24);
  4. for (int i=0; i<iWidth; i++)
  5. for (int j=0; j<iHeight; j++)
  6. {
  7. image.SetPixelRGB(i,j,0,255,0);
  8. }
  9. m_static.SetBitmap(image.Detach());

 

實現(xiàn)方法七:Cimage和CBitmap混用,實現(xiàn)類似水印效果

a. 同樣的修改CStatic框為Bitmap模式

	m_static.ModifyStyle(SS_ENHMETAFILE,SS_BITMAP|SS_CENTERIMAGE);

b. 創(chuàng)建Cimage,,先繪制一些信息

  1. int iWidth = 500, iHeight = 500;
  2. CImage image;
  3. image.Create(iWidth, iHeight, 32);
  4. for (int i=0; i<iWidth; i++)
  5. for (int j=0; j<iHeight; j++)
  6. {
  7. image.SetPixelRGB(i,j,255,255,0);
  8. }

c.  創(chuàng)建內(nèi)存DC,,Cimage作為CBitmap綁定給MemDC,繪制附加信息

  1. CDC memDC;
  2. memDC.CreateCompatibleDC(GetDC());
  3. memDC.SelectObject(image.Detach()); // 或 HBITMAP hMap = image.Detach(); memDC.SelectObject(hMap);
  4. memDC.FillSolidRect(0, 0, iWidth, iHeight/2, RGB(0,255,0)); // 繪制一些其他信息

d. 綁定給Static框

m_static.SetBitmap(HBITMAP(memDC.GetCurrentBitmap()->GetSafeHandle()));   // 或 m_static.SetBitmap(hMap);

注意:如果使用CBitmap.attach接受image.Detach時,,需要注意對cbitmap進行detach,,否則CBitmap生命周期結(jié)束,會釋放資源,,導(dǎo)致圖片不顯示

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多