トップページ > 過去ログ > 記事閲覧
ウインドウ切り替え後のメニューバー処理
名前:さとう 日時: 2009/11/26 17:01

ウインドウをフルスクリーンにして、ウインドウに戻した後、SetMenuItemEnable_Name関数の値が-1を返してしまいます。 フルスクリーンにした後画像関係とメニューバーの再設定もしていてます。 ウインドウモードの時は正常に機能しています。 ソースが諸事情につき公開できないので、コメントのみとなってしまいまして申し訳ございませんが、アドバイスをお願いします。

Page: 1 |

Re: ウインドウ切り替え後のメニューバー処理 ( No.1 )
名前:Will 日時:2009/11/26 20:17

回答ではないです。 そのもののソースを公開する必要はありませんが、現象が再現できる最小限の ソースを書いて提示してもらえませんか? 回答者側で現象を確認できないと、ライブラリの問題なのか、さとうさんが 組まれたプログラムの問題なのか、さとうさんが使用されているPCが 原因なのか、その切り分けがしづらいと思います。 今の情報だけでは、回答者側で予想で補わなければならない部分が大きすぎます。
Re: ウインドウ切り替え後のメニューバー処理 ( No.2 )
名前:さとう 日時:2009/11/27 11:46

再現ソースを組んでみたところ 再現ができず現在ソースを再度見直しをしております。 /*#include "DxLib.h" void DebugBox(char *mes,...); void drouing_init();//ウインドウ切り替え後の再設定処理 void menu_message();//メニューバーの処理 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { //画面をウインドウにするかフルスクリーンにするか ChangeWindowMode( TRUE );//TRUE:ウインドウ FALSE:フルスクリーン //メニューの追加 AddMenuItem_Name(NULL,"メニュー");//第一引数NULLで第2引数のメニューを作成 AddMenuItem_Name("メニュー","終了"); AddMenuItem_Name("メニュー","画面"); AddMenuItem_Name("画面","ウインドウ");//メニューの中身の画面の中身 AddMenuItem_Name("画面","フルスクリーン"); //メニューを選択できなくする //SetMenuItemEnable_Name("画面",0);//1選択できる 0選択できない DebugBox("最初画面選択フラグ%d",SetMenuItemEnable_Name("画面",0)); //メニューを有効にするかの設定 SetUseMenuFlag( TRUE ); //DXライブラリの初期化処理 if( DxLib_Init() == -1 ) return -1; //描画対象を裏画面に設定 SetDrawScreen( DX_SCREEN_BACK ); //マウスポインタ表示 SetMouseDispFlag( TRUE ); //四角形の描画 DrawBox(100,100,150,90,GetColor(0,0,255),TRUE); //メニューを選択できるようにする //SetMenuItemEnable_Name("画面",1);//1選択できる 0選択できない DebugBox("二番目画面選択フラグ%d",SetMenuItemEnable_Name("画面",1)); //メインループ while(1) { menu_message(); //メニューの処理 ClsDrawScreen(); //画面を消去 if(CheckMenuItemSelect_Name("終了") ==1){ break;//ループを抜ける } WaitKey() ; ScreenFlip(); //画面を切り替え } DxLib_End() ; return 0 ; } //メッセージボックスを使いやすくする関数(メッセージに数字を表示する) void DebugBox(char *mes,...){ char string[1024]; va_list list; va_start(list,mes); vsprintf_s(string,mes,list); va_end(list); MessageBox(NULL,string,"",MB_OK|MB_TOPMOST); } void drouing_init() { //ウインドウスタイルの設定 SetWindowStyleMode(0); SetUseGDIFlag( TRUE );//GDI描画を許可する //クライアント領域 SetDrawArea(0,0,639,479); //描画の表示形態デフォルトをしよう SetDrawMode(DX_DRAWMODE_NEAREST); //マウスポインタ表示 SetMouseDispFlag( TRUE ); DeleteMenuItemAll();//メニューバーのメニューを全部削除 //描画輝度 SetDrawBright(255,255,255); //描画対象を裏画面に設定 SetDrawScreen(DX_SCREEN_BACK); SetAutoMenuDisplayFlag( TRUE );//メニューバーを表示 //メニューの追加 AddMenuItem_Name(NULL,"メニュー");//第一引数NULLで第2引数のメニューを作成 AddMenuItem_Name("メニュー","終了"); AddMenuItem_Name("メニュー","画面"); AddMenuItem_Name("画面","ウインドウ");//メニューの中身の画面の中身 AddMenuItem_Name("画面","フルスクリーン"); //メニューを選択できなくする //SetMenuItemEnable_Name("画面",0);//1選択できる 0選択できない DebugBox("画面選択フラグ%d",SetMenuItemEnable_Name("画面",0)); //四角形の描画 DrawBox(100,100,150,90,GetColor(0,0,255),TRUE); ScreenFlip(); } void menu_message() { //画面ー>ウインドウ if(CheckMenuItemSelect_Name("ウインドウ") == 1){ ClearMenuItemSelect();//メニューが選択されたかの初期化 if( GetWindowModeFlag() == 0){ //ウインドウモード切替 ChangeWindowMode( TRUE );//ウインドウにする drouing_init(); } } //画面ー>フルスクリーン if(CheckMenuItemSelect_Name("フルスクリーン") == 1){ ClearMenuItemSelect();//メニューが選択されたかの初期化 if( GetWindowModeFlag() == 1 ){ //ウインドウモード切替 ChangeWindowMode( FALSE );//フルスクリーンにする drouing_init(); } } }*/ 上記が状況再現しようとしたソースですが、今回質問した現象は確認できないと思います。 しかしながら、フルスクリーン時にメニューバーのちらつきが気になるのですが、こちらはどのような状況でしょうか。 ご助力をお願いします。
Re: ウインドウ切り替え後のメニューバー処理 ( No.3 )
名前:いっち 日時:2009/11/27 20:04

私の環境でテストしてみましたが、SetMenuItemEnable_Name関数-1を返すという事象は再現しませんでした。 しかし、1回目のdrouing_init()呼び出しの後でもメニューの"画面"項目が選択可能なままでしたので、 さとうさんの意図する動作となっていないのは確かだと思います。 ためしに全てのChangeWindowMode()をTRUEにして(常にWindowモード)実行してみたところ、 一回目のdrouing_init()でメニューの"画面"項目で選択不可となりました。 また、DeleteMenuItemAll()を行わない場合もうまくいきました。 私がテストに使用したソースは以下の通りです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); // ChangeWindowMode( FALSE ); // 最初からフルスクリーンにしてもうまくいく AddMenuItem_Name( NULL, "MENU" ); AddMenuItem_Name( "MENU", "QUIT" ); SetUseMenuFlag( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; { // このブロックをコメントにするとうまくいく ChangeWindowMode( FALSE ); } { // このブロックをコメントにしてもうまくいく DeleteMenuItemAll( ); AddMenuItem_Name( NULL, "MENU" ); AddMenuItem_Name( "MENU", "QUIT" ); } SetMouseDispFlag( TRUE ); SetDrawScreen( DX_SCREEN_BACK ); SetAutoMenuDisplayFlag( TRUE ); SetMenuItemEnable_Name( "QUIT", 0 ); // QUITはグレーアウト while ( ProcessMessage( ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 50, 0x00ffffff, "Test %d %d", GetDisplayMenuFlag( ), GetUseMenuFlag( ) ); ScreenFlip( ); } DxLib_End( ); return 0; } なお、フルスクリーン時のメニューバーのちらつきも確認できました。 他にも色々と試してみたのですが、DxLib3.00以降のメニュー周りはまだ開発段階(試行錯誤中?)のような印象を受けました。 (Ver3.00eとテストバージョンのVer3.00fでも微妙に動作が違うようです) 対策としては改良されるのを気長に待つか、サンプルゲームで提供されているスクリプトプレーヤーの 右クリックメニューのように独自のGUIを提供するしかないのではないかと思います。 勝手なことを書きましたが、根本的にライブラリの使い方が間違っていたら、申し訳ありません。>管理人さん
Re: ウインドウ切り替え後のメニューバー処理 ( No.4 )
名前:管理人 日時:2009/11/29 21:52

SetMenuItemEnable_Name 関数が -1 を返すのは、DXライブラリにバグが無い場合は 指定された名前のメニューが無かったときです 再設定をする際に指定の名前のメニューがなくなっているということはないでしょうか? あと、フルスクリーン時のメニューバーのちらつきとは具体的にはどのような現象でしょうか? 私の環境ではメニューを選択した際に選択したメニューの近辺がちらつくというものですが、 こちらは現状ではちょっと対処方法が思いつかない状態です・・・ ( メニューを常時表示するようにすればちらつかないのですが・・・ ) いっちさんがご指摘下さった不具合は確認でき、修正することができました さとうさんがお使いのバージョンより改善されている部分もあるかもしれませんので、 よろしければこちらのバージョンをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) > いっちさん 掲載していただいたプログラムでの使い方に間違いはありません 一応正式対応できているつもりなのですが、まだ安定していないみたいです・・・
Re: ウインドウ切り替え後のメニューバー処理 ( No.5 )
名前:いっち 日時:2009/11/30 01:11

管理人さん、いつもお世話になっております。 ご提供頂いた最新のDxLibにて動作確認を行いました。 "メニュー項目のグレーアウト"と"メニューバーのちらつき"共に改善されておりました。 ばっちりです。 ちらつきはフルスクリーン時にメニューバーにマウスを乗せるとメニュー項目の文字がちらつくというものでした。 (メニュー項目のいずれかを選択状態にするとちらつきは無くなる) 管理人さんの環境では発生しないとの事で謎ですが、新バージョンでは私の環境でも発生しなくなりました。 せっかくですので、以下に私がメニュー回りで感じた違和感を記載させて頂きます。 ほとんど重箱の隅をつつく様なものですが、ご容赦ください。 1.フルスクリーン時にDeleteMenuItemAll()を使用し、メニューを再構築した後、 マウスでメニューバーを表示させるとすぐに消えてしまいます。 (見えないだけで存在はしている模様) 再現手順としては、上記(No.3)のソースでChangeWindowMode関数をすべてFALSEにして実行し、 マウスをメニューバー付近に移動すれば再現すると思われます。 (Ver.225bでは発生しません) 2.ESCキーで選択をキャンセルした場合、プルダウンメニューが残ります。 再現手順としては、上記(No.3)のソース実行後、マウスで項目"MENU"を選択した状態で、 ESCキーを押下すると再現すると思われます。 Windowsの標準的な動作(?)だったような気もします・・・。 (Ver.225bも同様でした) 3.メニューバーをマウスオーバーで表示させた場合とAltキーで表示させた場合で、 出現方法が若干違います。Altキーではクライアント領域の位置が変更されていないように見えます。 これも上記(No.3)のソース実行後、マウスとAltキーでメニューバーを表示して頂ければ すぐにわかると思います。Altキーでは文字列の表示される位置が変わりません。 上記(2)(3)共にSetDrawScreenでDX_SCREEN_BACKを指定しないと発生しませんでした。 (Ver.225bではフルスクリーン時にAltキーは無効のようでした) 以上です。 いずれも致命的ではありませんが、一応ご報告させて頂きます。 スレッドを勝手にお借りしてすみません。>さとうさん
Re: ウインドウ切り替え後のメニューバー処理 ( No.6 )
名前:さとう 日時:2009/11/30 12:08

週末確認ができず先ほど確認をしました。 ちらつきの症状は改善されております。 いっちさんと同じ結論に至り代弁していただいた形となりました。ありがとうございます。
Re: ウインドウ切り替え後のメニューバー処理 ( No.7 )
名前:管理人 日時:2009/12/13 12:42

>いっちさん ご報告ありがとうございます 1は直ぐ消えないように修正しました 2.3は仕様ということで・・・(^ ^; もしご必要でしたら修正を反映したバージョンをお使い下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) >さとうさん ご報告ありがとうございます
Re: ウインドウ切り替え後のメニューバー処理 ( No.8 )
名前:いっち 日時:2009/12/13 16:19

>管理人さん 修正確認できました。 しかし、下記のソースを実行し、 「左上隅でマウスの左クリックを連打、もしくは、Altキーを連打すると メニュー非表示にも関わらずメニューが表示されるという事象」を確認しました。 メニューの再構築を行わなければ発生しませんのでDeleteMenuItemAll関数の問題と思われます。 (メニューを選択してもCheckMenu系関数は反応しないので実害はない模様) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if ( DxLib_Init( ) == -1 ) return -1; SetMouseDispFlag( TRUE ); SetDrawScreen( DX_SCREEN_BACK ); { // メニューの初期化 AddMenuItem_Name( NULL, "MENU" ); AddMenuItem_Name( "MENU", "QUIT" ); } { // メニューの再構築 // このブロックをコメントアウトすると問題なし DeleteMenuItemAll( ); AddMenuItem_Name( NULL, "MENU" ); AddMenuItem_Name( "MENU", "QUIT" ); } { // メニューは非表示 SetUseMenuFlag( FALSE ); SetDisplayMenuFlag( FALSE ); } while ( ProcessMessage( ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 50, 0x00ffffff, "Test %d %d %d", GetDisplayMenuFlag( ), GetUseMenuFlag( ), CheckMenuItemSelect_Name( "QUIT" ) ); ScreenFlip( ); } DxLib_End( ); return 0; } お忙しいところ、お手数をおかけして申し訳ありませんが、 ご確認のほどよろしくお願いします。
Re: ウインドウ切り替え後のメニューバー処理 ( No.9 )
名前:管理人 日時:2009/12/16 23:52

雑談掲示板の方で申し上げたことの繰り返しになりますが ご報告ありがとうございます ご指摘の通り DeleteMenuItemAll 関数に問題がありました 修正版をアップしましたので、もしご必要でしたらお使い下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: ウインドウ切り替え後のメニューバー処理 ( No.10 )
名前:いっち(解決) 日時:2009/12/17 12:29

> 管理人さん 修正確認できました。 すばやい対応ありがとうございました。 スレ主ではありませんが本件は解決とさせて頂きます。

Page: 1 |