• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            VC++實現透明位圖顯示

            http://express.ruanko.com/ruanko-express_17/webpage/tech3.html

            摘要:通過描述位圖內存和視頻內存原理,通過五子棋棋子透明顯示在棋盤上,說明VC++中位圖操作和如何實現透明位圖顯示。

            1、實現原理

            計算機視頻系統核心是內存,位圖操作涉及到視頻內存和位圖內存。每次以及每一個圖形操作都會影響視頻內存,位圖內存為一塊類似于視頻內存的RAM區域,它代表一個容納數據的內存地址,二者極為相識,區別在于位圖內存看不到,而視頻內存看的到。位圖駐留在位圖內存中,如果被移到視頻內存,則將顯示在監視器上。

            2、實現方法

            繪制透明位圖是指繪制某一位圖中除指定顏色外的其余部分,我們稱這種顏色為透明色。通過將位圖的背景色指定為透明色,在繪制時,不繪制這部分背景,而僅繪制圖像,這樣就可以將位圖中圖像透明地繪制到窗口上。如下圖1所示。


            圖1 位圖透明顯示事例

            繪制透明位圖的關鍵是創建一個掩碼位圖,掩碼位圖是一個單色位圖,它是位圖中圖像的一個單色剪影。在Windows編程中,繪圖都要用到設備描述表,需創建兩個內存設備描述表:源位圖設備描述表和掩碼位圖設備描述表。源位圖設備描述表用來裝入源位圖,而掩碼位圖設備描述表用來裝入掩碼位圖。使用BitBlt執行相應光柵操作,將源位圖透明地繪制在目的位圖上。

            在目的位圖上實現源位圖透明顯示步驟:

            (1)首先,源位圖與掩碼位圖進行SRCPAINT操作,即使用布爾OR操作將二者組合在一起;

            (2)其次,目的位圖與掩碼位圖進行MERGEPAINT操作,即使用布爾OR操作將取反后的掩碼位圖與目的位圖組合在一起;

            (3)最后,目的位圖與源位圖進行SRCAND操作,即使用布爾AND操作將二者組合在一起。

            3、位圖透明顯示流程

            (1)將位圖裝載到CBitmap對象;

            (2)創建一個與視頻設備描述表兼容的位圖設備描述表;

            (3)將CBitmap對象選入最新創建的設備描述表中;

            (4)使用GetObject()填寫BITMAP結構,以使了解位圖大小;

            (5)源位圖與掩碼位圖進行BitBlt(),使用SRCPAINT光柵操作碼,將二者合在一起,此部處理源位圖;

            (6)目的位圖與掩碼位圖進行BitBlt(),使用MERGEPAINT光柵操作碼,將二者合在一起;

            (7)目的位圖與掩碼位圖進行BitBlt(),使用SRCAND光柵操作碼,實現源位圖透明顯示。

            4、事例

            以五子棋為例,實現棋子在棋盤透明顯示,一般情況下,棋盤是帶有背景色的,棋子為黑白色(或者其它透明顏色)矩形,當棋子粘貼到棋盤上時,去除四個拐角,形成圓形棋子被放置到棋盤上,同時保留自身顏色,棋子中透明顏色都被保持不變。

            下圖2為掩碼、棋子、棋盤的顯示,經過BitBlt相應光柵操作后,圖3就是白色棋子透明顯示。

            1. (1)定義位圖和設備描述表變量
            2. CBitmap m_ChessBoard_Bitmap;	//棋盤位圖對象 CBitmap m_BlackChess_Bitmap;  	//黑棋子位圖對象 CBitmap m_WhiteChess_Bitmap;  	//白棋子位圖對象 CBitmap m_Mask_Bitmap;		//掩碼的位圖對象 CDC *pCurrent_DC;	        //當前窗口的DC指針 CDC m_BlackChess_DC;	        //粘貼黑棋子的DC CDC m_WhiteChess_DC;		//粘貼黑棋子的DC CDC m_Complex_DC;		//粘貼棋盤的DC CDC m_Mask_DC;			//粘貼掩碼的DC 
            3. (2)裝載位圖,將相應位圖邦定到CBitmap
            4. m_ChessBoard_Bitmap.LoadBitmap(IDB_BITMAP_ChessBoard);// 棋盤 m_BlackChess_Bitmap.LoadBitmap(IDB_BITMAP_BlackChess);// 黑棋子 m_WhiteChess_Bitmap.LoadBitmap(IDB_BITMAP_WhiteChess);// 白棋子 m_Mask_Bitmap.LoadBitmap(IDB_BITMAP_Mask);// 掩碼 
            5. (3)獲取位圖結構
            6. BITMAP m_ChessBoard_BITMAP;  //棋盤的位圖結構實例
              BITMAP m_BlackChess_BITMAP;  //黑棋的位圖結構實例(黑棋與白棋一樣)

              //將CBitmap對象的屬性賦予BITMAP結構體實例
              m_ChessBoard_Bitmap.GetBitmap(&m_ChessBoard_BITMAP);
              m_BlackChess_Bitmap.GetBitmap(&m_BlackChess_BITMAP);
            7. (4)創建與視頻設備描述表兼容的位圖設備描述表,將CBitmap對象選入最新創建的設備描述表中。
            8. //為黑棋子DC申請一定的資源并綁定相應的棋子CBitmap對象 m_BlackChess_DC.CreateCompatibleDC(pCurrent_DC); m_BlackChess_DC.SelectObject(&m_BlackChess_Bitmap);  //為白棋子DC申請一定的資源并綁定相應的棋子CBitmap對象 m_WhiteChess_DC.CreateCompatibleDC(pCurrent_DC); m_WhiteChess_DC.SelectObject(&m_WhiteChess_Bitmap);  //為棋盤DC申請一定的資源并綁定相應的棋子CBitmap對象 m_Complex_DC.CreateCompatibleDC(pCurrent_DC); m_Complex_DC.SelectObject(&m_ChessBoard_Bitmap);  //為掩碼DC申請一定的資源并初始綁定相應的CBitmap對象 m_Mask_DC.CreateCompatibleDC(pCurrent_DC); m_Mask_DC.SelectObject(&m_Mask_Bitmap); 
            9. (5)設置白棋和黑棋為圓形的棋子,為將方形的棋子處理成圓形的棋子而將棋子圖片與掩碼圖片進行混合操作。
            10. m_BlackChess_DC.BitBlt(0, 0, m_BlackChess_BITMAP.bmWidth,  m_BlackChess_BITMAP.bmHeight,   &m_Mask_DC, 0, 0, SRCPAINT); m_WhiteChess_DC.BitBlt(0, 0, m_BlackChess_BITMAP.bmWidth,  m_BlackChess_BITMAP.bmHeight,   &m_Mask_DC, 0, 0, SRCPAINT); 
            11. (6)將棋子放置到棋盤上,即在相應的位置取得白色圓形棋子
            12. int m_ChessPicture_Size = m_BlackChess_BITMAP.bmWidth;// 棋子圖片的寬度 //int Current_X為鼠標當前坐標點X坐標 // int Current_Y為鼠標當前坐標點Y坐標 m_Complex_DC.BitBlt(Current_X - m_ChessPicture_Size/2,  Current_Y – m_ChessPicture_Size/2, m_ChessPicture_Size, m_ChessPicture_Size, &m_Mask_DC, 0, 0, MERGEPAINT); m_Complex_DC.BitBlt(Current_X - m_ChessPicture_Size/2,  Current_Y - m_ChessPicture_Size/2, m_ChessPicture_Size, m_ChessPicture_Size, &m_WhiteChess_DC, 0, 0, SRCAND); 
            13. (7)得到本窗口的客戶區
            14. CRect m_current_Wnd_Rect;		//當前窗口的客戶端的矩形 GetClientRect(&m_current_Wnd_Rect);	//得到本窗口的客戶區 
            15. (8)在OnPaint()中,將棋盤繪制在窗口上顯示
            16. CPaintDC dc(this); // device context for painting	 //粘貼含有棋子的棋盤DC到該窗口上 dc.BitBlt(0, 0, m_current_Wnd_Rect.Width(), m_current_Wnd_Rect.Height(), &m_Complex_DC, 0, 0,  SRCCOPY);

            posted on 2013-10-28 16:41 厚積薄發 閱讀(1588) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久亚洲国产成人精品性色| 亚洲成av人片不卡无码久久| 国产成人精品免费久久久久| 伊人久久大香线蕉影院95| 久久天天日天天操综合伊人av| 亚洲精品无码久久久久AV麻豆| 久久婷婷五月综合色奶水99啪| 久久这里只有精品首页| 色播久久人人爽人人爽人人片aV| 精品熟女少妇av免费久久| 久久久久无码专区亚洲av| 精品国产乱码久久久久久1区2区 | 久久国产福利免费| 久久亚洲精品无码AV红樱桃| 久久精品国产精品亜洲毛片| 东京热TOKYO综合久久精品| 精品久久久一二三区| 丁香五月综合久久激情| 狠色狠色狠狠色综合久久| 国产aⅴ激情无码久久| 欧美性大战久久久久久| 日本福利片国产午夜久久| 久久精品蜜芽亚洲国产AV| 亚洲欧美伊人久久综合一区二区| 久久亚洲欧洲国产综合| 久久精品国产99久久丝袜| 精品水蜜桃久久久久久久| 成人精品一区二区久久久| segui久久国产精品| 国内精品久久久久国产盗摄| 99久久国产综合精品网成人影院| 国产亚洲精品自在久久| 久久AV高清无码| 久久夜色tv网站| 久久久久99精品成人片| 欧美午夜A∨大片久久| 欧美成人免费观看久久| 国产亚洲美女精品久久久2020| 久久国产免费直播| 潮喷大喷水系列无码久久精品| 久久99国产亚洲高清观看首页 |