请高手看看这段代码为什么编译通过却执行没有效果

jackwonder 2003-08-20 10:03:51
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CQiZi mQiZi;
CPaintDC mDC(this);
int mColor=mColor?0:1;
mQiZi.SetColor(mColor);
mQiZi.PutDown(point,mDC);
CView::OnLButtonDown(nFlags, point);
}

class CQiZi
{
public:
int color;//棋子颜色,0代表黑色,1代表白色
int mRadius;//棋子直径大小
CQiZi();
virtual ~CQiZi();
void SetColor(int i);//棋子颜色设置
void PutDown(CPoint pos,CPaintDC mDC);//落子

};

void CQiZi::SetColor(int i)
{
if(i==0)
color=0;
else
color=1;
}

void CQiZi::PutDown(CPoint pos,CPaintDC dc)
{
CPaintDC DC();
CRect mRect;
mRect.SetRect(pos.x,pos.y,pos.x+mRadius,pos.y+mRadius);
CPen mPen,*mOldPen;
COLORREF mColor;
if (color==0)
mColor=RGB(0,255,0);
else
mColor=RGB(255,0,0);
mPen.CreatePen(PS_SOLID,2,mColor);
mOldPen=dc.SelectObject(&mPen);
dc.Ellipse(mRect);
dc.SelectObject(mOldPen);
MessageBox(0, "It worked!",
"This messagebox brought to you using J/Direct", 0);
mPen.DeleteObject();
}

为什么我点击鼠标左键却没有任何现象?
...全文
51 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fireant25 2003-08-22
  • 打赏
  • 举报
回复
CPaintDC类就是针对显示用的。

CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
Cline 2003-08-21
  • 打赏
  • 举报
回复
Try:

void CQiZi::PutDown(CPoint pos,CPaintDC& dc)
jackwonder 2003-08-21
  • 打赏
  • 举报
回复
我就是奇怪为什么CPaintDC会没有效果~~有哪个高手知道详细的编译机理?
晨曦2003 2003-08-21
  • 打赏
  • 举报
回复
或者:
CDC *pDC = GetDC();
pDC->Ellipse(rect);

CPaintDC可能是打印机或其它一些外设,但不包括显示屏.
fireant25 2003-08-20
  • 打赏
  • 举报
回复
你要知道在事件中绘图,图形是暂时的,一旦你移动窗口等操作导致
屏幕刷新,图形就消失了,除非你再次触发该事件。所以一般而言,
想要图形一直在窗口中显示,绘制代码就应该放在OnDraw中
jackwonder 2003-08-20
  • 打赏
  • 举报
回复
应该不是必须的,因为我以前实现过在事件中绘图的~~只是偶尔也有出现过执行没有效果的~~但是在一起程序中写就没有问题。

所以我不知道是什么问题
fireant25 2003-08-20
  • 打赏
  • 举报
回复
绘图部分的代码一定要放在OnDraw里,否则你左击鼠标绘制了
图形,屏幕一刷新图形就没有了。
建议用一个数组保存所有已经putdown的棋子对象,
然后在OnDraw里绘制所有这些棋子。
gzshd 2003-08-20
  • 打赏
  • 举报
回复
把绘图工作写在OnDraw或是OnPaint函数里
xuguilin 2003-08-20
  • 打赏
  • 举报
回复
如果用CClientDC则有可能绘制出结果,但是这种结果是暂时的,所以最好在OnDraw中绘制,我在我得机器上使用CPaintDC,是无法绘制出结果的,我的程序如下:
void CProblemView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CQiZi mQiZi;
// CPaintDC mDC(this);
CClientDC mDC(this);
int mColor = 1;

// mQiZi.SetColor(mColor);
// mQiZi.PutDown(point,&mDC);

mDC.MoveTo(point.x,point.y);
mDC.LineTo(point.x + 300,point.y + 300);

// Invalidate();

CView::OnLButtonDown(nFlags, point);
}
当用CClientDC时是可以的,但是当选用CPaintDC则就没有结果了,我也不知为什么?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧