游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1428|回复: 0

位图操作

[复制链接]

9

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2009-8-22 18:01:00 | 显示全部楼层 |阅读模式
有两张位图CBitmap m_bmpP,m_bmpA; 欲将它们绘制到区域CRect m_rtCtrl;上,绘制目标:将m_bmpP绘制为背景,m_bmpA绘制在m_bmpP的中心,当有按键事件改变m_fAngle的值时,让m_bmpA在m_bmpP的中心旋转m_fAngle角度。请问如何实现?我的实现方法如下,但是按键后(旋转值m_fAngle不为0)两张位图都消失了,当m_fAngle为0时能正常显示,应该是旋转位图时操作不正确,但是我找不出原因,麻烦各位了。 位图如下:



----------------------------------位图操作代码----------------------------------------
void CParamerterSet::OnPaint()
{
        CPaintDC dc(this);

       

        CDC MemDC;
        MemDC.CreateCompatibleDC(&dc);
        CBitmap MemBMP;
        MemBMP.CreateCompatibleBitmap(&dc,m_rtCtrl.Width(), m_rtCtrl.Height());
        CBitmap* pOldBMP = MemDC.SelectObject(&MemBMP);

       
        {

                //将m_bmpP绘制到m_rtCtrl区域
               
                CDC dcMemory;
                dcMemory.CreateCompatibleDC(&dc);

                // Select the bitmap into the in-memory DC
                CBitmap* pOldBitmap = dcMemory.SelectObject(&m_bmpP);

                MemDC.BitBlt(0,0, m_rtCtrl.Width(), m_rtCtrl.Height(),&dcMemory,0,0,SRCCOPY);

                dcMemory.SelectObject(pOldBitmap);

       
                //将m_bmpA 绘制到m_rtCtrl中心上

                float cosA = cos(m_fAngle1);
                float sinA = sin(m_fAngle1);

                XFORM xForm;
                xForm.eM11 = cosA;
                xForm.eM12 = sinA;
                xForm.eM21 = -sinA;
                xForm.eM22 = cosA;
                xForm.eDx = 0;
                xForm.eDy = 0;
                SetGraphicsMode(MemDC.m_hDC,GM_ADVANCED);
                SetWorldTransform(MemDC.m_hDC,&xForm);

                :PtoLP(dc.m_hDC, (LPPOINT) &m_rtCtrl, 2);

               
                pOldBitmap = dcMemory.SelectObject(&m_bmpA);
                MemDC.BitBlt((117-88)/2, (117-18)/2, 88, 18, &dcMemory,0,0,SRCCOPY);
                dcMemory.SelectObject(pOldBitmap);

                SetGraphicsMode(MemDC.m_hDC,GM_COMPATIBLE);
                DeleteDC(dcMemory);
        }


        dc.BitBlt(m_rtCtrl.left,m_rtCtrl.top,m_rtCtrl.Width(), m_rtCtrl.Height(),&MemDC,0,0,SRCCOPY);
        MemDC.SelectObject(pOldBMP);

        DeleteDC(MemDC);

}

-----------------------事件处理代码---------------------------------

void CParamerterSet::OnLButtonDblClk(UINT nFlags, CPoint point)
{
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CPoint pt = point;
        m_fAngle1+=D3DX_PI/18;
                if (m_fAngle1>2 * D3DX_PI)
                        m_fAngle1 = 0;
       
        ::InvalidateRect(this->m_hWnd,m_rtCtrl,1);//区域重绘,而Invalidate是全部客户区重绘。

        SendMessage(WM_PAINT,0,0);

       
        CDialog::OnRButtonDblClk(nFlags, point);
}


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 05:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表