デバイスコンテキストから、描画領域の縦横サイズを取得する方法 – プログラミング – Home

デバイスコンテキストから、描画領域の縦...
 
通知
すべてクリア

[解決済] デバイスコンテキストから、描画領域の縦横サイズを取得する方法


ぱんぷきん
 ぱんぷきん
(@ぱんぷきん)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

久方ぶりに質問いたします。ぱんぷきんと申します。

デバイスコンテキストハンドラとファイル名を指定することで、デバイスコンテキスト
にある描画情報を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が返ってくるのみで失敗
しています。

回避策としては、ビットマップ作成時の情報から画像サイズを渡すということも考えて
はいますが、できることなら、デバイスコンテキストからサイズ情報を取得したいと考
えています。

デバイスコンテキストから描画領域のサイズ情報を取得する方法について、ご存知のか
たがいらっしゃいましたら、ご教授いたただきますよう、よろしくお願いいたします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

GetDeviceCapsで取得できそうです。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

HDCからHBITMAPを取得
→GetCurrentObject
HBITMAPからBITMAPを取得
→GetObject

で,得られた
BITMAP::bmWidthとBITMAP::bmHeight
が現在HDCに選択されているビットマップの幅と高さになります。


返信引用
ぱんぷきん
 ぱんぷきん
(@ぱんぷきん)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

投稿者のぱんぷきんです。

ご教授いただき、ありがとうございます。

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;

ありがとうございます。


返信引用
ぱんぷきん
 ぱんぷきん
(@ぱんぷきん)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

質問者佐藤です。

先ほどの投稿について、一部誤りがありましたので、訂正いたします。

(誤)
int iWidth = ::GetDeviceCaps( hDC , HORZSIZE );
int iHeight = ::GetDeviceCaps( hDC , VERTSIZE );

(正)
int iWidth = ::GetDeviceCaps( hDC , HORZRES );
int iHeight = ::GetDeviceCaps( hDC , VERTRES );

ご迷惑をおかけし、もうしわけありません。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> しかし、この場合、デスクトップのサイズが取得されてしまいました。

確かにそうなりますね。

メモリデバイスコンテキストには使えないようですね。
失礼しました。


返信引用
ぱんぷきん
 ぱんぷきん
(@ぱんぷきん)
ゲスト
結合: 23年前
投稿: 11
Topic starter  

いえ、こちらこそ、ありがとごうざいました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました