いつもお世話になります。

MFCベースでCreateDIBSectionの使い方を教えていただけないでしょうか?

ビットマップ画像を回転させようとしているのですが、
MFCベースで作りこんでいるため、ウィンドウハンドルの
扱い方などがよくわかりません。

MFCベースだと再度HWNDとして取得する必要があるのでしょうか?
それかキャストしないといけないのでしょうか?

どなたかご教示おねがいいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

CreateDIBSectionの第一パラメータはウィンドウのパレットを使用する場合


以外は無視できます(0を指定する)

デバイスコンテキストを使う場合はGetDC関数を使用して取得します。
    • good
    • 0

CreateDIBSectionはウィンドウハンドル必要内と思うのですが、



ウィンドウハンドルが必要だというなら、
CWndのm_hWndの中に入っています。
    • good
    • 0

ウィンドウハンドルを取得するだけならば、対象ウィンドウのクラス(CWndから派生したもの)の


m_hWndメンバがそのまま使用できます。

というか、CreateDIBSectionでウィンドウハンドルって必要でしたっけ?

参考URL:http://www.microsoft.com/JAPAN/developer/library …

この回答への補足

CreateDIBSectionはデバイスコンテキストハンドルを第一引数に必要だと思うのですが、MFCベースですのでHWND型のhDCを取得する方法がわからなかったのです。
まわりくどい質問の仕方で申し訳ありません。

補足日時:2001/06/17 14:29
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qビットマップハンドルからビットマップボタンを作りたいです

MFC初心者です。どうかよろしくお願いいたします。
環境はVC++6.0 MFC ダイアログベースです。

HBITMAP hBitmap;

hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), (LPCTSTR)sSaveFile,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE);

を使ってビットマップハンドルを取得しました。

ここからボタンに貼り付ける方法がわかりません。
リソースにボタンを作った後、どのようにすれば良いでしょうか?

あと、ボタンの好きな位置にビットマップを貼り付ける方法も教えていただけると幸いです。

Aベストアンサー

あら惜しいとこまで……。

クラスウィザードでボタンのメンバ変数を追加しましょう。タイプはCButtonで。

ほいで OnInitDialog あたりで CButton::SetBitmap メソッドなんかを呼び出すのが手っ取り早い方法です。
(ボタンにはBS_BITMAPスタイルを忘れずに)

あと、表示を細かく調整したいならオーナードローになるかと。

Qメモリデバイスコンテキスト&ビットマップハンドル

static VOID _SetSize(pLayer object, LONG w, LONG h)
{
LayerEx * obj;

obj = (LayerEx *)object;
obj->size.x = w;
obj->size.y = h;

if(obj->hBitmap){
HDC hdc , hNewDC;
HBITMAP hNewBitmap;

hdc = object->GetDC(object);

hNewDC = CreateCompatibleDC(hdc);
hNewBitmap = CreateCompatibleBitmap(hdc , w , h);
SelectObject(hNewDC , hNewBitmap);
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
DeleteObject(hNewDC);

object->DeleteDC(object , hdc);

DeleteObject(obj->hBitmap);
obj->hBitmap = hNewBitmap;
}

一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、

BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
↑なぜBitBltで転送しているのかわかりません。
新しく生成したビットマップをSelectObjectで登録したらいいような感じがするんですが・・・

DeleteObject(hNewDC);
↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。

分かる人いたら教えてください。説明足りなかったらごめんなさい^^;


↓一応object->GetDC(object)のソースです。
static HDC _GetDC(pLayer layer)
{
LayerEx * obj;
HDC hResult;

obj = (LayerEx *)layer;

if(obj->hBitmap == NULL){
HDC hdc;

hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
obj->hBitmap = CreateCompatibleBitmap(hdc, obj->size.x, obj->size.y);
hResult = CreateCompatibleDC(hdc);
SelectObject(hResult, obj->hBitmap);
DeleteDC(hdc);
}
else{
hResult = CreateCompatibleDC(NULL);
SelectObject(hResult, obj->hBitmap);
}

return hResult;
}

static VOID _SetSize(pLayer object, LONG w, LONG h)
{
LayerEx * obj;

obj = (LayerEx *)object;
obj->size.x = w;
obj->size.y = h;

if(obj->hBitmap){
HDC hdc , hNewDC;
HBITMAP hNewBitmap;

hdc = object->GetDC(object);

hNewDC = CreateCompatibleDC(hdc);
hNewBitmap = CreateCompatibleBitmap(hdc , w , h);
SelectObject(hNewDC , hNewBitmap);
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
DeleteObject(hNewDC);

object->DeleteDC(object , hdc);

DeleteO...続きを読む

Aベストアンサー

★アドバイス
>BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
>↑なぜBitBltで転送しているのかわかりません。
 最初にCreateCompatibleDC、CreateCompatibleBitmap、SelectObjectの3つで
 objectのデバイスコンテキストと互換のあるメモリ・デバイスコンテキストを
 作成しています。
 このメモリ・デバイスコンテキストにobjectのイメージ画像をBitBltを使って
 コピー(転送)しています。つまり、新しく作られたメモリ・デバイスコンテキストは
 真っ黒なのでobjectのイメージ画像でコピーしたわけ。
>DeleteObject(hNewDC);
>↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。
 間違い⇒『DeleteObject(hNewDC);』
 正しい⇒『DeleteDC(hNewDC);』
 これはsizumさんの考えであっていると思います。
 hNewDCはGDIオブジェクトではなくメモリ・デバイスコンテキストなので。
・object->GetDC(object)関数について
 この関数はobj->hBitmapがNULLなら画面(ディスプレイ全体)と互換のある
 メモリ・デバイスコンテキストを作成します。
 そしてobj->hBitmapがNULL以外の時はメモリ・デバイスコンテキストだけを
 複製してobj->hBitmapをSelectObjectで割り付けています。
 ※何にどう使うか分かりませんが、object->GetDC()関数を複数回呼び出すと
 ※obj->hBitmapのハンドルを共有するようになるようです。切り替えるためかも。
・結局_SetSize関数は
>一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、
 ↑
 この通りの動作を行っているようです。
 もう少し正確に(私の推測で)表現すると一度生成したメモリ上にある
 ビットマップを新たなサイズで生成しなおしているようです。多分。
 ※object->DeleteDC()の内容もあればもう少し正確に分かるかも正ないですね。

★アドバイス
>BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
>↑なぜBitBltで転送しているのかわかりません。
 最初にCreateCompatibleDC、CreateCompatibleBitmap、SelectObjectの3つで
 objectのデバイスコンテキストと互換のあるメモリ・デバイスコンテキストを
 作成しています。
 このメモリ・デバイスコンテキストにobjectのイメージ画像をBitBltを使って
 コピー(転送)しています。つまり、新しく作られたメモリ・デバイスコンテキストは
 真っ黒なのでobjectのイメージ画像で...続きを読む

Qビットマップを表示させる(MFC)

CDC::SelectObject を使用して、
ビットマップをメモリDCに割り当てたあと、
CDC::BitBltで画面に表示しています。

すでに、画面に表示されているビットマップを残したまま、
2枚目のビットマップを表示したいのですが、
2枚目を表示すると同時に1枚目のビットマップが消えてしまいます。
(当然ですが。。。)

1枚目(すでに表示させているビットマップ)を残し、
2枚目のビットマップを同じ画面に表示するには、
どうすればよいでしょうか?

Aベストアンサー

あります。

最終的に表示したい大きさのビットマップをメモリDCに割り当てて、そのメモリDCに対して10回のBitBltを行います。そうして完成したビットマップを、今度は1回のBitBltで画面に表示します。

この方法であれば、WM_PAINTで再描画するビットマップはこの「最後に画面にBitBltするビットマップ」になるので、再描画処理も少し楽になります。

ちなみに、表示したいビットマップの一部が重なっているときには、素直に全部画面にBitBltすると重なっている部分がちらついてしまうので、1枚にまとめてからBitBltするのは必須のテクニックになります。

QMFC ビットマップ描画で残像が残る

MFCです。

ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。
ダブルバッファリングで実現しているのですが、画面リサイズを繰り返すと、再描画の後に、拡大して発生した新しいクライアント領域に古い画像が残ってしまいます。
SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかったのですが、これが原因なんでしょうか?

Aベストアンサー

>SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかった

これが100%確実に原因であるとは断言できませんが、
可能性としてはあり得るでしょう。

「リソース・リーク」になり、ビットマップが正常に描画できなくなるのでは?
と思います。

QGetStockObjectで取得したGDIオブジェクトハンドルをブラシハンドルにキャストする理由

WINDOWS APIについて質問です。

ウィンドウクラスを登録する際、
winc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
という表現をよく使います。
関数GetStockObject()はHGDIOBJを返します。
HGDIOBJもHBRUSHも実体はvoid*です。
なぜわざわざキャストするのでしょうか。

Aベストアンサー

>HGDIOBJもHBRUSHも実体はvoid*です。
その通りで同値です。
しかしあえてそうすることで「ブラシタイプ」
をソース上、明確にできます。
これは「ソースコードのリーダビリティ」と言う考え方です。
例えば、APIの「GetModuleFileNameEx」などの
「HMODULE」箇所は、他関数の「HINSTANCE」タイプの戻り値を
利用できます。
これは同じハンドルポインタ型だからですし、
設計上、意図されているからです。


人気Q&Aランキング

おすすめ情報