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