OnDraw(CDC* PDC)问题

cofemate 2009-12-04 09:44:49
问下高手OnDraw(CDC* PDC)在被调时很多书上都说(CDC* PDC)这个参数已经传进来了,小弟我没明白这个参数是怎么传进来的? 看MFC中还有很多这样的函数,他们后面跟的参数都是直接可以拿到函数体中使用的(特别是一些类的对象的指针这样的参数)。 为什么OnDraw(CDC* PDC)这个函数 不先定义一个CDC类的对象 dc ,然后OnDraw(&dc)??
...全文
365 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cofemate 2009-12-04
  • 打赏
  • 举报
回复
结贴了 :)
cofemate 2009-12-04
  • 打赏
  • 举报
回复
找到了 谢谢楼上的朋友
xylicon 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cofemate 的回复:]
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

在哪里可以找到啊?小弟愚笨,望指点
[/Quote]

\Microsoft Visual Studio\VC98\MFC\SRC\ViewCore.cpp
cofemate 2009-12-04
  • 打赏
  • 举报
回复
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

在哪里可以找到啊?小弟愚笨,望指点
xylicon 2009-12-04
  • 打赏
  • 举报
回复
OnDraw 是由OnPaint调用的。

void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

OnDraw是虚函数,所以就能够在你的派生类中执行OnDraw了。
bamboo1999 2009-12-04
  • 打赏
  • 举报
回复
是mfc构造(或者说取到的)的。
调用者负责传入合法的参数。
cattycat 2009-12-04
  • 打赏
  • 举报
回复
up loaden,我也不知道回调函数在哪,这个可能得看mfc的消息机制吧, DECLARE_MASSAGE_MAP下面声明的函数On_Draw()原型,顺着这个往上找吧。
cofemate 2009-12-04
  • 打赏
  • 举报
回复
回调函数里已经构造了一个CDC对象。老邓能说具体点么?回调函数代码在什么地方我去看下
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
为什么OnDraw(CDC* PDC)这个函数 不先定义一个CDC类的对象 dc ,然后OnDraw(&dc)??
==============
在消息派发的时候,回调函数里已经构造了一个CDC对象。
因为消息要发送到不同的类,而且是多次,所以传递进去一个指针。
这样就不用重复构造对象,提高效率(而且你也构造不成,因为只能在回调函数里构造,里面有构造CDC的信息)。
「已注销」 2009-12-04
  • 打赏
  • 举报
回复
因为传递进去的是一个指针。
const int BLOCK_LINE = 20;//当前地图的行数 const int BLOCK_ROW = 10;//当前地图的列数 class CBlock { public: CBlock(void); ~CBlock(void); private: // 当前方块形状 int m_BlockShape; //下一个方块形状 int m_nextBlockShape; //当前方块状态 int m_BlockState; //等级 int m_BlockLevel; //当前可消行数 int m_BlockCurDelLine; //游戏是否在执行 bool m_blockRunning; //当前方块位置 POINT m_BlockPos[4]; //下个方块位置 POINT m_nextBlockPos[4]; //当前的屏幕状态 //BLOCK_LINE是行数,BLOCK_ROW是列数 int m_Blockmap[BLOCK_LINE][BLOCK_ROW]; public: // 初始化游戏 void BlockInit( void ); private: // 记录方块图形 CBitmap m_bmpBlock[7]; public: //创建一个新的方块出来,这里只给方块形状赋值 void CreateNewBlock(void); private: //这里给方块位置赋值, //shape是形状, pt[]是用来接收方块坐标的(方块形状的排列坐标)数组 //xPos是偏移量,就是方块显示位置和方块显示的框的最左边的差 void MakeNewBlock(int shape, POINT pt[], int xPos); public: //将方块画在对应的DC上 void DrawBlock(CDC* pDC); //方块的下落过程,主要部分 void BlockDropDown(CDC* pDC); private: // 隐藏方块 void HideBlock(CDC* pDC); // 背景图片变量 CBitmap m_bmpBKGND; public: // 画下个方块的框框 void DrawNextBlock( CDC* pDC ); //方块左移 void BlockLeft(CDC* pDC); //方块右移 void BlockRight(CDC* pDC); //方块下移 void BlockFastDown(CDC* pDC); //方块变形 void ChangeState(CDC* pDC); // 消除一行 //pDC是传入的DC //LineNum是消除的行从第几行开始(我这里是最上面为0,最下面为19) //start是 游戏是否是要把消除行以上的都置0,我是用在OnDraw()里,用来重画屏幕的, void DeleteLine(CDC* pDC, int LineNum, bool start); // 游戏是否结束,true=结束了 bool BlockGameOver(void); // 计分板 //del是决定是否是已消一行的 void BlockScore(int del, CDC* pDC); //返回是否升级了,true=升级了 bool BlockLevelUp(void); //返回下落速度 int BlockSpeed(void); };

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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