VC6.0でMFCアプリケーションを作成しています。
・ダイアログベース
・背景はビットマップ(スタイルにWS_CLIPCHILDRENを追加)
・ボタンはビットマップ&非矩形(丸)
これを作成し、実行するとCPU使用率が100%になってしまいます。
OnPaint()での描画をしなければ、ボタンが丸く表示されません。
ご存知の方は教えてください。
以下、ソース抜粋です。
メンバ
CButton m_cbImage;
CBitmap m_cBmpBack;
CBitmap m_cBmpButton;
HBITMAP m_hBmpBack;
BITMAP m_bmp;
HDC m_hDc;
OnInitDialog(){
//背景ビットマップ
m_cBmpBack.LoadBitmap(IDB_BITMAP_BACK);
//ボタンビットマップ
m_cBmpButton.LoadBitmap(IDB_BITMAP_BUTTON);
HBITMAP hBmpButton = HBITMAP(m_cBmpButton);
m_cbImage.SetBitmap(hBmpButton);
// ウィンドウに関する情報を取得
// BMPサイズ取得
m_hBmpBack = HBITMAP(m_cBmpBack);
GetObject(m_hBmpBack, sizeof(BITMAP), &m_bmp);
// BMPデバイスコンテキスト作成
m_hDc = CreateCompatibleDC(NULL);
// オブジェクトを選択する
SelectObject(m_hDc, m_hBmpBack);
// ボタン変形
CRect cRectButton;
m_cbImage.GetClientRect(cRectButton);
CRgn rgnButton;
rgnButton.CreateEllipticRgn(cRectButton.Width() * 1 / 8, cRectButton.Height() * 1 / 8, cRectButton.Width() * 7 / 8, cRectButton.Height() * 7 / 8);
m_cbImage.SetWindowRgn((HRGN)rgnButton, TRUE);
}
OnPaint(){
HDC hdc = ::GetDC(m_hWnd);
BitBlt(hdc, 0, 0, (int)m_bmp.bmWidth, (int)m_bmp.bmHeight, m_hDc, 0, 0, SRCCOPY);
::ReleaseDC(m_hWnd, hdc);
}
以上、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
MFCについては、あまり詳しくないので分かりませんが、
SDKの場合、GetDCを行うとWM_PAINTメッセージが発生する
らしいので(ちょっと記憶があいまいですが)、WM_PAINTメ
ッセージ内でGetDCを行うとある意味無限ループみたいな形
になってしまうので、その関係でCPU使用率があがっている
のではないかと思います。
参考までに、SDKではWM_PAINTメッセージが来たときは
BeginPaint関数、EndPaint関数でデバイスコンテキストの
ハンドルを取得します。
ありがとうございます。
描画あたりの理解が低いもので、そのような仕組みになっていたんですね。
ちなみに、丸いボタンのサンプルプログラムがあり、
それを使ってみようと思います。
見ただけではとても理解できるものではありませんでしたが。
No.4
- 回答日時:
> OnPaint()でなぜ生のHDCを取得?
このようにしないと表示がされなかったのです。
うーん、そんなばかな・・・
CWnd::GetDC()で問題ないはずです。
MFC内では、生のHDCを使う必要はよっぽどのことがないとありません。HBITMAPなどのハンドルを使うのもです。
CreateCompatibleDC()、SelectObject()、BitBlt()に関しても、CWndやCDCのメンバ関数を使ってください。
いきなりボタンを丸くするのではなく、まず正しくMFCのソースを書くところからはじめたほうがいいと思います。
あと、エラーチェックを適時入れ、関数の成否をチェックしたほうがいいですよ。
どこまで処理がうまく行っているのかもわかりますし。
非矩形ウィンドウを作成するのはそれからで遅くありません。
No.2
- 回答日時:
>OnPaint()でなぜ生のHDCを取得?
>
>疑問2
>BitBlt()でダイアログ全体に転送しているのはボタンのビットマップでは?
>
>疑問3
すみません。この部分は無視してください。
No.1
- 回答日時:
CRgnって、メンバ変数にしておかなくても平気でしたっけ?
ヘルプより
SetWindowRgn 関数が成功すると、システムは、パラメータ hRgn で指定したリージョンを所有します。システムは、このリージョンのコピーを作成しません。したがって、これ以降はこのリージョンハンドルに対して関数を呼び出すべきではありません。特に、このリージョンハンドルを削除しないでください。必要がなくなると、システムはこのリージョンハンドルを自動的に削除します。
あと、なぜ生のHBITMAPやHDCを使用しているのですか?
OnPaint()でなぜ生のHDCを取得?
疑問2
BitBlt()でダイアログ全体に転送しているのはボタンのビットマップでは?
疑問3
参考URL:http://www.microsoft.com/JAPAN/developer/library …
ありがとうございます。
> OnPaint()でなぜ生のHDCを取得?
このようにしないと表示がされなかったのです。
リージョンについてはご指摘の通りですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面がチカチカする
-
画像処理 ビットマップ ダブ...
-
マインクラフト(pc版)で座標...
-
Minecraft 統合版(PC)の描画距...
-
グラフの交点の求め方(Excel)
-
エクセルで作った新しいウイン...
-
作成したウインドウのサイズを...
-
コントロールの書式設定で、“コ...
-
ブレゼンハムのアルゴリズムに...
-
コンボボックス内の文字サイズ変更
-
「アイテムは収集されました」...
-
フォントの大きさ
-
勝手にウィンドウが開いて止ま...
-
描画を透明にする方法
-
Form1 Load で実行されない。
-
エディットコントロールの色の...
-
ExcelやAccessで社内の端末の配...
-
ウィンドウのサイズ変更について
-
カーソルが自分のウィンドウか...
-
ゲームでは結局どっちが良いの?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画面がチカチカする
-
VC++のTextOutの再描画の仕方
-
コントロール内の文字の背景色
-
ビットマップ(表示速度とサイズ)
-
VBでFD、USBの有効・無効...
-
Rectangleで、リソースが解放さ...
-
WinAPIでスクリーン画像を映し...
-
メモリデバイスコンテキストを...
-
クライアント領域をCBitmapに取...
-
ダブルバッファの作り方
-
VC++でopenGLを利用したい...。
-
C 多角形を半透明に塗る方法
-
Win32APIにて、アイコンの情報...
-
ExtTextOut
-
TextOutについて
-
ハードコピーをプログラムから...
-
Windowsプログラミング 画面描...
-
BeginPaintの使い方
-
デバイスコンテキストの宣言に...
おすすめ情報