SetWindowSizeChangeEnableFlagを使用した際の黒い画面

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
木箱

SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#1

投稿記事 by 木箱 » 13年前

SetWindowSizeChangeEnableFlagを使用した際、
画面サイズをマウスで変更した時に画面が黒くなりますが、
(本当はサイズ変更中も画像が表示されていると嬉しいですが、ここは問題ありません)
その際に高速で変更すると白い枠線が画面上に一瞬現われます。

何度プログラムしても変わらないのでわたしの環境では少なくとも直らないのですが、
これはどうにかならないのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#2

投稿記事 by softya(ソフト屋) » 13年前

リファレンスに
《注意》
 この関数に TRUE を渡してサイズを自由に変更出来るようにした時は、 SetDrawScreen 関数に DX_SCREEN_BACK を渡して、 絶対に表画面に直接描画しないようにして下さい。(表画面に直接描画すると正しい描画結果が得られません)
とありますが守られていますでしょうか?
木箱 さんが書きました:画面サイズをマウスで変更した時に画面が黒くなりますが、
(本当はサイズ変更中も画像が表示されていると嬉しいですが、ここは問題ありません)
その際に高速で変更すると白い枠線が画面上に一瞬現われます。
私が試した所画像は表示されたままで、白い枠線も表示されません。
状況を再現できるコンパクトなプログラムを掲載してもらうと、こちらでも検証出来ますのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#3

投稿記事 by ISLe » 13年前

Windowsのバージョンや視覚効果オプション、PCのスペックによっても変わります。
実行環境を明示してください。

木箱

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#4

投稿記事 by 木箱 » 13年前

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を使用した際の黒い画面

#5

投稿記事 by 木箱 » 13年前

あと、CPUやメモリなどは
Intel(R) Core(TM)2 Duo CPU E6750@2.66GHz
4.00GB
32ビットです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#6

投稿記事 by softya(ソフト屋) » 13年前

最後にClearDrawScreen() ;じゃなくて最初にClearDrawScreen() ;にするとどうなりますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

木箱

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#7

投稿記事 by 木箱 » 13年前

>最後にClearDrawScreen() ;じゃなくて最初にClearDrawScreen() ;にするとどうなりますか?
ループの最初ですね。以下のようにしてみましたが結果は変わりませんでした。
ちなみに画像を表示するしないは全く関係なく症状が出ます。

//ソース(ループ部分)
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
// 画面を初期化
 ClearDrawScreen() ;
DrawGraph( 0 , 0 , GHandle , FALSE ) ;
// 裏画面の内容を表画面に反映させる
 ScreenFlip() ;
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#8

投稿記事 by ISLe » 13年前

白い枠線はウィンドウのクライアント領域が一瞬見えるのかもしれません。
だとすればサイズを大きくするとき広がった部分だけ見えるはずですけど。

マウスでウィンドウサイズを変更しているあいだはProcessMessage関数から戻らないのでまっとうな方法では対処できないです。
まっとうじゃない方法も思い付きませんが。

木箱

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#9

投稿記事 by 木箱 » 13年前

softya(ソフト屋) さま
ISLeさま
ありがとうございます。

市販ソフトではこのような状況にはならないのですが、
他の方がDXライブラリで作ったゲームで画面サイズを自由に変更できるものは
同じような現象になったため、

これは(わたしの環境では)このような仕様だと思うようにします。
また別の質問をした時はよろしくお願いいたします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: SetWindowSizeChangeEnableFlagを使用した際の黒い画面

#10

投稿記事 by ISLe » 13年前

ウィンドウズのAPIを直接使って、ウィンドウプロシージャを自前で実装(こっちが重要)しているプログラムなら対策できるのですけどね。

DXライブラリだと、SetHookWinProcを使ってもクライアント領域描画周りのウィンドウメッセージをきっちり横取りできないし、できたとしてもDXライブラリの動作そのものを阻害してしまいます。
DXライブラリ本体をソースコードから改造してうまくいったら本家に取り入れてもらうようお願いするというのがある意味まっとうな方法です。

閉鎖

“C言語何でも質問掲示板” へ戻る