トップページ > 過去ログ > 記事閲覧
画面いっぱいに描画できません
名前:お父さん 日時: 2006/10/27 19:03

「わくわくC…」のp78のプログラム(画面の右下に正方形を描くプログラム)で描画できません。 描画範囲が(0,0)-(452,350)ぐらいに限られてしまうようです。 調べて見ましたところ、SetDrawScreen(DX_SCREEN_BACK);でいったん裏画面に描画し、それをScreenFlip();で切り替えると 画面右下いっぱいまで意図したとおり描画できます。 要するに、下のプログラムで、SetDrawScreenとScreenFlipを有効にすれば画面右下一杯に水色と紫の四角形が描画されますが、 無効にすると、画面中央あたりに、右側と下側に紫の線が引かれた細長い水色の長方形が描画されるだけの結果になって しまいます。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, INT Nc) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) return -1; //SetDrawScreen(DX_SCREEN_BACK); // 描画対象画面の指定 DrawBox(420,160,640,480,65535,TRUE); DrawBox(452,160,640,480,0xff00ff,TRUE); DrawBox(420,350,640,480,0xff00ff,TRUE); //ScreenFlip(); WaitKey(); DxLib_End(); return 0; } ログファイルは以下です。 0:システムの情報を出力します 10: DXライブラリ Ver2.22d 10: OS Windows2000 ( Build 2195 Service Pack 4 ) 110: CPU動作速度:大体0.89GHz 110: MMX命令を使用します 110: CPUベンダ:GenuineIntel 112:COMの初期化... 成功しました 116:ソフトの二重起動検査... 二重起動はされていませんでした 117:メモリ総量:255.48MB 空きメモリ領域:131.95MB 117:ソフトの実行優先レベルを上げました 117:ウインドウクラスを登録します... 登録に成功しました 118:ウインドウモード起動用のウインドウを作成します 132:IMEを無効にしました 134:タイマーの精度を検査します 138:精度結果 更新回数 マルチメディアタイマー:1 パフォーマンスカウンター:60 139:パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz 340:ウインドウスタイルをウインドウモード用に変更します... 完了 342:DirectInput関係初期化処理 342: DirectInput7 の取得中... 成功 368: 引き続き初期化処理... 初期化成功 369: ジョイパッドの初期化... 377: ジョイパッドの初期化は正常に終了しました 377: マウスデバイスの初期化... 初期化成功 378: キーボードデバイスの初期化... 初期化成功 382:DirectInput 関連の初期化は正常に終了しました 383:DirectSound の初期化を行います 384:DirectSound インターフェースの取得を行います.... 成功 388:引き続きインターフェースの初期化処理... 成功 494: DirectSound デバイスを列挙します 496: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 497: モジュール名: yacxg.sys ドライバ記述:YAMAHA AC-XG WDM Audio 497: 最大サンプリングレート:48.00KHz 最小サンプリングレート:44.10KHz 497: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 500: 利用可能サンプリング精度 500: プライマリ 16bit = OK 8bit = NO 500: セカンダリ 16bit = OK 8bit = NO 500: 利用可能チャンネル 501: プライマリ MONO = OK STEREO = OK 501: セカンダリ MONO = OK STEREO = OK 501:DirectSound の初期化は正常に終了しました 503:DirectDraw 関連の初期化を行います 503: DirectDraw オブジェクトの取得を行います.... 成功 508: 引き続き初期化処理... 初期化に成功しました 511: ビデオカードの情報 511: 画面モード変更処理を開始します 573: 画面モードの変更処理を開始します 640 x 480 16 bit 574: ウインドウモードにします 574: 画面モードの変更は正常に終了しました 574: カラー情報 575: A:00000000 B:00ff0000 G:0000ff00 B:000000ff 575: ウインドウスタイルをウインドウモード用に変更します... 完了 575: 出力画面用の DirectDrawSurface を作成します 592: 各スクリーンメモリの配置位置 592: PrimaryBuffer : VIDEOMEMORY 593: BaskBuffer : VIDEOMEMORY 593: 出力画面用の DirectDrawSurface の作成は正常に終了しました 594: Direct3D 関連の初期化を行います 596: Direct3Dオブジェクトを取得します 598: Direct3Dオブジェクトを取得しました 600: 3Dデバイスを作成します... 3Dデバイスの作成に成功しました 603: テクスチャ最大幅:1024 最小幅:1 604: 描画制限: D_D3DPTEXTURECAPS_POW2 = 1 D_D3DPTEXTURECAPS_SQUAREONLY = 0 604: テクスチャピクセルフォーマット 604: 通常グラフィック用 604: BIT:16 RED:5 GREEN:6 BLUE:5 605: RED:00f800 GREEN:0007e0 BLUE:00001f 606: BIT:32 RED:8 GREEN:8 BLUE:8 606: RED:ff0000 GREEN:00ff00 BLUE:0000ff 607: アルファチャンネル付きグラフィック用 607: BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4 607: ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f 607: BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8 607: ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff 608: Direct3D 関連の初期化は正常に終了しました 608: グラフィック管理系の初期化を行います 611: 3Dグラフィック描画機能を使用します 613: フォントの初期化を行います 631: フォントの初期化は正常に終了しました 632: グラフィック管理系の初期化は正常に終了しました 3036: サーフェス間転送には BitBlt を使用します 3036: BitBlt:1182139μs BltFast:1198581μs 3037: スキャンラインの数:768 3095: 1フレーム当たりの時間は 16 msecです 3095: Tri00:16 msec 3096: Tri01:0 msec 3096: Tri02:16 msec 3096: Tri03:1 msec 3096: 画面モード変更処理は正常に終了しました 3122: オーバーレイサーフェスを使用します    UYVY 3123: DirectDraw 関連の初期化は正常に終了しました 3132: 文字コードバッファの初期化を行います... 完了しました 6472: ウインドウを閉じようとしています 6486: ウインドウが破棄されようとしています 6487: ソフトを終了する準備が整いました 6490: DirectDraw 関連の終了処理をおこないます 6492: フォントの初期化を行います 6508: フォントの初期化は正常に終了しました 6510: グラフィック管理系の終了処理は正常に終了しました 6510: Direct3D 関連の終了処理を行います 6511: 3Dデバイスの削除は正常に終了しました 6513: Direct3D 関連の終了処理は正常に終了しました 6514: メインサーフェスを破棄をします... 完了しました 6514: DirectDrawオブジェクトを解放します 6515: DirectDrawオブジェクトを解放しました 6516: DirectDraw 関連の終了処理は正常に終了しました 6516: DirectInput 関連の終了処理... 完了 6755: DirectSound の終了処理は正常に終了しました 6756: 6756: Alloc memory dump Total size:0(0.000kb) Alloc num:0 6757: フロント画面の描画範囲が(0,0)-(640,480)に設定されていないように思うのですが、どうしてこうなるのでしょうか。 VC++用、BCC用どちらでもこうなります。 追記: 今、家にある別のパソコンでExeファイルを実行してみましたら、そちらでは、問題なく右端まで描画されました。 ますますわけがわからなくなりました。 2.ChangeWindowMode(FALSE); にして全画面表示にすると、私のパソコンでも、右端まで表示されました。 ただし、長方形の色は、白と青になりました。 3.SetScreenMemToVramFlag( FALSE ); にしても右端まで描画されました。ただし色は、やはり白と青になりました。 これで描画できるということは、ビデオカードが古いのでどうしようもないということになるのでしょうか? でも、裏画面に描画して画面を切り替えればちゃんと描画できるなら、表画面に描いてもちゃんと描画できるはずだと 思うのですが、どうでしょうか?

Page: 1 | 2 |

Re: 画面いっぱいに描画できません ( No.1 )
名前:Thilf 日時:2006/10/28 00:40

こんばんは、はじめましてThilfといいます。 ちょっと…というか、かなり気になったので指摘しても宜しいですか? 上記のプログラムの【DrawBox】の第4引数Colorは 0xRRGGBB ではなく、【GetColor】で取得された値ではないといけませんよ。 32bitなら大抵は X8R8G8B8 なので 0x00RRGGBB でもいける事はいけますが、16bitは大抵が R5G6B5 なので上記の場合は、 (説明)[値] → [16bit振り分け] → [わかりやすく各値を8bitに変換] ・65535(0x00ffff) → R=0x1f,G=0x3f,B=0x1f → R=0xf8,G=0xfc,B=f8(白) ・0xff00ff → R=0x00,G=07,B=1f → R=0x00,G=0x38,B=0xf8(明るい青) になります。ですから、矩形が白と青になるのは当たり前です。 カラービットの配置は上記 Log.txt の 604: あたりに書いてますし。 ですが、【ChangeWindowMode】や【SetDrawScreen】、【ScreenFlip】で表示ができたりできなかったりするのは、表画面と裏画面でカラービットが違うからかもしれませんね。詳細は管理人様に聞かないとわかりませんけど。 >でも、裏画面に描画して画面を切り替えればちゃんと描画できるなら、表画面に描いてもちゃんと描画できるはずだと 思うのですが、どうでしょうか? 案外そうでもないですよ(【SetScreenMemToVramFlag】とか特に) 厚かましくもスミマセンm(_ _)m ではでは。
Re: 画面いっぱいに描画できません ( No.2 )
名前:お父さん 日時:2006/10/28 04:20

Thilfさん どうもありがとうございます。ウインドウモードにすると画面全体に描画できないという問題は、解決しません でしたが、おかげさまで、画面モードによって描画される四角形の色が変わるという現象の謎が解けました。 「Cわくわく…」のサンプルプログラムが「65535」になっていたので、10進数で色を考えるのは面倒だと思い 無精をして、単純に16進数で書きましたが、やはりきちんとしないといけませんね。 どうもありがとうございました。また何かありましたらアドバイスお願いします。
Re: 画面いっぱいに描画できません ( No.3 )
名前:管理人 日時:2006/10/28 15:11

 お父さんさんどうも、DXライブラリの管理人です。  ウインドウモードで裏画面を使わない場合のみですか・・・・・  何らかの理由で描画領域が正しく設定されていない可能性も ありますので、宜しければ試しに描画直前に SetDrawArea( 0, 0, 100, 100 ); SetDrawArea( 0, 0, 640, 480 );  という記述を追加して確実に描画領域の設定がされるように してみて頂けないでしょうか?
Re: 画面いっぱいに描画できません ( No.4 )
名前:お父さん 日時:2006/10/28 15:55

管理人様 ご返事ありがとうございます。 さっそくSetDrawAreaをDrawBoxの上に加えてみましたがやはりだめでした。でもどうして表画面だけうまく設定 されないのでしょう。我が家のほかのパソコンで試してみましても、こんな症状は出ませんので、私のパソコンに 問題があるんだろうとは思うのですが、もし何らかの対策があるようでしたらお願いしたいと思います。 ちなみにただいま試してみましたソースは以下のとおりです。 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, INT Nc) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) return -1; //SetDrawScreen(DX_SCREEN_BACK); // 描画対象画面の指定 SetDrawArea( 0, 0, 100, 100 ); SetDrawArea( 0, 0, 640, 480 ); DrawBox(420,160,640,480,GetColor(0,255,255),TRUE); DrawBox(452,160,640,380,GetColor(255,0,255),TRUE); DrawBox(420,350,640,480,GetColor(255,0,255),TRUE); //ScreenFlip(); WaitKey(); DxLib_End(); return 0; } よろしくお願いします。
Re: 画面いっぱいに描画できません ( No.5 )
名前:管理人 日時:2006/10/29 02:11

 お父さんさんどうも、DXライブラリの管理人です。  駄目でしたか・・・  うーん、不思議ですね。  描画領域がどうなっているのか少し調べたいので、ちょっと変な テストプログラムを組んでみました。 http://homepage2.nifty.com/natupaji/temp/DrawBoxTest.zip  実行するとデスクトップ画面の左上から幅640ドット高さ480ドットの 領域が迷惑にも塗りつぶされます。(他のウインドウを塗りつぶされた 領域に重ねれば元に戻るのでシステム的には問題ありません)  このテストプログラムでも描画領域が変になってしまうか、宜しければ お試しになってみて下さい。m(_ _)m  あと、宜しければ問題が発生しているPCに搭載されているグラフィック チップを教えて頂けないでしょうか?

Page: 1 | 2 |