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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンテキスト依存とは?
-
ダブルバッファの作り方
-
VC++のTextOutの再描画の仕方
-
GetDC()とCreateCompatibleDC()
-
BeginPaintの使い方
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コントロールの書式設定で、“コ...
-
VBAのフォント変更(エクセルか...
-
vbaから他のアプリを終了
-
コンボボックス内の文字サイズ変更
-
ExcelのBOOKが消えた!
-
エクセルのコントロールツール...
-
ドロップダウンリストのフォン...
-
検索の画面がでなくなってしま...
-
ラジオボタンの初期指定
-
メッセージボックスを大きくす...
-
DateTimePickerでに年月までし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
Win32APIにて、アイコンの情報...
-
画面がチカチカする
-
PlgBltでの透過
-
GetDC()とCreateCompatibleDC()
-
VBでFD、USBの有効・無効...
-
VC++でBitmapとText文字を表示...
-
メモリデバイスコンテキスト&...
-
画像処理 ビットマップ ダブ...
-
コントロール内の文字の背景色
-
BitBlt関数について教えてください
-
Rectangleで、リソースが解放さ...
-
Windowsプログラミング 画面描...
-
ビットマップ(表示速度とサイズ)
-
画面のちらつきについて
-
メモリデバイスコンテキストを...
-
TextOutについて
-
SetWindowRgn()関数について。
-
領域を塗りつぶしたい
-
ダブルバッファの作り方
おすすめ情報