![]() |
#2
zhoufeng19882012-08-21 00:42
![]() afx_msg void CMyTetrisDlg::OnPaint() { /* 是否进行游戏 */ static BOOL s_bStart = FALSE; CPaintDC dc(this); CBitmap bitmap; CDC dcBuffer; CRect rectClient; GetClientRect(rectClient); dcBuffer.CreateCompatibleDC(&dc); bitmap.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height()); CBitmap* oldBitmap = (CBitmap*)dcBuffer.SelectObject(bitmap); bitmap.DeleteObject(); m_pTetrisGDI->FillBackground(&dcBuffer); /* 绘制窗口客户区边框 */ dcBuffer.Draw3dRect(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), RGB(192, 192, 192), RGB(255, 255, 255)); /* 绘制游戏面板 */ m_pTetrisGDI->DrawGamePanel(&dcBuffer); /* 绘制游戏信息面板 */ m_pTetrisGDI->DrawGameInfoPanel(&dcBuffer, m_tetris->GetScore()); /* 绘制网格 */ //m_pTetrisGDI->DrawGrid(&dcBuffer); /* 绘制当前所有方块 */ m_pTetrisGDI->DrawBlocks(&dcBuffer, m_tetris->m_pGamePanel); if (m_tetris->GetIsGameOver()) { m_pTetrisGDI->DrawGameOver(&dcBuffer, m_tetris->m_pGamePanel); } else if (m_tetris->GetStatus() || s_bStart) { /* 绘制下一个方块 */ m_pTetrisGDI->DrawPromptBlock(&dcBuffer, m_tetris->GetNextBlock(), RGB(45, 255, 0)); /* 绘制当前方块 */ m_pTetrisGDI->DrawGameBlock(&dcBuffer, CPoint( m_pTetrisGDI->GetGamePanelRect()->left + m_tetris->GetXCurrentPos() * m_pTetrisGDI->GetBlockSize(), m_pTetrisGDI->GetGamePanelRect()->top + m_tetris->GetYCurrentPos() * m_pTetrisGDI->GetBlockSize()), m_tetris->GetCurrentBlock(), RGB(255, 0, 0)); s_bStart = TRUE; } dc.BitBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), &dcBuffer, 0, 0, SRCCOPY); } 这是我之前的写的一个,你调试一下,一步一步走,看到底画了还是没画~x,y的值到底是什么?把MFC那几个库函数弄明白。 再看问题到底出在哪儿。 MFC是很复杂,我看你看的DOC-VIEW,不太好理解,要多下苦功夫。 |
MFC多文档程序为什么绘图不显示,双缓冲真的不明白,第一次绘图就被拦在了门外。
void CShowDrawView::OnDraw(CDC* pDC)
{
CShowDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int y=(GetDocument()->bY);//高
int x=(GetDocument()->bX);//宽
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,x,y);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,x,y,RGB(255,255,0));//此处没有绘图????????
while(y>0)
{
while (x>0)
{
MemDC.SetPixel(x,y,RGB(255,0,255));
/*这里绘图同样没有响应,改成pDC调用打开同一个图片两次还能闪烁的显示到屏幕,
郁闷到蛋疼。MFC真的太强大,初学真的容易被挡在门外,实在无法明白*/
x--;
}
y--;
}
pDC->BitBlt(0,0,x,y,&MemDC,0,0,SRCCOPY); //是不是内存MemDC里没有绘图,还是pDC绘的图形被覆盖了,求解?
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}