2017-02-01 7 views
0

私はCWnd :: SetTimer(MFC ActiveX COM)を使用しますが、アサーションはhwndが存在しないと出てきます。 Jacobからhwndを設定できますか?これはアサーションコードです。hwndをJacobから設定できますか?

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

ライン、「あなたはそれが間違ってやっています。」

いいえ、hwndをJacobから設定することはできません。私はあなたがCWnd :: SetTimer()をどのように呼び出すのか興味深いでしょう。常に作成され、それに関連付けられたm_hWndを持つウィンドウからのものでなければなりません。したがって、有効なウィンドウがあると仮定すると、次のようになります。

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

CWnd(または派生)は既に作成されている必要があります。だから、あなたはいくつかのオプションを持っている...

は...

あなたは、いくつかのクラスを持っている必要があり、そのクラスからあなたはSubclassWindowを呼びたい....あなたは既にHWNDのHWNDを持っていると言う

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 
+0

ありがとう、私はそれを解決しました。非常に分岐したOntimerがあったので、私は既存のocxを修正して、SetTimerにダミーのHWNDを作成する必要がありました。 –

関連する問題