トップページ > 過去ログ > 記事閲覧
WindowモードとFullScreenモードで表示が違う
名前:K_T 日時: 2010/05/15 11:01

最近忙しくてプログラムから離れていましたが、時間ができたのでまた始めています。 今回質問させて頂くのは、DrawString関数で文字列を表示する際に文字色を指定しますが、 WindowモードとFullScreenモードで、表示される色が違う現象についてです。 C++のクラス内でGetColor関数を使用して配列に格納した色を使用して、DrawString関数で表示しています。 Windowモードでは意図した色(赤)で表示されるのですが、 FullScreenモードだと、黒になっていしまいます。 DxLibは一つ前のバージョンを使用していた為、現在のバージョンに変更してみましたが同じでした。 原因がわからなく手が出せない状態ですので、どなたか回答をお願いいたします。 WindowsXP VC++2008EE C & C++ 環境としては上記のようになっています。 また、今は会社からなのでソースをアップできませんが、 必要であれば後日アップさせていただきます。 よろしくお願いします。

Page: 1 |

Re: WindowモードとFullScreenモードで表示が違う ( No.1 )
名前:いっち 日時:2010/05/15 12:31

それはおそらく、WindowモードとFullScreenモードでカラービット数が異なるためだと思います。 Windowモード時のカラービット数を変更することは無理なので、FullScreenモードのカラービット数をあわせるか、 以下のようにコールバックで色を再取得すれば解決すると思います。 //-- 以下 さんぷる --// #include "DxLib.h" int RedColor; void ChangeCallback( void *Data ) { SetDrawScreen( DX_SCREEN_BACK ); RedColor = GetColor( 255, 0, 0 ); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL ); if ( DxLib_Init( ) == -1 ) return -1; ChangeCallback( 0 ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawBox( 0, 0, 640, 480, RedColor, TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: WindowモードとFullScreenモードで表示が違う ( No.2 )
名前:管理人 日時:2010/05/16 20:50

いっちさんもご返答されていますが私も GetColor の戻り値は画面のカラービット数によって変化します なので、デスクトップ画面の設定が 32bitカラーの時に最初にウインドウモードで起動した直後に GetColor で得た値を 配列に保存しておいて、その後画面モードをフルスクリーンモードに変更して配列に保存しておいた色コードを 使おうとするとカラーフォーマットが違うので表示される色も違うものとなります 例:画面のカラーbit深度の違いによる GetColor( 255,0,0 ) ; の戻り値の違い  32bitカラー画面モード時の場合( 16進数 )  0x00ff0000  16bitカラー画面モード時の場合( 16進数 )  0x0000f800 なので、保存して長時間使用する場合は GetColor で得られる色コードではなくR,G,Bをそれぞれ別に保存しておくようにしてください ( 若しくは int 型の変数に Color = ( R << 16 ) | ( G << 8 ) | B ; と一つにまとめておいて、使うときに GetColor( ( Color >> 16 ) & 0xff, ( Color >> 8 ) & 0xff, Color & 0xff ) ; こんな風に分離するようにしてください ) リファレンスにこのことについて書いていなかったので追記しておきました
Re: WindowモードとFullScreenモードで表示が違う ( No.3 )
名前:K_T 日時:2010/05/18 21:56

返事遅くなり、申し訳ありません。 いっち様、管理人様、回答ありがとうございます。 内容としては理解できたのですが、私の勉強不足のため 管理人様のコードサンプルが今ひとつ理解できません・・・ カラービット数の違いとの事でしたが、SetGraphMode関数でビット数を指定してもプログラムを起動した時のPC側の カラー設定がわからなければ同じ事なわけでしょうか?
Re: WindowモードとFullScreenモードで表示が違う ( No.4 )
名前:いっち 日時:2010/05/19 12:29

> カラービット数の違いとの事でしたが、SetGraphMode関数でビット数を指定してもプログラムを起動した時のPC側の > カラー設定がわからなければ同じ事なわけでしょうか? Windowモードの場合、SetGraphModeでColorBitNumを指定しても無視されてシステムの設定に従います。 ですので、取りえる主な対策は以下のようになります。 1) Windowモード時のカラービット数を調べて、FullScreenモード時のカラービット数をWindowモードに合わせる。 2) Windowのモードを固定する 3) 色が必要になるたびにGetColorを行う (管理人さん案) 4) Windowのモードが変更されたら、色を再取得する お勧めは2番です。 1番の場合、GetScreenState や GetScreenBitDepth でカラービット数を調べるのですが、 たしか、DxLib_Init のあとでなければうまくいかなかったと思うので、 起動時はとりあえず ChangeWindowMode( TRUE ) で起動して、 その後FullScreenに切り替えると言ったやり方になるのではないかと思います。 (ウィンドウを非表示で起動するオプションがあったような無かったような・・・) > 管理人様のコードサンプルが今ひとつ理解できません・・・ GetColor の引数にすべて同じ値を与えても、画面のカラービット数によって得られる戻り値が異なると言うことは ご理解頂けてますでしょうか?その点がキモですので、コードに関してはおまけと考えてよいと思います。 一応、私なりに注釈をつけてみました。 // int R = 255, G = 128, B = 64; // <- カラー値を保持するのに変数を3つも使うのは邪魔 int VirtualColor = (0xff << 16) | (0x80 << 8) | 0x40; // <- なので、シフト演算子とビット演算子で1つの変数にまとめておく // ↓↓↓↓ // 色々処理をおこなったりする // ↓↓↓↓ int RealColor = GetColor( (VirtualColor >> 16) & 0xff, (VirtualColor >> 8) & 0xff, VirtualColor & 0xff ); // ↑↑↑↑必要なったら分解して1つ1つの色に戻す // GetColorを行っている行は分けて書くと以下と同じです。 // R = (VirtualColor >> 16) & 0xff; // G = (VirtualColor >> 8) & 0xff; // B = VirtualColor & 0xff; // int RealColor = GetColor( R, G, B );
Re: WindowモードとFullScreenモードで表示が違う ( No.5 )
名前:K_T 日時:2010/05/19 22:35

いっち様、詳しい説明ありがとうございます。 1〜3の方法を私なりに試してみて、使いやすい(自分の中でわかりやすい)のを探してみます。 この件でまたわからない部分があれば質問させていただきますので、 その際はよろしくお願いします。

Page: 1 |