• <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++實(shí)現(xiàn)透明位圖顯示

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

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

            1、實(shí)現(xiàn)原理

            計(jì)算機(jī)視頻系統(tǒng)核心是內(nèi)存,位圖操作涉及到視頻內(nèi)存和位圖內(nèi)存。每次以及每一個(gè)圖形操作都會(huì)影響視頻內(nèi)存,位圖內(nèi)存為一塊類似于視頻內(nèi)存的RAM區(qū)域,它代表一個(gè)容納數(shù)據(jù)的內(nèi)存地址,二者極為相識(shí),區(qū)別在于位圖內(nèi)存看不到,而視頻內(nèi)存看的到。位圖駐留在位圖內(nèi)存中,如果被移到視頻內(nèi)存,則將顯示在監(jiān)視器上。

            2、實(shí)現(xiàn)方法

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


            圖1 位圖透明顯示事例

            繪制透明位圖的關(guān)鍵是創(chuàng)建一個(gè)掩碼位圖,掩碼位圖是一個(gè)單色位圖,它是位圖中圖像的一個(gè)單色剪影。在Windows編程中,繪圖都要用到設(shè)備描述表,需創(chuàng)建兩個(gè)內(nèi)存設(shè)備描述表:源位圖設(shè)備描述表和掩碼位圖設(shè)備描述表。源位圖設(shè)備描述表用來(lái)裝入源位圖,而掩碼位圖設(shè)備描述表用來(lái)裝入掩碼位圖。使用BitBlt執(zhí)行相應(yīng)光柵操作,將源位圖透明地繪制在目的位圖上。

            在目的位圖上實(shí)現(xiàn)源位圖透明顯示步驟:

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

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

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

            3、位圖透明顯示流程

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

            (2)創(chuàng)建一個(gè)與視頻設(shè)備描述表兼容的位圖設(shè)備描述表;

            (3)將CBitmap對(duì)象選入最新創(chuàng)建的設(shè)備描述表中;

            (4)使用GetObject()填寫B(tài)ITMAP結(jié)構(gòu),以使了解位圖大小;

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

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

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

            4、事例

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

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

            1. (1)定義位圖和設(shè)備描述表變量
            2. CBitmap m_ChessBoard_Bitmap;	//棋盤位圖對(duì)象 CBitmap m_BlackChess_Bitmap;  	//黑棋子位圖對(duì)象 CBitmap m_WhiteChess_Bitmap;  	//白棋子位圖對(duì)象 CBitmap m_Mask_Bitmap;		//掩碼的位圖對(duì)象 CDC *pCurrent_DC;	        //當(dāng)前窗口的DC指針 CDC m_BlackChess_DC;	        //粘貼黑棋子的DC CDC m_WhiteChess_DC;		//粘貼黑棋子的DC CDC m_Complex_DC;		//粘貼棋盤的DC CDC m_Mask_DC;			//粘貼掩碼的DC 
            3. (2)裝載位圖,將相應(yīng)位圖邦定到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)獲取位圖結(jié)構(gòu)
            6. BITMAP m_ChessBoard_BITMAP;  //棋盤的位圖結(jié)構(gòu)實(shí)例
              BITMAP m_BlackChess_BITMAP;  //黑棋的位圖結(jié)構(gòu)實(shí)例(黑棋與白棋一樣)

              //將CBitmap對(duì)象的屬性賦予BITMAP結(jié)構(gòu)體實(shí)例
              m_ChessBoard_Bitmap.GetBitmap(&m_ChessBoard_BITMAP);
              m_BlackChess_Bitmap.GetBitmap(&m_BlackChess_BITMAP);
            7. (4)創(chuàng)建與視頻設(shè)備描述表兼容的位圖設(shè)備描述表,將CBitmap對(duì)象選入最新創(chuàng)建的設(shè)備描述表中。
            8. //為黑棋子DC申請(qǐng)一定的資源并綁定相應(yīng)的棋子CBitmap對(duì)象 m_BlackChess_DC.CreateCompatibleDC(pCurrent_DC); m_BlackChess_DC.SelectObject(&m_BlackChess_Bitmap);  //為白棋子DC申請(qǐng)一定的資源并綁定相應(yīng)的棋子CBitmap對(duì)象 m_WhiteChess_DC.CreateCompatibleDC(pCurrent_DC); m_WhiteChess_DC.SelectObject(&m_WhiteChess_Bitmap);  //為棋盤DC申請(qǐng)一定的資源并綁定相應(yīng)的棋子CBitmap對(duì)象 m_Complex_DC.CreateCompatibleDC(pCurrent_DC); m_Complex_DC.SelectObject(&m_ChessBoard_Bitmap);  //為掩碼DC申請(qǐng)一定的資源并初始綁定相應(yīng)的CBitmap對(duì)象 m_Mask_DC.CreateCompatibleDC(pCurrent_DC); m_Mask_DC.SelectObject(&m_Mask_Bitmap); 
            9. (5)設(shè)置白棋和黑棋為圓形的棋子,為將方形的棋子處理成圓形的棋子而將棋子圖片與掩碼圖片進(jìn)行混合操作。
            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)將棋子放置到棋盤上,即在相應(yīng)的位置取得白色圓形棋子
            12. int m_ChessPicture_Size = m_BlackChess_BITMAP.bmWidth;// 棋子圖片的寬度 //int Current_X為鼠標(biāo)當(dāng)前坐標(biāo)點(diǎn)X坐標(biāo) // int Current_Y為鼠標(biāo)當(dāng)前坐標(biāo)點(diǎn)Y坐標(biāo) 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)得到本窗口的客戶區(qū)
            14. CRect m_current_Wnd_Rect;		//當(dāng)前窗口的客戶端的矩形 GetClientRect(&m_current_Wnd_Rect);	//得到本窗口的客戶區(qū) 
            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 厚積薄發(fā) 閱讀(1576) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評(píng)論

            热99RE久久精品这里都是精品免费 | 国产一区二区三区久久精品| 97超级碰碰碰久久久久| 久久精品国产色蜜蜜麻豆| 久久久久久精品久久久久| 欧美亚洲国产精品久久蜜芽| 久久久久久久久久久久久久 | 久久国产精品一区| 天天爽天天狠久久久综合麻豆| 日韩精品国产自在久久现线拍| 热99RE久久精品这里都是精品免费 | 99久久精品免费观看国产| 久久亚洲sm情趣捆绑调教 | 亚洲精品无码久久久久久| 国产精品熟女福利久久AV | 亚洲精品97久久中文字幕无码| 国产一区二区三区久久精品| 久久久久波多野结衣高潮| 久久精品国产只有精品66| 国产麻豆精品久久一二三| 中文字幕久久亚洲一区| 国产成人久久久精品二区三区| 久久精品无码专区免费青青| 99精品国产综合久久久久五月天 | 99久久超碰中文字幕伊人| 亚洲午夜久久久影院伊人| 久久国产AVJUST麻豆| 伊人久久精品影院| 亚洲国产精品成人AV无码久久综合影院 | 久久精品国产男包| 国内精品伊人久久久久妇| 久久精品无码一区二区三区日韩 | 无码人妻久久久一区二区三区| 区久久AAA片69亚洲| 久久精品国产亚洲AV影院| 久久人人爽人人人人爽AV | 香港aa三级久久三级老师2021国产三级精品三级在 | 精品久久久久久成人AV| 乱亲女H秽乱长久久久| 久久九九精品99国产精品| 久久国产色AV免费看|