DXライブラリが正常に終了してくれない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 11年前

DXライブラリが正常に終了してくれない

#1

投稿記事 by sadora3 » 8年前

コンパイラ:Visual Studio 2010
OS:Win7 32bit
言語:C

以下のコードを実行してからウィンドウのXボタンを押すと、ウィンドウは閉じてくれるのですが、プログラムは実行されたままです。ですが、なぜかプログラム実行後ESCキーを押して終了すると、正常に終了してくれます。
どうすればXボタンでも正常終了してくれるようになるのでしょうか?
以前はちゃんと終了してくれたのに・・・。
DXライブラリは新しいのダウンロードしてきて、新しくプロジェクト作り直してみたのですが、状況は改善されませんでした。
ビルドはDebugもReleaseもやってみましたが、両方Xボタンでの終了ではプログラムが動いたままなのです。

コード:

#include"DxLib.h"

int ProcessLoop(){
	if(ProcessMessage() != 0){  return -1;  }
	if(ClearDrawScreen() != 0){ return -1;  }
	return 1;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	SetGraphMode(640, 480, 32);
	SetOutApplicationLogValidFlag(FALSE);
	if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){   return -1;  }
	while(ProcessLoop() && !CheckHitKey(KEY_INPUT_ESCAPE)){
		DrawBox(270, 190, 370, 290, GetColor(0,255,0), FALSE);
		ScreenFlip();
	}
	DxLib_End();
	return  0;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: DXライブラリが正常に終了してくれない

#2

投稿記事 by みけCAT » 8年前

sadora3 さんが書きました:どうすればXボタンでも正常終了してくれるようになるのでしょうか?
テストはしていませんが、ProcessLoop関数を

コード:

int ProcessLoop(){
	if(ProcessMessage() != 0){  return 0;  }
	if(ClearDrawScreen() != 0){ return 0;  }
	return 1;
}
として失敗しなかったかどうかをきちんと真偽値で返すようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

MILLE

Re: DXライブラリが正常に終了してくれない

#3

投稿記事 by MILLE » 8年前

みけCATさんの書き込みの補足です。

ウィンドウのプログラムというのは、普通のコンソールのプログラムとは少し異なります。具体的にはイベントドリブンという方法で動いてます。
ウィンドウで×ボタンを押した場合、内部的にはWM_CLOSEという命令を発行しています。
そして、そのWM_CLOSE命令のデフォルトの動作はWINAPIのDestroyWindow()という関数を実行します。
DestoryWindow()はWM_DESTROYという命令が発行され、デフォルトの動作はSendQuitMessage()という関数を実行しています。
このSendQuitMessage()が実行されたとき、WM_QUITという命令を発行します。DxLibのProcessMessage()関数の中ではPeekMessage()もしくはGetMessage()という関数が書かれており、この関数で今ウィンドウになされた操作を受け取れます。WM_QUITをキャッチしたとき、While文を抜けるようにしなければならないのです。

WM_QUITをキャッチしたとき、ProcessMessage()は0以外を返却するように記述されています。
それがみけCATさんのコードの3行目
if(ProcessMessage() != 0){ return 0; }
です。
ここでWinMainのWhile文を抜けるようにするにはProcessLoop()が0のときです(キー入力については置いときます)
なので0を返しています。

わかりにくい文章ですいません。
よし深く知りたい、ここに書かれてることが意味不明すぎるなら「WIN32API 入門」や「ウィンドウプロシージャ」「イベントドリブン」「コールバック関数」でぐぐれば出てきます。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリが正常に終了してくれない

#4

投稿記事 by Dixq (管理人) » 8年前

ProcessMessage()の返り値に依存した処理になっていないからですね。
ProcessMessage()が0以外を返したらwhile文を抜けるようにして下さい。

MILLE

Re: DXライブラリが正常に終了してくれない

#5

投稿記事 by MILLE » 8年前

管理人さんが本当にわかりやすくまとめてくれて助かります笑

sadora3
記事: 175
登録日時: 11年前

Re: DXライブラリが正常に終了してくれない

#6

投稿記事 by sadora3 » 8年前

おおー。治りました。
みなさん本当にありがとうございました。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: DXライブラリが正常に終了してくれない

#7

投稿記事 by naohiro19 » 8年前

MILLE さんが書きました: DestoryWindow()はWM_DESTROYという命令が発行され、デフォルトの動作はSendQuitMessage()という関数を実行しています。
勘違いしていますね。正しくは「PostQuitMessage」ですよ。

MILLE

Re: DXライブラリが正常に終了してくれない

#8

投稿記事 by MILLE » 8年前

ああ、確かにPostですね。

閉鎖

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