ページ 1 / 1
SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月02日(土) 05:00
by 木箱
SetWindowSizeChangeEnableFlagを使用した際、
画面サイズをマウスで変更した時に画面が黒くなりますが、
(本当はサイズ変更中も画像が表示されていると嬉しいですが、ここは問題ありません)
その際に高速で変更すると白い枠線が画面上に一瞬現われます。
何度プログラムしても変わらないのでわたしの環境では少なくとも直らないのですが、
これはどうにかならないのでしょうか?
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月02日(土) 10:48
by softya(ソフト屋)
リファレンスに
《注意》
この関数に TRUE を渡してサイズを自由に変更出来るようにした時は、 SetDrawScreen 関数に DX_SCREEN_BACK を渡して、 絶対に表画面に直接描画しないようにして下さい。(表画面に直接描画すると正しい描画結果が得られません)
とありますが守られていますでしょうか?
木箱 さんが書きました:画面サイズをマウスで変更した時に画面が黒くなりますが、
(本当はサイズ変更中も画像が表示されていると嬉しいですが、ここは問題ありません)
その際に高速で変更すると白い枠線が画面上に一瞬現われます。
私が試した所画像は表示されたままで、白い枠線も表示されません。
状況を再現できるコンパクトなプログラムを掲載してもらうと、こちらでも検証出来ますのでお願いします。
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月02日(土) 16:27
by ISLe
Windowsのバージョンや視覚効果オプション、PCのスペックによっても変わります。
実行環境を明示してください。
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月03日(日) 23:32
by 木箱
softya(ソフト屋)さま
ISLeさま
ありがとうございます。
>リファレンスに~とありますが守られていますでしょうか?
>状況を再現できるコンパクトなプログラムを掲載してもらうと、こちらでも検証出来ますのでお願いします。
DX_SCREEN_BACK を渡しています。ソースを添付しました。
>Windowsのバージョンや視覚効果オプション、PCのスペックによっても変わります。
>実行環境を明示してください。
Windows Vista Home Premium Service Pack 2
視覚効果は今までカスタムでエアロ使用していました。
念のため視覚効果を全てオフにすると枠しか表示されないので結果的に問題ないようです。
視覚効果の中の『ドラッグ中にウインドウの内容を表示する』という項目をオンにしていると、
ドラッグ中にウインドウの中が黒くなり白い枠が一瞬見えるようになります。
//以下ソース
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int GHandle;
// 画面モードの変更
SetGraphMode( 640 , 480 , 32 , 60 ) ;
//ウインドウモードの時にウインドウのサイズを自由に変更出来るようにする
SetWindowSizeChangeEnableFlag( TRUE ) ;
// ウインドウモードに変更
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
GHandle = LoadGraph( "sample.png") ;
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
DrawGraph( 0 , 0 , GHandle , FALSE ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
// 画面を初期化
ClearDrawScreen() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月03日(日) 23:35
by 木箱
あと、CPUやメモリなどは
Intel(R) Core(TM)2 Duo CPU E6750@2.66GHz
4.00GB
32ビットです。
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月03日(日) 23:37
by softya(ソフト屋)
最後にClearDrawScreen() ;じゃなくて最初にClearDrawScreen() ;にするとどうなりますか?
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月03日(日) 23:54
by 木箱
>最後にClearDrawScreen() ;じゃなくて最初にClearDrawScreen() ;にするとどうなりますか?
ループの最初ですね。以下のようにしてみましたが結果は変わりませんでした。
ちなみに画像を表示するしないは全く関係なく症状が出ます。
//ソース(ループ部分)
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
// 画面を初期化
ClearDrawScreen() ;
DrawGraph( 0 , 0 , GHandle , FALSE ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月04日(月) 01:43
by ISLe
白い枠線はウィンドウのクライアント領域が一瞬見えるのかもしれません。
だとすればサイズを大きくするとき広がった部分だけ見えるはずですけど。
マウスでウィンドウサイズを変更しているあいだはProcessMessage関数から戻らないのでまっとうな方法では対処できないです。
まっとうじゃない方法も思い付きませんが。
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月04日(月) 02:04
by 木箱
softya(ソフト屋) さま
ISLeさま
ありがとうございます。
市販ソフトではこのような状況にはならないのですが、
他の方がDXライブラリで作ったゲームで画面サイズを自由に変更できるものは
同じような現象になったため、
これは(わたしの環境では)このような仕様だと思うようにします。
また別の質問をした時はよろしくお願いいたします。
Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面
Posted: 2013年3月04日(月) 17:36
by ISLe
ウィンドウズのAPIを直接使って、ウィンドウプロシージャを自前で実装(こっちが重要)しているプログラムなら対策できるのですけどね。
DXライブラリだと、SetHookWinProcを使ってもクライアント領域描画周りのウィンドウメッセージをきっちり横取りできないし、できたとしてもDXライブラリの動作そのものを阻害してしまいます。
DXライブラリ本体をソースコードから改造してうまくいったら本家に取り入れてもらうようお願いするというのがある意味まっとうな方法です。