電子書籍の厳選無料作品が豊富!

こんにちは、VC++初心者です。

今MFCでデスクトップマスコットを作りたいと思っています。
MFCのSDIアプリでとりあえず作成している最中で、
BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。

問題はウィンドウ枠です。
スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、
リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。

ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、
SetWindowRgn関数がうまく動いてくれていない状態です(泣)。

ソースの一部をのせておきますで、どうかご判断ください。
宜しくお願いします。



CTestView::CTestView()
{
//コンストラクタでビットマップの読み込みとリージョンの設定
gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数

m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1
m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1

}

void CTestView::OnDraw(CDC* pDC)
{
//画像表示及びリージョンの切り替え
中略...
static int anim = 0;

CDC dc;
dc.CreateCompatibleDC( pDC);

dc.SelectObject( gazou);
pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND);//48*48ドットのBMP

HRGN hrgn =(HRGN)m_rgn[anim].Detach();
SetWindowRgn( hrgn, true);

dc.DeleteDC();
anim ^= 1;

中略...
}

A 回答 (2件)

参考になるか分かりませんが昔似たようなものを作った時は


下記のようにしました

1.ダイアログベースで作成
2.OnInitDialogでSetWindowRgn/Timer設定
3.OnTimerでSetWindowRgn/リペイント
4.OnPaintで画像の表示

ってな感じでした。
SDIで作る場合にはViewの親ウィンドウのCMainFrameに対してもSetWindowRgnを行わないといけない気がします(自信ないですが・・・)
あとOnDraw内でSetWindowRgnを行うのもあまりよくない気がします。
    • good
    • 0
この回答へのお礼

お答えありがとうございます。
あと、お返事が送れて、申し訳ありませんでした(ぺこり)。

SDIだとCMainFrameにもSetWindowRgnしないといけないというのは、
わかるようなきがします。(まだ試していませんが)

やはり、ダイアログベースで作成しようかと思います。

それと、あるサンプルソースが手元にありますが、
私がVC++初心者ということもあり、それがダイアログで作られたのかどうか、
確かめるのにどうすればいいのかよくわかりません。

たとえば、「TEST」というプロジェクトで「TESTDLG.CPP」が作られていれば、
ダイアログベースで作成されたと思っていいのでしょうか?

あつかましくお尋ねしてすみませんが、
よろしくお願いします。

お礼日時:2002/10/14 13:35

>たとえば、「TEST」というプロジェクトで「TESTDLG.CPP」が>作られていれば、


>ダイアログベースで作成されたと思っていいのでしょうか?

そうとも言えますけど、実際にはCWinApp::InitInstanceで
ダイアログクラスを生成/表示していればダイアログベース
なんじゃないでしょうか。
    • good
    • 0
この回答へのお礼

お答え、ありがとうございます。

そもそものアプリの構造を把握していないのは致命的ですね(汗)。
MFCの勉強をしつつ、目的のアプリを作れるよう頑張ってみますね。

お答え、本当に参考になりました。
ありがとうございました。

お礼日時:2002/10/15 14:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!