MSDNのATLサンプルで(Polygon)、ATLを勉強し始めました。
ATLのクラスにはウインドウメッセージが追加できるんだって
けれど、WM_TIMERメッセージを追加するのはできるにはできるんだけど、
タイマーを起動する時、エラーが発生しました。
デバッグしてから、m_hWndハンドルがなんと0!
どうしてウインドウのハンドルが0ですか?
タイマーなどのメッセージがハンドルが必要なときはどうするんでしょうか?
ATLをはじめたばかりです、分からないところがいろんあるんです、
よろしくお願いします
WindowsXP , Visual C++.NET 2003で開発しています。
>どうしてウインドウのハンドルが0ですか?
ウィンドウが作成されてないから。
オブジェクトを作成しただけではウィンドウは作られないのは理解できてますか?
いま作成しているのはATLのコントロールです。
このコントロールクラスは、間接にCWindowの派生クラスで、
ひとつのウインドウだと思います。
ActiveXコントロール コンテナ にコントロールをロードする時、
コントロールが作成されて、そのコントロールのウインドウハンドルも
作成されると思いますけど、意外と0になった…
ATLコントロール作成した後、再びウインドウを作成する必要があるんですか
「タイマーの起動」と「コントロールの作成」は
どちらが先ですか?
コントロールの作成してから、WM_TIMERメッセージを作成、
SetTimerkメソッド呼び出したら、エラーです。m_hWnd == 0
コントロールを作成したタイミングでのm_hWndの値がNULLで無いことは確認しているのですか?
編集 削除MSDN から 勉強したATLプロジェクトを作成する手順で ATLプロジェクト作成しました。
ファイル-->新規作成-->プロジェクト-->ATL-->ATL プロジェクト-->OK
そして、次のATLプロジェクトウィザードの「アプリケーションの設定」ページに
属性チェックボックスをオフにした。
で、プロジェクト作成されたら、プロジェクト-->クラスの追加-->ATL-->ATL コントロール
ATL コントロールをプロジェクトに追加しました。
次のATLコントロールウィザードに
名前ページに 属性をオフにして
オプションに 接続ポイントをオンにして
表示ページに 挿入可能をオンにして
完了をクリックして ATLコントロールを作りました。
OnDrawメソッドに this->SetTimer(1,1000); 呼び出して、
ActiveX テストコンテナ で テストしたら、再描画すると エラーが発生、
デバッグしたら、m_hWnd が NULL だと発見しました
MSDN のサンプルもテストしました、同じ結果です。
m_hWnd 無効のようです。