WindowsAPIでの画像表示について

このQ&Aのポイント
  • WindowsAPIを使用して画像を表示する方法についての質問です。
  • 現在、Windowsプログラミングで画像を表示するコードを書いていますが、一部が正しく動作しません。
  • 赤い四角形が画像の大きさの範囲内でしか表示されない問題について質問しています。
回答を見る
  • ベストアンサー

WindowsAPIでの画像表示について

コード(一部): http://fatalita.sakura.ne.jp/goo/img/APIcode.jpg 本当はこうしたかった実行結果: http://fatalita.sakura.ne.jp/goo/img/Run2.jpg 実際の実行結果: http://fatalita.sakura.ne.jp/goo/img/Run.jpg 現在Windowsプログラミングでウィンドウプロシージャの WM_CREATE 内で仮想画面にtest.bmpを読み込み、 さらにその後に仮想画面に大きな赤い四角形を描画させて WM_PAINT で裏画面をウィンドウに描画させているのですが、 何故かこのコードを実行すると画像ファイル test.bmpの大きさの範囲内でしか赤い四角形が描画されません。 これは何が悪いのでしょうか・・? 開発環境はWinXP / VisualStudio 2005です。 後、WND_SIZE_XとWND_SIZE_Yはそれぞれウィンドウのサイズを表しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

CreateCompatibleDCで作成した hdcMemをつかって CreateCompatibleBitmapをつかって仮想画面用のビットマップを作成し ココへ LoadImageなどで読み込んだ画像をBitBltなどで転送します 転送用のdcが別途必要です // 転送用のdc hdcMem = CreateCompatibleDC(NULL); // ビットマップ転送用dc hdcTmp = CreateCompatibleDC(NULL); hBmpTemp = LoadImage( NULL, _T("test.bmp"), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE ); // 画像を一時的に選択 ... 選択されていたBitmapハンドルを保存 hBmpOldTmp = SelectObject( hdcTmp, hBmpTmp ); // 仮想画面用の Bitmapを準備 hBmp = CreateCompatibleBitmap hdcTmp, WND_SIZEX, WND_SIZE_Y ); // dcに選択 hBmpOld = SelectObject( hdcMem, hBmp ); //  Bitmapの大きさを取得 GetObject( hBmpTmp, sizeof(BITMAP), &bmp); // 一時dcから 仮想画面に転送 BitBlt( hdcMem, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcTnmp, 0, 0, SRCCOPY); // 一時dcの選択を元に戻す SelectObject( hdcTmp, hBmpOldTmp); // 一時dcなどを削除 DeleteDC( hdcTmp ); DeleteObject(hBmpTmp); この後Rectangleなどで hdcMemに描画してください AdjustWindowRectExは CreateWindowなどでウィンドウなどを作成する際に クライアントエリアやウィンドウのスタイル、メニューの有無によって CreateWindowのサイズをどう決めればいいかをシステムに問い合わせする関数です クライアントのサイズは GetClientRectで取得すればいいですよ

amazontester
質問者

お礼

うまくいきました。ありがとうございます。

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

CreateCompatibleDCは1x1のモノクロの画面を作ります。 SelectObjectでロードしたビットマップを仮想画面に割り当てると、仮想画面は1x1からビットマップのサイズに拡張されます。 なので、プログラムは「作成者の意図とは違うが、書いた通りに」動いています。 >これは何が悪いのでしょうか・・? 「仮想画面をウィンドゥのクライアント領域と同じサイズまで拡張しないといけないが、それをしてない」のが「悪い」のです。

amazontester
質問者

お礼

やはりそうでしたか。 仮想画面をウィンドゥのクライアント領域と同じサイズまで拡張する・・ というのがいまいち良く分かりません。 GetClientRect関数でサイズが測れるというのまでは知っていたのですが、 サイズの変更の仕方が良く分かりません。 AdjustWindowRectExを使えばいいのでしょうか?

関連するQ&A

  • 画像表示について。

    現在SDKにてBMPやRAWなどの画像表示ソフトを作成している段階です。 そして、一通り作成することができました。 ここで質問に答えてくださった皆様に感謝します。 新たに些細な問題が出てきてしまったので質問します。 作成したソフトはMDI型のソフトであり、その構成はフレーム、クライアント、ドキュメントウィンドウといった構成になっています。 もちろん読み込んだ画像はドキュメントウィンドウに表示をするのですが、このドキュメントウィンドウのサイズをマウスを使って変更した場合、画像にちらつきが生じてしまいます。 原因はプログラム上 WM_PAINT メッセージがきた場合に描画をおこなうことに他ならないのですが、解決する手段はないでしょうか? 例えばダブルバッファリングなどの手段があればよいのですが・・・

  • IBM PC-DOS でBMPやJPGの画像表示の方法

    最近DOS/Vに変えたのですが BasicのDEFSEGでBMPやJPGの画像表示を取り込みたいのですがBMPやJPGを画面上に表示させる方法をご存じの方お願いします。【Windowsではありません】

  • 携帯で画像が表示されない

    こんにちは。 HTMLで、『<img src="画像のパス">』を入力して画像を表示させたいのですが、 PCから見るとちゃんと表示できているのに携帯から見ると「×」になってしまい表示できません。 ペイントで作成した画像なのですが、 拡張子「jpg」「bmp」「tif」「gif」どれも試してみたのですが駄目でした。 ファイルのサイズも大きくても小さくても表示できませんでした。 携帯au、docomo、softbankどれも表示されませんでした。 対処法はありますでしょうか。よろしくお願いします。

    • ベストアンサー
    • HTML
  • 画像の貼り付け、サイズを小さくする良い方法は?

    パソコンの画面をエクセルに貼り付け、ソフトの手順書、マニュアルを作ってます。 bmpファイルをクリップボードから貼り付けて、エクセル上で40%に縮小してます。 画像を多く使う為、重くなってしまい、印刷にもかなりの時間がかかります。 bmpよりもjpgの方がサイズが小さいということで、同じ1枚の画像をbmpとjpgで保存し、いろいろと試してみた結果です。 元の画像 bmp 2305KB jpg 41KB クリップボードから貼り付け bmp 51KB jpg 408KB 形式を選択して貼り付け(メタファイル) bmp 51KB jpg 408KB 挿入-ファイルから bmp 52KB jpg 54KB 挿入で貼り付けつけると、画像がぼやけてしまいました。他はほとんど変わりません。 jpgの方がサイズが小さいはずなのに、貼り付けるとなぜか、bmpの方が小さくなりました。 フォトショップなどを使わずに、画質を落とさず、もう少しサイズをおとせる方法はないでしょうか? よろしくお願いします。

  • WinAPIでの画像高速切り替え表示プログラム1

    WinAPIを使用して、ビットマップ画像を8枚読み込み、それを連続高速表示するプログラムを作成しています。 今はSetTimerを使ってWM_TIMERを受け取ったときに画像をInvalidateRect(再描画)しています。 以下のソースで動作はするのですが、WM_TIMERは整数ミリ秒でしか設定できず、精度も悪く優先順位も遅いようなので他の方法を考えています。 画像8枚を6.25msecで切り替えて表示するというのをESCAPEするまで繰り返したいのですが...。 リフレッシュレートは160Hzにあげています。 QueryPerformanceFrequencyというものを使えばいいのかなと思っていますが、どこでどう使えばいいのか、それをどう受け取って再描画すればいいのかわかりません。 どなたかご教授お願いします。ソースファイルを書いていただけたら嬉しいです。 #include<windows.h> #define BMP_SUM8//画像の総数 #define TIMER_ID (100) // 作成するタイマの識別ID #define TIMER_ELAPSE (6) // WM_TIMERの発生間隔 LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; HBITMAP hBitmap; int i; const char *filename[BMP_SUM]={"gazou0.bmp", "gazou1.bmp", "gazou2.bmp", "gazou3.bmp", "gazou4.bmp", "gazou5.bmp", "gazou6.bmp", "gazou7.bmp"}; static HDC hMemDC[BMP_SUM]; static BITMAP bmp; static int bmp_index;//現在の画像番号 LONG lResult; switch(uMsg) { case WM_CREATE: hdc=GetDC(hWnd); for(i=0;i<BMP_SUM;i++){ hBitmap=(HBITMAP)LoadImage(0,filename[i],IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hMemDC[i]=CreateCompatibleDC(hdc); SelectObject(hMemDC[i],hBitmap); } GetObject(hBitmap,sizeof(BITMAP),&bmp); DeleteObject(hBitmap); ReleaseDC(hWnd,hdc); return 0; case WM_TIMER: if( wParam != TIMER_ID ) { break; // 識別IDが一致しないタイマメッセージはDefWindowProc()に任せる } if(++bmp_index >= BMP_SUM) bmp_index=0; for(i = 0; i < BMP_SUM; i++){ InvalidateRect( hWnd, NULL, FALSE ); } return 0; case WM_DESTROY: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC[bmp_index],0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; case WM_KEYDOWN: switch((CHAR)wParam) { case VK_ESCAPE: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); //WM_QUITメッセージを出す return 0; } } return DefWindowProc(hWnd,uMsg,wParam,lParam); } 入りきらないので2つに分けます。 続きは「WinAPIでの画像高速切り替え表示プログラム2」を見てください。

  • 【Java】画像表示が出来ない!

    Java初心者です。 Eclipseを使って、Javaアプレットでjpeg画像を表示させようとしたのですが、上手くいきません。表示したい画像をインポートして、このようなコードを書きました。 import java.applet.Applet; import java.awt.*; /* <applet code="クラス名.class" width="497" height="600"> <param name="img" value="img/test.jpg"> </applet>*/ public class クラス名 extends Applet { Image img; public void init() { img = getImage(getDocumentBase() , getParameter("/test.jpg")); } public void paint(Graphics g) { g.drawImage(img , 0 , 0 , this); } } Javaアプレットで実行しても、アプレットは真っ白なままです。GIF画像でも試してみましたが、同じく失敗でした。他のJavaアプレットのプログラム(図形を表示したり)は成功したので、私のパソコンのJavaは問題ないと思います。回答よろしくお願いします。

    • ベストアンサー
    • Java
  • テーブル内に画像を表示したい。

    テーブル内に画像を1枚表示したいです。 下記のようにIMGタグを用いると、画像が表示されますが、 横幅が100%の時の大きさで枠が表示 されます。横に余白があります。 この余白を無くして、テーブルの枠線が画像をピッタリ 囲む様にしたいです。 どなたか、ご教授願います。初心者なので詳しくお願い します。 ---------------------------------------------- <table border=1>  <tr>    <td > <img src='./test_size/image2.jpg' width='50%' >    </td>  </tr> </table>

    • ベストアンサー
    • HTML
  • MFC XPでのTextOutのボヤケについて

    はじめまして。 質問させてください。 CImageを使用して OnPaint( )でBMP画像を描画するアプリを作成しております。 仕様といたしまして ダイアログのDC部にBMPを全体に描画して RGB( 255, 255, 255 )を透明化(背景が完全に見える)する ようにしております。 OnInitDialog( )で透過、透明処理をしています。 OnPaint( )で PaintDC PDC; //背景を透過 PDC.SetBkMode( TRANSPARENT ); PDC.SetTextColor( RGB( 255, 0, 0 ) ); PDC.SetBkColor( RGB( 255, 255, 255 ) ); PDC.TextOutW( 100, 100, _T( "TEST" ) ); 上記のように実装して、EXEで実行して確認しますと Windows2000の場合、正常に文字(TEST)が赤字で描画されるのですが WindowsXPの場合、赤字で描画されるのですが文字の周りがぼやけてしまいます。 イメージとしては文字描画部分が 2000の場合、BMP表示 XPの場合、JPG表示 のようになります。 これは仕様なのでしょうか? それとも何かコードレベルで解決できるのでしょうか? お詳しい方がおりましたらご教授お願いいたします。 よろしくお願いいたします。

  • 画像をきれいに保存したい

    お世話になります。 Windows7 の基本壁画像が C:\Windows\Web\Wallpaper\Windows\img0.jpg これなのですが、これにたとえば知人の小さい顔写真を張り付けて保存すると、中央の4色の旗?の辺がギザギザになって美しくないのです。JPGでもBMPでも。なんとかバックの画像の美しさを損なわず、写真を張り付けたいのですが、無理でしょうか?

  • 画像を一杯に表示できない

    PCでもスマホでも画像を幅一杯に表示させたいです。全画面表示ではありません。できればCSSファイルは別途作成せず、1つのHTMLファイルですませたいです。そこで以下のソースを書きましたが、画像x.jpgのサイズが、画面の大きさを変えても、変わりません <head> <style type="text/css"> img.example1 { width: 100%; height:auto; } </style> </head> <body> <div align="left"> <table width="100%" align="left" bgcolor="#FFFFFF"> <tr> <td width="100%"> <p><img src="x.jpg" alt="x" "class="example1"> </p> </img> </td> どうしたら良いでしょうか?

    • 締切済み
    • CSS