如何从"无模型"对话框中停止CChildView计时器



我在CChildView::PreSubclassWindow()期间用SetTimer( 1 , 25 , 0 );创建了一个计时器。

CChildView::OnTimer()中,我执行InvalidateRect( 0 , 0 );以引起CChildView::OnPaint()。这将导致读取和绘制文件中的记录。

所有这些都很好。

MyApp::InitInstance()期间,我创建了一个带有几个控件的无模式对话框,这些控件都按预期工作。

我想做的是从对话框控件控制CChildView中运行的计时器。问题是,我找不到或无法访问CChildView的实例。因此,我无法在CChildView中调用我的SetTimerSpeed()函数。

请问我该怎么做?

创建对话框时,在对话框对象中存储指向视图的指针。您可以只使用这个来访问视图实例。在对话框类声明中添加视图指针成员:

class CMyDialog : public CDialogEx
{
public:
CChildView *pView;
.
.
}

当调用它时:

CMyDialog ctDlg;
ctDlg.pView = this;
ctDlg.DoModal();
// or ctDlg.Create();

当然,上面的代码可以从CChildView中的处理程序(函数(调用。

如果应用程序是SDI,你甚至不需要它,你只需要将指向视图的指针存储在一个全局变量中,就可以了:

// Declaration in the .h file
extern CChildView *pChldVw;
// Definition in the .cpp file
CChildView *pChldVw;
// CChildView constructor
CChildView::CChildView() noexcept
{
pChldVw = this;
}

如果应用程序是MDI,并且没有在CChildView代码中创建对话框,则仍然可以通过调用以下内容来查找视图实例:

CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->GetMainWnd();
// Get the active MDI child window.
CMDIChildWnd *pChild = (CMDIChildWnd*)pFrame->GetActiveFrame();
// Get the active view attached to the active MDI child window.
CChildView *pView = (CChildView)pChild->GetActiveView();

还有一些";枚举";功能,如:

  • GetFirstDocTemplatePosition()/GetNextDocTemplate()
  • GetFirstDocPosition()/GetNextDoc()
  • GetFirstViewPosition()/GetNextView()

最新更新