我可以设置雅各布的hwnd吗?

时间:2017-02-01 10:50:46

标签: java mfc activex ocx jacob

我使用CWnd :: SetTimer(MFC ActiveX COM),但声明没有hwnd。 我可以从Jacob设置hwnd吗?这是断言代码。

Afxwin2.inl第152行。

_AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse,
        void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD))
{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
    lpfnTimer); }

1 个答案:

答案 0 :(得分:1)

从电影“妈妈先生”中不朽的话来说,"你做错了。"

不,你不能设置Jacob的hwnd。我会很有趣你如何调用CWnd :: SetTimer()。它应该始终来自已创建的窗口并且具有与之关联的m_hWnd。因此,假设您有一个有效的窗口,请致电:

// assume pWnd is a CWnd* or derived object that has been created.
pWnd->SetTimer(nIDEvent, nElapse, NULL);

必须已经创建了CWnd(或派生)。所以,你有一些选择......

假设你已经有一个HWND hwnd ....

你应该有一些课程,你可以从那个班级调用SubclassWindow ......

CSomeWindow someWindow; // declaring these on stack probably bad idea
someWindow.SubclassWindow(hwnd);
someWindow.SetTimer(nIDEvent, nElapse, NULL); 

另一个选择是你创建窗口......

CSomeWindow someWindow; // declaring these on stack probably bad idea
someWindow.Create(.... create params);
someWindow.SetTimer(nIDEvent, nElapse, NULL); 

CSomeWindow* pSomeWindow = new CSomeWindow();
pSomeWindow->Create(.... create params);
pSomeWindow->SetTimer(nIDEvent, nElapse, NULL); 

在上面的例子中,没有提供func - 只是NULL。在这种情况下,它将路由到您的ON_WM_TIMER()处理程序。

OTOH,也许你有一个窗口(你的OCX控件?),你想设置计时器。好吧,你只想确保在创建窗口(HWND)后调用它。在创建OnCreate()方法之后的某个时间。这可能是你的问题,但你没有什么信息,我只是在黑暗中刺伤。

pYourOcx->SetTimer(nIDEvent, nElapse, NULL);

然而,从技术上讲,你甚至不需要窗户。您可以调用SetTimer()的Windows API版本...

::SetTimer(NULL, nIDEvent, nElapse, MyTimerFunc); // MyTimerFunc is your user defined timer function