|
有两张位图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);
}
|
|