トップページ > 過去ログ > 記事閲覧
SetWindowVisibleFlag関数について
名前:紙袋 日時: 2012/09/13 20:05

最初にダイアログのみを表示して、それが閉じられたらDXライブラリで作成されたウィンドウを表示するプログラムを作りたいのですが、 ウィンドウを表示したあとにClearDrawScreen関数を呼ぶとアプリが動作停止して終了してしまいます。 これは仕様なのでしょうか?もしバグでしたら修正していただけないでしょうか? よろしくお願いします。

Page: 1 |

Re: SetWindowVisibleFlag関数について ( No.1 )
名前:Will 日時:2012/09/14 08:28

言葉だけだとどういう状況なのか把握できず、DXライブラリの問題か紙袋さんが作られたプログラム自身の問題かを切り分けできなので、現象を再現できるソースを提示できませんか? また、実行時のログも提示してください。
Re: SetWindowVisibleFlag関数について ( No.2 )
名前:紙袋 日時:2012/09/14 11:35

//現象の起きるプログラム #include <DxLib.h> #include "resource.h" #define MSGDISPATCH(msg, fn) case msg: return fn(hWnd,wParam,lParam) LRESULT CALLBACK DialogProc(HWND ,UINT ,WPARAM ,LPARAM ); LRESULT OnClose(HWND ,WPARAM ,LPARAM ); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdShow,int nCmdShow) { HWND hMainWnd = nullptr; HWND hDialogWnd = nullptr; ChangeWindowMode(TRUE); SetWindowVisibleFlag(FALSE); if( DxLib_Init() == -1) return -1; hMainWnd = GetMainWindowHandle(); hDialogWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hMainWnd,(DLGPROC)DialogProc); SetDialogBoxHandle(hDialogWnd); ShowWindow(hDialogWnd,SW_SHOW); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE) ) { ClearDrawScreen(); ScreenFlip(); } DxLib_End(); return 0; } LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam, LPARAM lParam) { switch(uMsg) { MSGDISPATCH(WM_CLOSE,OnClose); } return 0; } LRESULT OnClose(HWND hWnd,WPARAM wParam,LPARAM lParam) { DestroyWindow(hWnd); SetWindowVisibleFlag(TRUE); return 0; } //実行時のログ 0:システムの情報を出力します 3: DXライブラリ Ver3.08d 6: 論理プロセッサの数 : 4 8: OS Windows7 ( Build 7600 ) 113: CPU動作速度:大体1.33GHz 116: MMX命令を使用します 118: SSE命令が使用可能です 121: SSE2命令が使用可能です 125: CPUベンダ:GenuineIntel 141: CPU名:Intel(R) Core(TM) i3 CPU U 380 @ 1.33GHz 144:COMの初期化... 成功しました 151:メモリ総量:2996.55MB 空きメモリ領域:1146.25MB 155:タイマーの精度を検査します 158:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 161: パフォーマンスカウンターを使用します タイマー精度 : 1299.013000 KHz 166: ソフトの二重起動検査... 二重起動はされていませんでした 173:ウインドウクラスを登録します... 登録に成功しました 178:ウインドウモード起動用のウインドウを作成します 192:ウインドウの作成に成功しました 196:ウインドウを表示します 198:IMEを無効にしました 238:DirectInput関係初期化処理 241: DirectInput7 の取得中... 成功 267: 引き続き初期化処理... 初期化成功 292: ジョイパッドの初期化... 309: ジョイパッドの初期化は正常に終了しました 312: マウスデバイスの初期化... 初期化成功 319: キーボードデバイスの初期化... 初期化成功 327:DirectInput 関連の初期化は正常に終了しました 331:DirectSound の初期化を行います 335:DirectSound インターフェースの取得を行います.... 成功 344:引き続きインターフェースの初期化処理... 成功 494: DirectSound デバイスを列挙します 498: モジュール名: ドライバ記述:プライマリ サウンド ドライバー 501: モジュール名:{0.0.0.00000000}.{c5dccb26-fde8-4e3f-94e3-3966e3b1cd87} ドライバ記述:スピーカー (Conexant CX20582 SmartAudio HD) 505: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 508: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 512: 利用可能サンプリング精度 515: プライマリ 16bit = OK 8bit = OK 519: セカンダリ 16bit = OK 8bit = OK 522: 利用可能チャンネル 525: プライマリ MONO = OK STEREO = OK 529: セカンダリ MONO = OK STEREO = OK 533:DirectSound の初期化は正常に終了しました 543:文字コードバッファの初期化を行います... 完了しました プログラムは昔この掲示板で見た ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=971 を参考にしています。リソースの方はResEditで作成しています。 よろしくお願いします。
Re: SetWindowVisibleFlag関数について ( No.3 )
名前:管理人 日時:2012/09/15 21:18

SetWindowVisibleFlag( FALSE ) ; を DxLib_Init を実行する前に実行すると、 描画を一切しない設定で起動するので、その後描画関係の関数を使用すると 動作が不定になります ただ私も仕様的には「ただ単に非表示状態で起動して、あとから表示して 描画もできる」という方が自然だと思いますので、実装した当時何故現在の 仕様にしたのかは思い出せませんが、とりあえず紙袋さんの希望通りの 動作がするように処理を変更してみました よろしければその変更を加えたこちらのバージョンをお使いになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: SetWindowVisibleFlag関数について ( No.4 )
名前:紙袋 日時:2012/09/16 01:02

無事動作いたしました。ありがとうございます。 あと、これは出来たらでいいのですが。ダイアログのみ表示しているときはタスクバーにアイコンが表示されない仕様になっているみたいですが、 これを表示できるようにしていただけないでしょうか?
Re: SetWindowVisibleFlag関数について ( No.5 )
名前:管理人 日時:2012/09/22 22:29

タスクバーにアイコンを表示することはできますが、そのアイコンはダイアログのアイコンではなく DXライブラリのメインウインドウのアイコンなのでクリックしてしまうとメインウインドウが 表示されてしまうという仕様になりますが、それは紙袋さんの意図されているところでしょうか?
Re: SetWindowVisibleFlag関数について ( No.6 )
名前:紙袋 日時:2012/09/22 23:18

はいそういうことで問題ないです。私が実装したい機能と似たような機能を持ったゲームでは アイコンが表示されており、ユーザ側としてもアイコンが表示されてる方がいいと思ったので。 この機能は絶対必要というわけではないので管理人様のほうの都合がいいときに実装していただければと思います。
Re: SetWindowVisibleFlag関数について ( No.7 )
名前:管理人 日時:2012/09/23 01:08

似たような機能を持ったゲームではアイコンが表示されているということですが、 そのアイコンは何のためにあるのでしょうか 恐らくそのアイコンは非表示になっているメインウインドウのアイコンではなくて、 ダイアログのアイコンではないでしょうか? No.5でも書きましたが、DXライブラリ側で用意できるのはメインウインドウのアイコンを 表示するというものです。それをクリックするとダイアログを表示しているときでも メインウインドウの非表示状態が解かれてメインウインドウがバーンと表示されます それは凄く不自然な挙動で、一般的にそのような実装をするとは思えません よろしければ似たような機能を持ったゲームのダイアログとアイコンの挙動をもう少し調べてみてください
Re: SetWindowVisibleFlag関数について ( No.8 )
名前:紙袋(解決) 日時:2012/09/23 10:00

リソースの方でEXSTYLEでWS_EX_APPWINDOWを追加してアイコンを表示させることが出来ました。 大体求めていた挙動になったのでこれで解決とさせていただきます。

Page: 1 |