呜呜呜,真伤心,我怎么这个问题怎么也想不通呢?有关dc.Ellipse为什么有时会清除原先的圆,有时却保留原先的圆?
/*---------------------------------------------
Example 9-3:用键盘移动窗口客户区中的气球
Huang Zhengrong
Mar. 28, 2003
---------------------------------------------*/
#include <afxwin.h>
#define step 10
// 框架窗口类
class CMyWnd: public CFrameWnd
{
CRect m_rectBody;
public:
CMyWnd() {m_rectBody = CRect(100, 100, 150, 180);}
protected:
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
// 消息映射
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
ON_WM_KEYDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()
// 框架窗口类的成员函数
void CMyWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CRect rectClient;
GetClientRect(&rectClient);
InvalidateRect(m_rectBody, TRUE);
switch(nChar)
{
case VK_HOME:
m_rectBody.right = m_rectBody.right - m_rectBody.left;
m_rectBody.left = 0;
break;
case VK_END:
m_rectBody.left = rectClient.Width() - (m_rectBody.right-m_rectBody.left);
m_rectBody.right = rectClient.right;
break;
case VK_UP:
if (m_rectBody.top>rectClient.top)
{
m_rectBody.top -= step;
m_rectBody.bottom -= step;
}
break;
case VK_DOWN:
if (m_rectBody.bottom<rectClient.bottom)
{
m_rectBody.top += step;
m_rectBody.bottom += step;
}
break;
case VK_LEFT:
if (m_rectBody.left>rectClient.left)
{
m_rectBody.left -= step;
m_rectBody.right -= step;
}
break;
case VK_RIGHT:
if (m_rectBody.right<rectClient.right)
{
m_rectBody.left += step;
m_rectBody.right += step;
}
break;
}
InvalidateRect(m_rectBody, FALSE);
}
//--------------------------------------------------------------
这一段OnPaint里又没有清除代码,为什么原来是圆没有了?
假如我想把程序改成:在屏幕上改写,移动前的圆保留,那该怎么做呢?
我还有一个程序,是五子棋的程序,那个程序在上面无论你怎么画圆
原先画的棋(dc.Ellipse)都在,两个程序都是用的InvalidateRect()来更新
为什么会一个清除原先结果,一个保留?我真的糊涂了,求大侠指点...
//--------------------------------------------------------------
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
dc.SelectStockObject(LTGRAY_BRUSH);
dc.Ellipse(m_rectBody);
}
// 应用程序类
class CMyApp: public CWinApp
{
public:
BOOL InitInstance();
};
// 应用程序类的成员函数
BOOL CMyApp::InitInstance()
{
CMyWnd *pFrame=new CMyWnd;
pFrame->Create(0, _T("Move Ellipse With Keyboard"));
pFrame->ShowWindow(m_nCmdShow);
pFrame->UpdateWindow();
this->m_pMainWnd=pFrame;
return TRUE;
}
// 全局应用程序对象
CMyApp ThisApp;