久方ぶりに質問いたします。ぱんぷきんと申します。
デバイスコンテキストハンドラとファイル名を指定することで、デバイスコンテキスト
にある描画情報をBMPファイルに書き込む処理を考えています。
あるプログラムを参考に、ウィンドウハンドラとファイル名を指定することでBMPファイ
ルに書き出すプログラムを作成し、そちらはうまく動作しました。
bool SaveDIB( HWND hWnd , LPCTSTR lpszFilename )
{
RECT rc;
GetClientRect(hWnd, &rc);
hDC = GetDC(hWnd);
.....
目的としては、DIBなど、オフスクリーン的なデバイスコンテキストの情報もBMPに出力
しようと考えています(デバイスコンテキストハンドラには、512x512のDIBビットマッ
プを割り当てています)。
サンプルプログラムでは、ウィンドウから、GetDCでデバイスコンテキストを、
GetClientRectでウィンドウの縦横サイズを取得していたので、その部分を書き換えよう
と考えました。
デバイスコンテキストはウィンドウからとるのではなく、外部から受け取る形にしまし
た。
bool SaveDIB( HDC hDC , LPCTSTR lpszFilename )
{
// サイズの取得方法がわからず
.....
あとは、縦横サイズをデバイスコンテキストから取得すれば、、と考えていたのです
が、デバイスコンテキストから縦横サイズを取得する関数がうまく見つかりませんでし
た。
GetWindowExtEx関数でとれるかとも考えましたが、サイズが1,1が返ってくるのみで失敗
しています。
回避策としては、ビットマップ作成時の情報から画像サイズを渡すということも考えて
はいますが、できることなら、デバイスコンテキストからサイズ情報を取得したいと考
えています。
デバイスコンテキストから描画領域のサイズ情報を取得する方法について、ご存知のか
たがいらっしゃいましたら、ご教授いたただきますよう、よろしくお願いいたします。
GetDeviceCapsで取得できそうです。
HDCからHBITMAPを取得
→GetCurrentObject
HBITMAPからBITMAPを取得
→GetObject
で,得られた
BITMAP::bmWidthとBITMAP::bmHeight
が現在HDCに選択されているビットマップの幅と高さになります。
投稿者のぱんぷきんです。
ご教授いただき、ありがとうございます。
dairygoodsさんのおっしゃられる方式を以下のように実装してみました。
int iWidth = ::GetDeviceCaps( hDC , HORZSIZE );
int iHeight = ::GetDeviceCaps( hDC , VERTSIZE );
しかし、この場合、デスクトップのサイズが取得されてしまいました。
MSDNを見てみましたが、他によさそうな記号定数がなかったのですが、、違う値を指定
しなければならないのでしょうか?(便乗質問的になってしまいもうしわけありませ
ん)。
YuOさんのおっしゃられる方式を以下のように実装し、無事BITMAPに出力できました。
HBITMAP hBitmap;
BITMAP bitmap;
//HDCからHBITMAPを取得
hBitmap = (HBITMAP)::GetCurrentObject( hDC , OBJ_BITMAP );
//HBITMAPからBITMAPを取得
::GetObject( hBitmap , sizeof( BITMAP ) , &bitmap );
int iWidth = bitmap.bmWidth;
int iHeight = bitmap.bmHeight;
ありがとうございます。
質問者佐藤です。
先ほどの投稿について、一部誤りがありましたので、訂正いたします。
(誤)
int iWidth = ::GetDeviceCaps( hDC , HORZSIZE );
int iHeight = ::GetDeviceCaps( hDC , VERTSIZE );
(正)
int iWidth = ::GetDeviceCaps( hDC , HORZRES );
int iHeight = ::GetDeviceCaps( hDC , VERTRES );
ご迷惑をおかけし、もうしわけありません。
> しかし、この場合、デスクトップのサイズが取得されてしまいました。
確かにそうなりますね。
メモリデバイスコンテキストには使えないようですね。
失礼しました。
いえ、こちらこそ、ありがとごうざいました。