位图旋转后的刷新有关问题
位图旋转后的刷新问题
问题:
载入位图实现旋转后如何做到旋转时新位图显示而原位图消失?以下代码实现位图旋转后需手动刷新方能显示旋转后的图片。请问该如何改进?
Wnd.cpp:
CMFCWnd::CMFCWnd()
{
m_flag = 0;
CString strMyClass=AfxRegisterWndClass(0,0,HBRUSH(COLOR_WINDOWFRAME),::LoadIcon(NULL,IDI_APPLICATION));
CreateEx(WS_EX_ACCEPTFILES ,strMyClass,_T( "Window "),WS_SYSMENU|WS_THICKFRAME,CRect(0,0,1000,1000),NULL,0);
ShowWindow(SW_SHOW);
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
{
m_pChildWnd[i][j] = new CWnd();
m_pChildWnd[i][j]-> CreateEx(WS_EX_ACCEPTFILES ,strMyClass,_T( "Window "), WS_OVERLAPPED | WS_CHILD |WS_DLGFRAME,CRect(15+15*j,15+15*i,30+15*j,30+15*i),this,0);
}
}
ShowBlock();
CreateBtn();
}
CMFCWnd::~CMFCWnd()
{
//DestroyWindow();
}
BEGIN_MESSAGE_MAP(CMFCWnd, CWnd)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CBtn,Try_to_open)
ON_BN_CLICKED(IDC_CBtn_turn,Try_to_turn)
END_MESSAGE_MAP()
void CMFCWnd::OnPaint()
{
CDC MemDC;
CClientDC ClientDC(this);
MemDC.CreateCompatibleDC(&ClientDC);
if(m_cs_path.GetLength() != 0)
{
m_Bitmap.m_hObject = ::LoadImage(AfxGetInstanceHandle(),m_cs_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(m_Bitmap.m_hObject);
::GetObject(m_Bitmap.m_hObject,sizeof(m_BM),&m_BM);
//ClientDC.BitBlt(100,0,m_BM.bmWidth,m_BM.bmHeight,&MemDC,0,0,SRCCOPY);
/* m_hBitmap = (HBITMAP*)::LoadImage(AfxGetInstanceHandle(),m_cs_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
* HGDIOBJ hOld = MemDC.SelectObject(m_hBitmap);
* ::GetObject(m_hBitmap,sizeof(m_BM),&m_BM);
* ClientDC.BitBlt(100,0,m_BM.bmWidth,m_BM.bmHeight,&MemDC,0,0,SRCCOPY);
* MemDC.SelectObject(hOld);
*/
ClientDC.PlgBlt(p,&MemDC,0,0,m_BM.bmWidth,m_BM.bmHeight,m_Bitmap1,0,0);
}
MemDC.DeleteDC();
m_Bitmap.DeleteObject();
CWnd::OnPaint();
}
int CMFCWnd::ShowBlock()
{
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
m_pChildWnd[i][j]-> ShowWindow(SW_HIDE);
}
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
{
// if(block[i][j] == 1)
{
m_pChildWnd[i][j]-> ShowWindow( SW_SHOW);
m_pChildWnd[i][j]-> UpdateWindow();
}
}
}
return 0;
}
int CMFCWnd::CreateBtn()
{
m_pBtn = new CButton();
BOOL bsuccess = m_pBtn-> Create(_T( "OPEN "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(100,800,150,825), this, IDC_CBtn);
m_pBtn_turn = new CButton();
m_pBtn_turn-> Create(_T( "TURN "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(200,800,250,825), this, 102);
问题:
载入位图实现旋转后如何做到旋转时新位图显示而原位图消失?以下代码实现位图旋转后需手动刷新方能显示旋转后的图片。请问该如何改进?
Wnd.cpp:
CMFCWnd::CMFCWnd()
{
m_flag = 0;
CString strMyClass=AfxRegisterWndClass(0,0,HBRUSH(COLOR_WINDOWFRAME),::LoadIcon(NULL,IDI_APPLICATION));
CreateEx(WS_EX_ACCEPTFILES ,strMyClass,_T( "Window "),WS_SYSMENU|WS_THICKFRAME,CRect(0,0,1000,1000),NULL,0);
ShowWindow(SW_SHOW);
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
{
m_pChildWnd[i][j] = new CWnd();
m_pChildWnd[i][j]-> CreateEx(WS_EX_ACCEPTFILES ,strMyClass,_T( "Window "), WS_OVERLAPPED | WS_CHILD |WS_DLGFRAME,CRect(15+15*j,15+15*i,30+15*j,30+15*i),this,0);
}
}
ShowBlock();
CreateBtn();
}
CMFCWnd::~CMFCWnd()
{
//DestroyWindow();
}
BEGIN_MESSAGE_MAP(CMFCWnd, CWnd)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CBtn,Try_to_open)
ON_BN_CLICKED(IDC_CBtn_turn,Try_to_turn)
END_MESSAGE_MAP()
void CMFCWnd::OnPaint()
{
CDC MemDC;
CClientDC ClientDC(this);
MemDC.CreateCompatibleDC(&ClientDC);
if(m_cs_path.GetLength() != 0)
{
m_Bitmap.m_hObject = ::LoadImage(AfxGetInstanceHandle(),m_cs_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
MemDC.SelectObject(m_Bitmap.m_hObject);
::GetObject(m_Bitmap.m_hObject,sizeof(m_BM),&m_BM);
//ClientDC.BitBlt(100,0,m_BM.bmWidth,m_BM.bmHeight,&MemDC,0,0,SRCCOPY);
/* m_hBitmap = (HBITMAP*)::LoadImage(AfxGetInstanceHandle(),m_cs_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
* HGDIOBJ hOld = MemDC.SelectObject(m_hBitmap);
* ::GetObject(m_hBitmap,sizeof(m_BM),&m_BM);
* ClientDC.BitBlt(100,0,m_BM.bmWidth,m_BM.bmHeight,&MemDC,0,0,SRCCOPY);
* MemDC.SelectObject(hOld);
*/
ClientDC.PlgBlt(p,&MemDC,0,0,m_BM.bmWidth,m_BM.bmHeight,m_Bitmap1,0,0);
}
MemDC.DeleteDC();
m_Bitmap.DeleteObject();
CWnd::OnPaint();
}
int CMFCWnd::ShowBlock()
{
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
m_pChildWnd[i][j]-> ShowWindow(SW_HIDE);
}
for(int i = 0; i < 4; i++)
{
for( int j = 0; j < 4; j++)
{
// if(block[i][j] == 1)
{
m_pChildWnd[i][j]-> ShowWindow( SW_SHOW);
m_pChildWnd[i][j]-> UpdateWindow();
}
}
}
return 0;
}
int CMFCWnd::CreateBtn()
{
m_pBtn = new CButton();
BOOL bsuccess = m_pBtn-> Create(_T( "OPEN "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(100,800,150,825), this, IDC_CBtn);
m_pBtn_turn = new CButton();
m_pBtn_turn-> Create(_T( "TURN "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(200,800,250,825), this, 102);