怎么在OnInitialUpdate函数中添加一个定时器,以便调用OnTimer
时间: 2024-02-01 08:16:47 浏览: 27
可以在OnInitialUpdate函数中添加以下代码来创建一个定时器:
```
SetTimer(1, 1000, NULL);
```
这将在1000毫秒后创建一个ID为1的定时器,并将其与OnTimer函数关联,以便在每次定时器事件发生时都调用OnTimer函数。在此之后,您需要在您的类中实现OnTimer函数来处理定时器事件。例如:
```
void CMyView::OnTimer(UINT_PTR nIDEvent)
{
// 处理定时器事件
}
```
请注意,如果您不再需要该定时器,您应该在适当的时候使用KillTimer函数来删除它,以避免资源泄漏。例如,在视图销毁时:
```
void CMyView::OnDestroy()
{
CView::OnDestroy();
KillTimer(1);
}
```
相关问题
MFC view 不调用OnInitialUpdate
MFC中的View类的OnInitialUpdate函数是在视图被创建后首次显示前被调用的。如果你的MFC View类没有调用OnInitialUpdate函数,可能是以下几个原因之一:
1. 你没有在创建视图后调用CView类的OnInitialUpdate函数。通常在视图类的Create函数中调用OnInitialUpdate函数,例如:
```
BOOL CMyView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
if (!CView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext))
return FALSE;
OnInitialUpdate(); //调用OnInitialUpdate函数
return TRUE;
}
```
2. 你没有在创建视图时指定正确的创建上下文(CCreateContext)。在创建视图时,需要指定正确的创建上下文,包括文档对象指针等信息。如果创建上下文不正确,OnInitialUpdate函数可能不会被调用。例如:
```
CMyView* pView = new CMyView;
CCreateContext* pContext = new CCreateContext;
pContext->m_pCurrentDoc = pDoc; //指定文档对象指针
pView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, pParentWnd, nID, pContext);
```
3. 你在重写OnInitialUpdate函数时没有调用基类的实现。如果你重写了OnInitialUpdate函数,需要在自己的实现中调用基类的实现,以确保MFC框架能够正确处理视图的初始化过程。例如:
```
void CMyView::OnInitialUpdate()
{
CView::OnInitialUpdate(); //调用基类的实现
//自己的初始化代码
}
```
同一个视图中同时显示两个一样的文档
在MFC中,如果要在同一个视图中同时显示两个一样的文档,可以按照以下步骤操作:
1. 在文档类中添加一个成员变量,用于保存第二个文档对象指针:
```cpp
class CMyDoc : public CDocument
{
public:
// ...
CMyDoc* m_pOtherDoc;
};
```
2. 在文档类的构造函数中将第二个文档对象指针初始化为NULL:
```cpp
CMyDoc::CMyDoc()
{
// ...
m_pOtherDoc = NULL;
}
```
3. 在文档类中添加一个函数,用于设置第二个文档对象指针:
```cpp
void CMyDoc::SetOtherDoc(CMyDoc* pOtherDoc)
{
m_pOtherDoc = pOtherDoc;
}
```
4. 在视图类的OnInitialUpdate函数中,将第二个文档对象指针指向当前文档对象:
```cpp
void CMyView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// ...
GetDocument()->SetOtherDoc(GetDocument());
}
```
5. 在视图类中重写OnUpdate函数,以便在第二个文档对象更新时也更新视图:
```cpp
void CMyView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CView::OnUpdate(pSender, lHint, pHint);
// ...
CMyDoc* pDoc = GetDocument();
if (pSender != this && pDoc == pDoc->m_pOtherDoc)
{
Invalidate();
}
}
```
6. 在文档类中重写OnOpenDocument函数,在打开第二个文档时将第二个文档对象指针指向当前文档对象:
```cpp
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// ...
if (m_pOtherDoc == NULL)
{
m_pOtherDoc = this;
}
return TRUE;
}
```
完成以上步骤后,就可以在同一个视图中同时显示两个一样的文档了。在打开第二个文档时,需要注意将第二个文档对象指针指向当前文档对象,否则会出现错误。同时,在更新视图时,要判断是哪个文档对象更新了,以避免出现重复更新的情况。