我想在一个非窗口类中绘制一个圆, 每隔一段时间重绘一次;
下面是实现定时器的代码, 运行可以通过;现在的问题是: 我不知道要把绘图函数放在哪里? 放在回调函数里的话一直运行不成功;请高手指教;///////////////以下是代码部分////// 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);
}
解决方案 »
- 各位c++ coders,你们会鄙视藐视轻视甚至无视c#程序员吗?
- 在MFC中的问题 task3.exe 中的 0x004176b5 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 送分的简单问题!
- Win7 注册动态库问题
- COM文件导入问题
- 奇怪问题,要求置顶,win32 Dynamic-link library 连接 sybase 数据库的问题,详细请进。
- 为什么用CListCtrl的SetExtendedStyle设置过后没有效果呢?在线,谢谢了。
- 进程间通信有那几种方法?
- 怎样判断端口已打开?
- 标准->专业->标准(中国软件发展必经之路)
- 对话框切换显示
- 对话框上的子控件的SetWindowText在多线程环境下出现文本重叠的奇怪情况,不知如何解决?
比如:
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);
}
我是在OnDraw函数里写的绘图函数; 但是如何让定时器去重复调用OnDraw函数进行绘制呢?
我在回调函数里 这样调用重绘的: CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
CTimerView *pView=(CTimerView *)pMain->GetActiveView(); pView->Invalidate();可是我在CTimerView 类中又要调用该类的SetMyTimer函数, 这样绘造成头文件循环调用啊
函数。他在程序里没有其它的消息。
就可以响应他。
你只要在OnDraw()
里画图就好了。
不过。在OnTimer()
让窗口重绘Invalidate()