はじめまして。VisualCをはじめて間もないのですが、
独学でプログラムをはじめました。
ご返答をよろしくお願いいたします。
質問:
タイトル:子ウィンドウのクライアント領域に表示した円が消えてしまう
現象:
作成した子ウィンドウを親ウィンドウの隅っこまで見えなくなるまで移動させてから、
親ウィンドウの中央や適当な位置に戻すと子ウィドウのクライアント領域の円が消えて
しまいます。
以下に簡単ですがソースを載せます。
プログラムは子ウィンドウに円を描かせるというものである参考書を参考に
VCで記述したものです。
//子ウィンドウのボタンを押すと円を描く
void CLibraryDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
if(GetDescendantWindow(ID_CHILD1)==NULL){
CWnd* w=new CWnd;
w->Create(NULL,子ウィンドウ,WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CRect(50,50,500,250),this,ID_CHILD2);
CDC* pDC;
pDC=w->GetDC();
pDC->Ellipse(0,0,100,100);
w->ReleaseDC(pDC);
}
}
質問:子ウィンドウは親ウィンドウの中しか移動できないので、親ウィンドウの
外に移動できるようにすれば現象は解決できるのでしょうか。
また、質問のタイトルには記述しなかったのですが、作成した今回の
子ウィンドウにボタンやリスト、スクロールバーを配置することはMFCでは可
能なのでしょうか。
まだ、入門者のレベルに到達していないまったくの初心者ですが、何卒ご教授を
よろしくお願いいたします。
子ウインドウのOnDraw()の中に、円の描画を入れましょう。
>子ウインドウのOnDraw()の中に、円の描画を入れましょう。
aaa さん、それは少し違うでしょう。CLibraryDlg ということはおそらく
CDialog クラスから派生させたものでしょうから OnDarw() ではなく OnPaint() では
ないかと思います
小川さん、やはりアプリケーションの種類(コンソール/ウィンドー、SDI/MDI/ダイアログ
ベースなど)や MFC 使用の有無やOSのバージョン、VC++のバージョンなどいわゆる
環境についてはきちんと知らせてください
>>島さん
失礼いたしました。
以下に指摘された点について返答いたします。
・アプリケーションの種類:ダイアログベース
・MFCの使用の有無:有
・OSのバージョン:Windows XP
・VCC++のバージョン:Ver6.0
以上です。
ご不明な点がございましたらご指摘お願いいたします。
>>島さん
もう一点、説明不足な点がありましたので
返答いたします。
島さんがおっしゃる通り、
>aaa さん、それは少し違うでしょう。CLibraryDlg ということはおそらく
>CDialog クラスから派生させたものでしょうから OnDarw() ではなく OnPaint() では
>ないかと思います
OnDraw()でなく、OnPaint()を使っています。
以上、失礼いたしました。
いくつか指摘しておきます。
まず、何で子ウインドウの描画を親でやっているのか?
ウインドウの描画はそのウインドウ内に封じ込めておかないと
今回のようにOSから再描画の指示が来たときに描画できません。
VCが云々と言うより、Windowsでのプログラミング自体が初めてなんですかねぇ。
Windowsの描画の仕組みが理解できていないためにこんなことになっていそうな気が
します。
基本的にそのウインドウの描画はそのウインドウ内で行います。
そのウインドウ内で行われる描画は全てOnPaintで行われるようになっている必要が
あります。但し、描画部分の一部を関数化してそれをOnPaintからも他の関数からも
呼び出すと言うのであれば、それはOKです。
OSからの再描画指示はOnPaintで実行されると言うことを頭においておきましょう。
あと、この辺のWindowsの仕組みを理解しておかないと同じ間違いを繰り返します。
この辺はWindowsのプログラミングの解説書などを読まれることをお勧めします。
単純に言語の勉強ならOSのその辺のからくりを知らなくても何とかなりますが、
Windowsのアプリを作成する勉強をしているならOSの知識は必須だと思ってください。
あと、C++言語の知識が無いのであれば、アプリの勉強よりも
C++言語の勉強を先にした方がいいです。
C++の知識無しにMFCを使っていると間違った使い方に気が付かなくてハマリます。
環境はVC++を使ってもかまいませんが、
言語の勉強をするのであれば、コンソールアプリでMFC無しの環境で勉強しましょう。
もちろん、C++言語の入門書は必須です。
VC++の入門書では言語の勉強は出来ませんので。
>>PATIOさん
ご指摘ありがとうございました。
ご指摘のようにC++の知識が足りないと実感させられました。
C++を勉強してからVC++のほうに進んでいきたいと思います。
あと、OSの勉強もやり直していきたいと思います。
以上、ご丁寧なご指摘ありがとうございました。