我想在一个非窗口类中绘制一个圆, 每隔一段时间重绘一次;
下面是实现定时器的代码, 运行可以通过;现在的问题是: 我不知道要把绘图函数放在哪里? 放在回调函数里的话一直运行不成功;请高手指教;///////////////以下是代码部分////// MyTimer.h 文件代码#include <afxtempl.h>class CMyTimer;//用模板类中的映射表类定义一种数据类型
typedef CMap<UINT,UINT,CMyTimer*,CMyTimer*> CTimerMap;class CMyTimer 
{
public:
  //设置定时器,nElapse表示时间间隔,sz表示要提示的内容
  void SetMyTimer(UINT nElapse,CString sz);  //销毁该实例的定时器
  void KillMyTimer();  //保存该实例的定时器标志值
  UINT m_nTimerID;  //静态数据成员要提示的内容
  CString szContent;  //声明静态数据成员,映射表类,用于保存所有的定时器信息
  static CTimerMap m_sTimeMap;  //静态成员函数,用于处理定时器的消息
  static void CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
  CMyTimer();
  virtual ~CMyTimer();
}; // MyTimer.cpp文件代码#include stdafx.h
#include MyTimer.h
//必须要在外部定义一下静态数据成员
CTimerMap CMyTimer::m_sTimeMap;
CMyTimer::CMyTimer()
{
  m_nTimerID = 0;
}
CMyTimer::~CMyTimer()
{
}
void CALLBACK CMyTimer::MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
  CString sz;
  sz.Format(_T("%d号定时器:%s"),
    idEvent,
    m_sTimeMap[idEvent]->szContent);
  AfxMessageBox(sz);
}
void CMyTimer::SetMyTimer(UINT nElapse,CString sz)
{
  szContent = sz;
  m_nTimerID = SetTimer(NULL,NULL,nElapse,MyTimerProc);
  m_sTimeMap[m_nTimerID] = this;
}
void CMyTimer::KillMyTimer()
{
  KillTimer(NULL,m_nTimerID);
  m_sTimeMap.RemoveKey(m_nTimerID);
}

解决方案 »

  1.   

    绘图函数要放到你的窗口等OnPaint,OnDraw等函数中
      

  2.   

    你这种情况可以用个全局的timer处理函数就可以了
    比如:
    LRESULT CALLBACK TimerProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    {
            ///画你的圆
    HDC  mDC = GetWindowDC(single_hwnd_hook);//
    RECT mRect;
    GetWindowRect(single_hwnd_hook, &mRect);
    OffsetRect(&mRect, -mRect.left, -mRect.top);

    PatBlt(mDC, mRect.left, mRect.top, mRect.right - mRect.left, 9, DSTINVERT);///这里画了一个线
    ReleaseDC(single_hwnd_hook, mDC);
    return DefWindowProc(hWnd, message, wParam, lParam); 
    }
      

  3.   


    我是在OnDraw函数里写的绘图函数; 但是如何让定时器去重复调用OnDraw函数进行绘制呢?
      

  4.   

    在定时器中使用Invalidate刷新窗口...
      

  5.   

    定时器里Invalidate() 等引起重绘好了
      

  6.   


    我在回调函数里 这样调用重绘的: CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
    CTimerView *pView=(CTimerView *)pMain->GetActiveView();  pView->Invalidate();可是我在CTimerView 类中又要调用该类的SetMyTimer函数, 这样绘造成头文件循环调用啊
      

  7.   

    可是我在CTimerView 类中又要调用该类的SetMyTimer函数, 这样绘造成头文件循环调用啊提前声明一下
      

  8.   

    OnTimer()
    函数。他在程序里没有其它的消息。
    就可以响应他。
    你只要在OnDraw()
    里画图就好了。
    不过。在OnTimer()
    让窗口重绘Invalidate()