ガンモドラーと申します。
前回、最小化ボタン付Dialog画面の件でご相談申し上げたところ、SDIでフプロ
ジェクトを立ち上げ、CViewをCFormViewに変えなさい、というご示唆をいただきこの問
題は解決しました。
これによりDialogタイプのSDI画面が立ち上がります。今回お教え願いたいのは、画面
起動前に、チェックボックスなどコントロールの初期化をどこで行えばよいかというこ
とです。
myclassAppのInitinstance()内で:
CmyclassView myview;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
⇒ myview.myInitialize();
return TRUE;
のように記述したのですが、myiInitialize()内の
CButton* mybtn = (CButton*)GetDlgItem(IDC_BUTTON1);
のところでassertionエラーになります。追いかけてみるとGetDlgItem内で
ASSERT(::IsWindow(m_hWnd));
のm_hWndが取得されていないので当然のようです。
しかし、画面起動後、ボタンタスクとしてmyInitalize()を実行すると問題なくすべて
のイニシャライズが行われます。当然m_hWndも取得されています。
どうもどこで取得したのか分かりません。Dialog表示前に、特に操作無しにこの初期
化はしておきたいのですが方策が見出せません。
なにかdialogクラスの追加等の必要性はあるのでしょうか?。
初歩的過ぎる質問で申し訳ありませんがよろしくご教示願います。
webでの質問とは1(自分)対不特定多数者とのやり取りになりますので
必ず毎回、実行OS、開発環境、バージョン、Win32API、MFC、SDI,MDI、利用基本クラス
の明示を最初の質問を行う際に提示しましょう
前回は確か、VC++6、MFC利用 SDIでしたね
今回も変わりないでしょうか
MFCの簡単な入門書購入してみてはどうでしょうか?
この手の疑問解決してくれそうな本、「スタンダード Visual C++」こんな感じの
タイトルの本ありましたよ
立ち読みしかしていないので確実かどうかは????
>CmyclassView
の OnInitialUpdate でviewの初期化を行ってください
>GetDlgItem
という関数は
メインフレームにビューが登録され、さらに何かしらのコントロールがビューに登録
された後じゃないと使えない関数です
既に書籍を持っているかもしれませんが、
なかなか一冊もっていれば十分と言う本はありません。
手持ちの本で足りなければ、追加購入を考えた方が良いです。
粗方網羅するには2、3冊は少なくともいると思います。
入門書と言ってもその本ごとに得意な分野と言うか、
詳しい分野があってそれ以外の部分は流す程度とか
力の入れどころが本によって違うと思います。
手持ちの本とWeb上の情報を駆使して解決できるようになれると
問題の解決が早くなるので頑張ってみてください。
どうしても掲示板で質問するとなると解答が付くのに時間がかかりますし、
必ず解答が付くと言う物でもありません。
回答を書いている方もボランティアなので当てにされ過ぎると
辛い物があります。
wood様 PATIO様
OS、ツールの件、失念申し訳ありません。XP、Visual Studio6、
MFCの環境です。
解決をチェックしていませんが、実質解決しました。
ご指摘のように OnInitialUpdate でviewの初期化は成功しました。
実はこれは真っ先に試みたことだったのです。しかしその時点ではassertエラ
ーで不成功でした。そこから迷走、その理由として順序を追うとOnInitialUpdateの後に
InitInstance()が呼ばれることが分かり、ここでハンドルが取得されていなければ以前
のプロセスでは可能性がない、と考えてしまったことにあります。しかしこれは間違い
ですね。ハンドルが利用可能かは常に変るのでしょう。
最初に試みたOnInitialUpdateでうまく行かなかったのは、この時点でmyInitialize()
にバグがあったのでしょう。
PATIO様ご指摘のようにこのレベルの質問でボードをにぎわせてしまったのは申し
訳ありませんが、VB,C等では書物を参考に自立的に解決できた問題が、どうもVC
++、MFCでは同じサイクルを回りません。非常に焦っています。
言語の参考書は林晴比古先生のものが緻密に書かれているので好きで過去はとてもお
世話になっていました。しかしMFCに関する限り2件質問した初歩的な内容が把握で
きないでいます。
何かアドバイスがあればぜひお願いいたしたいと思っています。解決にチェックしな
かったのはそのためで、Resいただけないようであれば解決にします。
有難うございました。
質問のレベルについては特に問題は感じていません。
誰でも最初はわからないと思いますから。
質問の仕方としては、woodさんが指摘されている通りなので
それに気をつけてくだされば良いと思います。
自分で解決できた方が効率が良いと言うのは、
掲示板事態が結局ボランティアの回答なので
確実性とか回答スピードを求められても難しいので
結局、確実で当てになるのは自分ですよと言いたかったのです。
VC++と一言で言っていますが、
実は一つではなく複数の要素から成り立っています。
一つは、C++言語です。
既に書いていますが、この知識は必須です。
これが無いとVC++以前のところで引っかかってしまいます。
二つ目にWindowsに関する基礎的な知識。
この部分を抑えている人が少ないように感じます。
Windowsの仕組みに関する知識は開発環境にかかわらず、
必要だと私考えているんですが、VBとかだと違うんでしょうか。
さらに開発環境であるVC++の理解が必要です。
これに関しては開発環境の入門書が出ているので参考になるでしょう。
そしてMFCを使うのであれば、MFCに関する知識が必要です。
VC++と言うとMFCをゴッチャにしてしまいがちですが、
VC++で開発をする=MFCで開発をするとはなりません。
VC++でWin32APIを使って開発をすると言う選択肢もあります。
MFCはフレームワークとしてよく出来ている反面、Windowsの仕組みの大半を
カプセル化し利用者の目から隠してしまっています。
それゆえに全体の動作が見えにくく、迷ってしまうことが多いようです。
Windowsの仕組みがイベントドリブンであることは変わりませんから、
ウインドウメッセージとMFCのフレークワークの関係を理解すること、
ドキュメント・ビュー・アーキテクチャを理解することは必要だと思います。
この他、画面描画の仕組みや印刷の仕組みなど理解して利用すれば、
色々な実装をうまく載せるための仕組みが色々備わっています。
MFCのフレームワークを使ってプログラミングすると言うことは、
MFCのフレームワークが作っている流れにうまく乗ってその中に自分の処理を
載せていくことだと思います。
MFCの参考書はVC++のものとは別に必要だと思います。
VC++の入門書ではMFCのフレームワークの表面だけしか触れていないと
思います。MFCを利用してアプリケーションの開発を行うのでしたら、
MFCの仕組みを理解することから始めないと使いこなしていくのは
難しいかもしれません。
PATIO様
丁寧なご教示、解説有難うございました。
現在はWindowsの仕組みへの理解は非常に浅い状態です。それでもVBであれ
ば問題に直面しても解説書、Netの情報を探し回れば何とか解決できてしまいまし
た。
VC++もSDK、WinApiを”猫でも分かる・・”で勉強を始めたのですが、
成果を急ぐあまりMFCに移行してしまいました。便利と感じながら靴の上から掻く感
じでコーディングしています。是非はともかくもうこれで突っ走るしかないと思ってい
ます。
私の場合は周囲に聞ける人がまったくいない孤立環境にいる不利があります。通常こ
のレベルの問題は聞くことで解決しているのでしょう。
MFC専門の解説書については林先生のVisual C++入門を参照しています
が、さらに初歩レベルの解説書を探してみます。
PATIO様はじめボランティアの方々が多大の時間をかけてお教え下さっているこ
とに感謝しています。