- ベストアンサー
画像表示について。
現在SDKにてBMPやRAWなどの画像表示ソフトを作成している段階です。 そして、一通り作成することができました。 ここで質問に答えてくださった皆様に感謝します。 新たに些細な問題が出てきてしまったので質問します。 作成したソフトはMDI型のソフトであり、その構成はフレーム、クライアント、ドキュメントウィンドウといった構成になっています。 もちろん読み込んだ画像はドキュメントウィンドウに表示をするのですが、このドキュメントウィンドウのサイズをマウスを使って変更した場合、画像にちらつきが生じてしまいます。 原因はプログラム上 WM_PAINT メッセージがきた場合に描画をおこなうことに他ならないのですが、解決する手段はないでしょうか? 例えばダブルバッファリングなどの手段があればよいのですが・・・
- みんなの回答 (5)
- 専門家の回答
関連するQ&A
- 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はそれぞれウィンドウのサイズを表しています。
- ベストアンサー
- C・C++・C#
- 画像表示について
画像を表示させたいのですがうまくいきません。 途中まで打ってみたのでご意見お願いします。 (リソースから読み込んで表示させる方法) 環境:MicrosoftVisualC++ SDK ******省略********* case WM_PAINT: hdc = BeginPaint(hWnd,&ps); //ビットマップリソースハンドルの取得 hBmp = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1)); if(hBmp == NULL){ MessageBox(hWnd,"ファイルの読み込みに失敗しました。","エラー",MB_ICONWARNING | MB_OK); exit(1); } //ビットマップの大きさの情報取得 GetObject(hBmp,(int)sizeof(BITMAP),&bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem,hBmp); BitBlt(hdc,0,0,w,h,hdc_mem,0,0,SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd,&ps); break; ******リソース(img.rc)****** // // Bitmap // IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #ifdef APSTUDIO_INVOKED
- 締切済み
- C・C++・C#
- 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」を見てください。
- 締切済み
- C・C++・C#
- MDI(自作メモ帳)の子ウィンドウのHWND取得について
はじめまして、TKOZという者です。 c言語とWINAPIでMDIの自作メモ帳を作っています。 ところで、MDIを使って、複数のドキュメントウィンドウでテキストファイル を保存したいのですが、選択されたドキュメントウィンドウの保存をする 際にそのドキュメントウィンドウのHWND取得をしたいのですが、 どうすればいいでしょうか? ソースコードはこれです。 http://www.kumei.ne.jp/c_lang/sdk/sdk_83.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_84.htm http://www.kumei.ne.jp/c_lang/sdk/sdk_85.htm
- ベストアンサー
- C・C++・C#
- Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて
Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- WINAPI 他のウインドウを重ねると画像やテキストが消える
C++とWINAPIで、ウインドウを作成し、テキストや画像を表示しています。 このウインドウに他のウインドウを重ねて、再度、このウインドウを表示すると画像やテキストが消えてしまいます。 case WM_PAINT: BitBlt( hbtn0DC, 0, 0, 40, 40, hbtn0bmpDC, 0, 0, SRCCOPY ); return 0; 再描画するタイミングで表示するようにしています。 他のウインドウが被っても消えないようにする方法を教えてください。 もしくは、 他のウインドウが被っても画像が消えないようにする処理を説明しているページをどこかで見たような気がするのですが、見つかりません。 ご存知でしたら教えてください。
- ベストアンサー
- その他(プログラミング・開発)
- 画像処理 ビットマップ ダブルバッファリング
「猫でもわかるWindowsプログラミング」を参考に、ビットマップを表示するプログラムを作っています。 下記ソース(WM_PAINT部分のみ抜粋)のような感じで、 読み込んだビットマップをダブルバッファリングを用いて表示させたいのですが、 何も表示させることができず、困っております。 LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) { HBITMAP hBmp; BITMAP bmp_info; HDC hDC, hDC_mem; PAINTSTRUCT ps; int w=0, h=0; switch (msg) { case WM_PAINT: hDC = BeginPaint(hwnd,&ps); hDC_mem = CreateCompatibleDC(hDC); hBmp=LoadBitmap(hInst, TEXT("MYBMP")); hBmp = (HBITMAP)LoadImage(hInst, TEXT("MYBMP"), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; SelectObject(hDC_mem, hBmp); BitBlt(hDC, 0, 0, w, h, hDC_mem, 0, 0, SRCCOPY); DeleteDC(hDC_mem); DeleteObject( hBmp ); EndPaint( hwnd, &ps ); break; } } リソースですが、下記のように bitmap1.bmpを指定しており、画像はもちろんフォルダ内に入れ、 読み込める状態にはしています。 // // Bitmap // MYBMP BITMAP "bitmap1.bmp" #endif // 日本語 resources しかし、hBmpの戻り値を調べると NULL の値が入っています。当然画像は表示されません。 当方、Microsoft visual studio 2005を使っておりますが、このプロジェクトは、 Win32コンソールアプリケーション⇒Windowsアプリケーション で作成はせず、 Win32コンソールアプリケーション⇒コンソールアプリケーション で作成していますので、 ここが問題になっているのでしょうか? できれば、コンソールアプリケーションで作成したいですが、LoadImage関数は使えないのでしょうか? それとも他に問題点があるのでしょうか? 以前は動画処理をしており、SetDIBitsToDevice関数を使って配列の中身を指定し、画像をウィンドウ上に表示していました。 しかし、画像のちらつきが気になったため、ダブルバッファリングに改良しようとし、 調べてみたところ、ビットマップを用いるやり方が一般的なようでした。 そこで、まずはビットマップの表示をさせるプログラムをつくってみようと思ったのですが、つまずいている状態です。 環境は、 Microsoft Windows XP Home Edition Version2002 Service Pack 3 Pentium(R) 4 CPU 2.80GHz 1.0GB RAM Microsoft visual studio 2005(有料) です。 何かアドバイスをよろしくお願いします。
- 締切済み
- C・C++・C#
- 復元した画像が表示されない
「復元、データーリカバリー2」というソフトを使い、画像データー(RAW、PSD、JPEG)を復元しました。各フォルダの中に画像のアイコンがあり、サイズも表示されるのですが、Photosyopに取り込むと、PSD形式で保存したものが「要求された操作を完了できません。有効なPhotoshopドキュメントではありません」とでます。この復元はできないのでしょうか。またできる方法はありませんか。
- 締切済み
- その他(ソフトウェア)
- ホームページに画像が表示されません
Windows XPでホームページを作成中なのですが、画像を1つも表示することができまず困っています。 以下のように作成しました。 ・マイ ドキュメント>Home Page の中にメモ帳で作成したページを .htm で保存しました。(<img src="1/g.JPG">と<body>に書きました) ・画像をマイ ドキュメント>Home Page>1 の中に g.JPG で保存しました。 ・2つともFFFTPでアップロードをしました。 無料ホームページを使用せずにマイ ドキュメントからページを表示すると画像は載っているのですが、FFFTPで開くと×になってしまいます。 なぜホームページ上では表示されないのか分からず困っています。 よろしくお願いします。
- ベストアンサー
- Windows XP
- ビットマップ画像の表示
どうしても正確に動作をしないので、問題点をご指摘していただきたいです。 開発環境はVisual Studio 2005です 24bitのビットマップ画像を読み込み、新しいwindowを作成して表示するプログラムを作成しています。 しかし、読み込んでから新しいWindowは作成されるのですが、どうしても画像が表示されません。 私が気にしている部分は、画像を読み込んでから新しく作成するWindowのプロシージャにおいて、WM_PAINTメッセージで行うべき処理です。 以下にプロシージャを載せます。 LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam ){ PAINTSTRUCT ps; switch( Message ){ case WM_PAINT: BeginPaint( hWnd, &ps ); SetDIBitsToDevice( ps.hdc, 0, 0, pDib->biWidth, pDib->biHeight, 0, 0, 0, pDib->biHeight, pBitmap, (BITMAPINFO *)pDib, DIB_RGB_COLORS ); EndPaint( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hWnd, Message, wParam, lParam ); } return 0; } pDibは PBITMAPINFOHEADER のグローバル変数です。 そしてpDibへ情報を格納するとき、 bitmapSize = bmFileHdr.bfSize - sizeof(BITMAPFILEHEADER); pDib = ( BITMAPINFOHEADER * )malloc( bitmapSize ); と領域を確保し、 fread( pDib, bitmapSize, 1, fp ) というように格納しました。 このときの fp は BITMAPFILEHEADER の分だけ進んでいます。 bmFileHdr は BITMAPFILEHEADERです。 つまりBITMAPFILEHEADER以降の情報を全て格納しました。 また SetDIBitsToDevice での題10引数の pBitmap は pBitmap = (BYTE *)(pDib) + bmFileHdr.bfOffBits - sizeof(BITMAPFILEHEADER); のように求めました。先ほども記述しましたが pDib には BITMAPFILEHEADER 以降の情報を全て格納したので、pDibからヘッダ部分のみポインタを進めました。 やはり WM_PAINTメッセージの部分で、SetDIBitsToDevice関数だけではなく、そのほかに設定することがあるのでしょうか?
- ベストアンサー
- C・C++・C#
- MFC-J893Nでの縮小印刷が突然できなくなりました。Wi-Fi設定のバージョンアップが原因なのか気になります。
- Windows10のバージョン22H2を使用しており、無線LANで接続しています。関連するソフトやアプリはありません。
- 問題の製品はブラザー製品のMFC-J893Nです。縮小印刷ができないトラブルが発生し、原因を調査しています。
お礼
リージョンの解説までいただありがとうございました。 教えていただいた方法により、納得のいくソフトに近づけそうです。 ありがとうございました。