ネット検索で頑張ってみましたが行き詰ってしまいました。
知恵を貸していただけると助かります。
VC++ 2013 共通言語ランタイムサポートを使用しない。スタティックMFCを使用する
な環境で開発をしています。
やりたいことは、C#で作成した文字列BITMAPをVC++(DLL)で受け取り、キャンパスとなる
HDCに座標を指定して載せてその結果をC#に返し、C#では受け取った情報を表示
(picturebox)する。です。
pictureboxへの表示を考えるとVC++のDLLの関数では、HDC型ではなくHBITMAP型を返せた
ら良いと考えました。(C#内でHDC→HBITMAP→BITMAP→picturebox表示も考えています)
描画系の関数に関してまだ理解ができていない為、ごちゃごちゃしたコードで申し訳あり
ませんが、無駄なコードや必要なコードがありましたら、ご指摘戴けますようお願いします。
/*
【引数】
hmap1:HBITMAP(文字列のBITMAP画像データ)
hmap:参照渡しのHBITMAP
【戻り値】:HBITMAP
※DLLです。AP側はC#です。
*/
EXPORT HBITMAP RetHbitmap(HBITMAP hmap1, HBITMAP hmap)
{
static HBITMAP hmap2;
static HDC hdcmap, hdcmap1;
static BITMAP bmap, bmap1;
hdcmap = CreateCompatibleDC(NULL);//メモリコンテキストの作成
hdcmap1 = CreateCompatibleDC(NULL);
hmap2 = (HBITMAP)LoadImage(ins, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0,
0, LR_DEFAULTCOLOR);//リソースからビットマップをロード
//インスタンスが無い場合のHBITMAPの生成方法はあるのでしょうか?
GetObject(hmap, sizeof(BITMAP), &bmap);
GetObject(hmap1, sizeof(BITMAP), &bmap1);
SelectObject(hdcmap1, hmap1);
hmap = CreateCompatibleBitmap(hdcmap1, 300, 300);
PatBlt(hdcmap, 0, 0, 300, 300, WHITENESS); // 白で塗りつぶす
BitBlt(hdcmap, 0, 0, 250, 250, hdcmap1, 0, 0, SRCCOPY);//本番ではTransparentBlt
にする
SelectObject(hdcmap, hmap);//参照渡しへのHBITMAP情報セット?
SaveDDB(hdcmap, 300, 300, 5);//加工したHDCをBMPファイルに保存
//↑これは期待通りに保存できます。
//この加工が済んだhdcmapをHBITMAPにして返したいのです。
HDC hdcT = CreateCompatibleDC(hdcO);//メモリコンテキストの作成
GetObject(hdcT, sizeof(BITMAP), &bmapT);
HBITMAP hbitmapT = CreateCompatibleBitmap(hdcmap, 300, 300);
SelectObject(hdcT, hbitmapT);
SaveDDB(hdcT, 300, 300, 8);//BMPファイルに保存→真っ黒 C#での描画でも真っ黒
DeleteDC(hdcmap);
DeleteDC(hdcmap1);
DeleteDC(hdcT );
DeleteObject(hmap2 );
//DeleteObject(hbitmapT );
return hbitmapT;
}
その後もいろいろネット検索をして、解決しました。
HBITMAP testhbitmap = (HBITMAP)GetCurrentObject(hdcmap, OBJ_BITMAP);
BITMAP testbitmap;
GetObject(testhbitmap, sizeof(BITMAP), &testbitmap);
return testhbitmap;
詳しく見ていませんが、
1.hdcT に対して、何も書いてないようなので、当然真っ黒なはずです。
試しに、hdcT に対して白い四角でも書いてみてはどうでしょう。
そうすると何をすべきかわかるかもしれません。
コンパチブルBmpとコンパチブルHDCは必ずペアになるので、
クラス化(BMPを選択済みのHDCクラス等)すると間違いを避けられるかも
しれません。
SelectObjectが非常に不足している気がしていますが……。
PatBltするときにhdcmapにHBITMAPをSelectObjectしていないので,
この時点でのhdcmapは1x1のモノクロピクセルがあるだけのビットマップが選択されているはず
です。
https://msdn.microsoft.com/en-us/library/dd183489(v=vs.85).aspx
描画先のHBITMAPをちゃんと選択しておいて,描画が終わったら元のHBITMAPを選択する,という
処理が必要です。
というか,内容的にはC#だけで十分処理ができそうですが……。
PatBlt => System.Drawing.Graphics.FillRectangle
BitBlt => System.Drawing.Graphics.DrawImage
保存 => System.Drawing.Image.Save