久しぶりに質問させていただきます。
SDKの勉強をするとWinMan()関数からメインになっているとわかりますが。
MDIやSDIのスケルトンをみてもどこがメインになっているかわからならないので、どう
いうプログラム構成かわかりません、どうしたらわかるのでしょうか?
CxxAppクラスのInitInstance()からではいかがですか?
F11を押す。
最近のMFCによるプログラミングの入門書を言うのを読んだことがないので
もしかしたら書いている本が無いのかもしれませんが、
この辺の一連の流れって入門書に書いていないのですか?
少なくとも一般的にプログラマが記述する必要がある部分で
アプリ起動時に何処が最初に動くかと言う話くらいは書いてあってもおかしくない
と思うんですけれど。
この辺の処理の流れがMSDNのどこかに書いてあったような気がしますが、
位置までは覚えてないです。
F11を押しました。デバックだと思いますが、内容が理解できないです。
MFCは余分なプログラムが多すぎでないでしょうか
SDK プログラムの WinMain さえ、厳密には一番最初ではありません。
SDK プログラムの本当の一番最初は WinMainCRTStartup という関数です。
が、そんなことはどうでもよいことです。
WinMainCRTStartup から WinMain に至るまでのコードにプログラマが手を入れる必要は
なく、むしろ下手にいじると良くないことが起きます。
WinMain が一番最初と覚えておいた方が良いと思います。
MFC の一番最初は CWinApp 派生クラスの InitInstance です。
これも厳密には一番最初ではなく、その前にいろんな処理があります。
F11 を押したときに見られるのは、そのいろんな処理の開始地点、MFC プログラムの本
当の一番最初です。
しかし、そこから InitInstance に至るまでに何をしているかを知る必要はありませ
ん。
SDK の一番最初は WinMain、MFC の一番最初は InitInstance です。
そう思うなら MFC 使わなきゃいいだけです。
っていうか、MFC は起動時処理等をカプセル化してくれていて、
我々末端のプログラマはそーいう瑣末なところを(あまり)気にしなくていい
というのが MFC の売りなのだと思うのですが違うのでしょうか?
int main() から入門した我々の世代的には、MFC プログラムって
どこで何をしてるかわかりにくいという点にめっちゃ同意。
コンソールアプリの時は、「システムの関数を自分が呼び出す」のに対して、
MFC などは「自分が作った関数が、システムから呼び出される」という点で
設計概念のパラダイム転換が必要です。ただ、これに対応できたら、
そのときにはああなるほどと納得すると思う。
けじゅさんは、今は MFC の良い入門書を読むべきレベルにあるのでしょう。
「メッセージハンドラが呼び出される」プログラム構造に納得できたら、あとは
どんなメッセージがあって、いつ呼ばれるか、を探せばよいだけです。
>デバックだと思いますが、内容が理解できないです。
内容が理解できるように勉強するのです。
http://www.kumei.ne.jp/c_lang/indexmfc.html
一応ここを紹介しておきます。血眼に読みましょう。何か掴めるかもしれません。
「MFCは余分なプログラムが多すぎでないでしょうか」
この台詞が出てきてしまう時点でC++言語の知識が足りないのではと感じてしまいます。
C++言語においてクラス内の処理をカプセル化し、外部が意識無くても使えるようにする
のは、割と基本的な部分です。
プログラマは、クラス内に隠蔽されている部分を意識せずにオーバーライドすることで
機能の追加を行うことができ、なおかつ、いずれのアプリケーションでも同じ処理で済む
部分はMFCに任せることが出来ます。
MFCを使うと言うことはMFCが提供しているフレームワークを理解し、うまくこれを利用
すると言うことです。
SDKによってアプリケーションを構築していて気が付いたと思いますが、
実際のところWindowsのアプリケーションには決まりきった定型の部分があります。
この定型の部分をうまく隠蔽しているのがMFCだと考えてよいと思います。
SDKとMFCでは、そもそもアプローチ方法が違うわけですから、使う方もそれにあわせて
考え方を変える必要があります。
但し、これはC++言語の知識がきちんと土台にあることが前提です。
C++言語の知識が怪しいのであれば、今一度、C++言語を勉強されることをお勧めします。
> MFCは余分なプログラムが多すぎでないでしょうか
MFCというよりAppWizardが、って気がしますよ。
AppWizard使わなくてもMFCは使えるわけで、1から自分て作ったらSDKの物とも対比しやす
いですしね。
私も、最初はMFC+AppWizardから入りましたがチンプンカンプンでしたよ。
SDKからAppWizard未使用でMFCに入ったら結構わかりやすかった。
でも、正直いって、MFCってあまりすきじゃないんですけどね。
引数付きマクロばっかだし・・・
結局、MFCって使わなくてもいいわけで、AppWizardに関しては仕組みを理解するという
意味では使わない方がいいと思います。
あ、別にMFCが便利じゃない、と言っているわけでないですよ。
そうです。確かに私は知識が乏しいです。MFCに関しては・・・ゴチャゴチャして理解しがたい
です。ですからウインドウズ用プログラムを組む時はWinAPIを使います。でも逆に言えば、
Visual C++ でも Borland C++ 系でも コンパイルできるソースを書くことができますので、
MFCは使う気にはなれません。って、みなさん(私も含めて)主題から話がずれてますね。これ
くらいにしときましょうね。
>MFCてどこからはじまるですか?
CxxAppクラスのオブジェクトが最初に定義されているところからプログラムが始まります。
CxxApp theApp;
ってところからです。ですから、
CxxApp::CxxApp()
{
//TODO~
//~
}
が、開始位置と考えていいでしょうね。コンストラクタ(初期化)ってことです。ちなみに確
か、これはWinMain関数が実行される前に実行されます。WinMain関数はMFCの中に定義されて
いるので見えないだけなんですね。
みなさまたくさんの意見ありがとうございます。
とっても参考になりました。
C++をきちんとマスターしSDKをきちんとやり、MFCに挑戦したいとおもいます。