初めてお世話になります。nauchiです。
表題の件について質問させてください。m(__)m
(開発環境)
開発:VisualStudio2005 VC++ (MFCは使っていません)
OS:WindowsXPpro
(困っていること)
あるアプリケーションを起動するときに、ジュワっとかっこよく
画像を表示したあとでアプリケーションのウィンドウを表示したい
と思っているのですが、うまくいきません。
あるサイトのサンプルを見て文字の描画は出来たのですが、
ビットマップの描画ができないです。
(ソースコード)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmd, int
showCmd)
{
HDC hDC = CreateDC(DISPLAY, NULL, NULL,NULL);
HWND hWnd = FindWindowEx(NULL, NULL, Progman, Program Manager);
HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
HBITMAP hBitmap = LoadBitmap(hInst, aaa.bmp);
BITMAP bmp;
int BMP_W, BMP_H;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
BMP_W = (int)bmp.bmWidth;
BMP_H = (int)bmp.bmHeight;
SelectObject(hDC, hBitmap);
BitBlt(hDC, 0, 0, BMP_W, BMP_H, hDC, 0, 0, SRCCOPY);
... 3秒間ウェイト ...
ReleaseDC(hWnd, hDC);
... ウィンドウ表示処理 ...
... メッセージループ ...
}
------------------
こんな感じで記述しています。
ほとんどWebのサンプルを見ながら書いています。
問題点をご教授頂ける方いらっしゃいましたらお願いいたします。
>BitBlt(hDC, 0, 0, BMP_W, BMP_H, hDC, 0, 0, SRCCOPY);
hDC->hDC!?
各処理の戻り値hDCとかhInst,hBitmapなどがNULLなどではなく正しい値か確認した?
ビットマップなら自分のプログラムのリソースなんじゃない?
ビットマップは表示先と互換のあるメモリDCを用意してこれにSelectObjectだよ
ビットマップを描画する手順はWeb上を探せば、ゴロゴロしていますから
まずはそれを勉強するのが先決でしょうねぇ。
MFCは使っていないと言う話なので定番のここで勉強してはどうでしょう。
「猫でもわかるプログラミング」
http://www.kumei.ne.jp/c_lang/index.html
僕も「猫でもわかるプログラミング」を参考にしています。
次のリンクで「第347章 ジュワッと出てくるウィンドウを作る」となっています。
http://www.kumei.ne.jp/c_lang/sdk4/sdk_347.htm
読むと SetLayeredWindowAttributes 関数を使うようです。
でも単に「スプラッシュウィンドウ」を出したいだけならモードレスダイアログを
出せばいいと思うよ。次のリンクを参考にして下さい。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200510/05100001.txt
お返事遅くなりましてすいません。
wclrpさん>
SelectObjectで最初書いていたのですが、描画すらできなく
なってしまっていたので一時的に消していました。
きっと書き方が間違っていたんでしょうね。
PATIOさん>
ウィンドウへの描画は難なくできているのですが、
デスクトップへの描画に切り替える時点でなにか
根本的なミスをおかしているのかも知れませんが
それに気づけていません。
オレンジフィッシュさん>
スプラッシュウィンドウ参考にさせて頂きます。
目的はスプラッシュウィンドウに限りなく近い
のですが、デスクトップそのものにBMPを描画
しておいて、アプリケーションのウィンドウが起動
された後でも消したくないのです。
⇒ずっとデスクトップに描画されたままにしたいです。
なので、スプラッシュウィンドウとは扱うデバイス
コンテキストが違うと思ってるのですが、間違って
ますでしょうか??
悩ましいですがもう少し頑張って調べてみます。
もし、最初に書いているソースに全く間違いが無いなら
やはり、根本的に勘違いがあると思います。
通常は、転送するビットマップを一旦DC上に展開する為に
転送先のDCとは別に転送先のDCとコンパチブルなメモリDCを作成し、
ビットマップはそちらのDCに選択するのが普通です。
wclrpさんが書かれている「hDC->hDC!?」と言うのはそういう事です。
他の部分のコードがその流れに沿った物になっている事からすると
やはり勘違いされているのではないかと思います。
だから、「猫でもわかる・・・」を紹介したのですけれど。
上記のやり方はもっとも基本的な方法になりますので
もし勘違いしているようであれば、再度確認してみてください。