int CMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1; // TODO:  在此添加您专用的创建代码
 /* CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();*/
SetTimer(1,100,NULL);
return 0;
}
定义了一个SDI,我想问大家SetTimer(1,100,NULL);这个函数需要放在什么位置吗?
void CMFCView::OnDraw(CDC* /*pDC*/)
{
CMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
/* CString str("hello world!");
CDC *pDC=GetDC();
pDC->TextOut(50,50,str);
CSize sz=pDC->GetTextExtent(str);
str.LoadString(IDS_STRING101);
pDC->TextOut(300,300,str);
pDC->BeginPath();
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_XOR);
//CString str1;
//str1.LoadString(IDS_STRING101);
//pDC->TextOut(100,100,str1);
for(int i=0;i<=300;i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
ReleaseDC(pDC);
*/
// TODO: 在此处为本机数据添加绘制代码
SetTimer(1,100,NULL);
}
上面两个函数,我随便放在任意一个函数中,都能实现我的功能,请问SetTimer(1,100,NULL);
是不是放在CMFCView中任意位置都可以啊?还是有什么讲究呢? 

解决方案 »

  1.   

    最好不要放在ondraw里面,你想啊,每次重绘的时候都设置一次定时器啊!这样不好吧!最好在OnCreate里面,只设置一次定时器就好了
      

  2.   

    放在OnCreate函数中即可,不要放在OnDraw()中,SetTimer了以后,不再使用计时器的时候,KillTimer掉
      

  3.   

    可以结贴了 ~~
    放在OnCreate函数中!
      

  4.   

    CMFCView::OnCreate重载了CWnd::OnCreate函数
    以上的英文翻译成汉语为:当应用程序要求调用Create或CreateEx来创建Windows的窗口时框架会调用OnCreate函数。
    CView::OnDraw()
    每次重绘视图时都会调用OnDraw()函数,例如把最小化的窗口重新显示,被部分遮挡的窗口完全显示都会调用OnDraw()函数来重绘视图,因此如果你把SetTimer()函数放进OnDraw()函数体中可能会重复执行SetTimer()函数,从而造成错误。
    框架调用CView::OnDraw()来进行屏幕显示,打印和打印预览,以上三种情况下所传递的设备是不同的。程序没有默认的执行方式(可能必须在三种情况下选一种)。你必须重载该函数来显示你的视图。你可以用指向CDC对象的pDC参数来调用图形设备接口。在绘制视图前你可以把图形设备接口资源,例如画笔或字体,选入设备,绘图完成之后你可以取消你先前的选择。通常情况下你的绘图代码是设备无关的;即不需要知道用来显示图像的设备是什么类型的。为了优化绘图,调用设备的RectVisible成员函数来寻找是否要绘制一个给定的矩形。如果你需要区分正常的屏幕显示和打印,调用设备上下文的IsPrinting成员函数。
      

  5.   

    原则上是这样的,你调用一次之后,要调用killtimer将定时器关闭