トップページ > 記事閲覧
ツールバーを使用したプログラムの不具合
名前:紺帽子 日時: 2021/10/30 16:26

移動する円の移動方向と色をツールバーから変更するプログラムです。 発生している問題と疑問について見解をお願いします。 1.ツールバーが表示されない ウィンドウ枠をクリックしている間は表示される。 ウィンドウ枠をクリックするとウィンドウ位置が少し下方に移動する。 ツールボタンの位置をクリックまたは離したとき、そのボタンは一瞬表示される。 2.最大化ボタンが無効となっている ウインドウスタイルに最大化ボタンを表示するように設定したが使用不可となっている。 ツールバー関係の処理をコメントアウトすると使用できるようになる。 3.最大化ボタンを押すと設定ウィンドウサイズの最大サイズを越える 最大化ボタンが有効なとき、最大化するとSetWindowMaxSize関数の設定が無視される。 ツールバーとは無関係ですが、最大化ボタンを押したときの動作は仕様でしょうか。 4.ウィンドウサイズの縦方向が自動補正される SetWindowMaxSize関数で設定した縦の値に自動補正される。 320x240に設定したウィンドウが縦長になってしまいます。 SetWindowSizeChangeEnableFlagが有効だと補正され、無効だと補正されません。 以下試したプログラム #include "DxLib.h" // ツールバー機能を取り外す場合は0をセットしてください #define TOOLBAR_BLOCK (1) int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { SetWindowStyleMode(7); // 最大化ボタンを有効化 SetGraphMode(::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 32); // バックバッファのサイズ ChangeWindowMode(TRUE); // ウィンドウモード SetWindowSizeChangeEnableFlag(TRUE, FALSE); // ウィンドウの拡大縮小を許可する SetWindowMaxSize(1280, 720); // ウィンドウ拡大の最大サイズ SetWindowMinSize(320, 240); // ウィンドウ縮小の最小サイズ SetWindowSize(320, 240); // ウィンドウの初期サイズ SetBackgroundColor(128, 128, 128); // 背景を灰色にする if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); #if TOOLBAR_BLOCK SetupToolBar(TEXT("Num.bmp"), 10); // サンプル実行フォルダの4BPPのビットマップを使用する DxLib::AddToolBarButton(TOOLBUTTON_TYPE_NORMAL, TOOLBUTTON_STATE_ENABLE, 0, 100); DxLib::AddToolBarSep(); DxLib::AddToolBarButton(TOOLBUTTON_TYPE_CHECK, TOOLBUTTON_STATE_ENABLE, 1, 101); DxLib::AddToolBarButton(TOOLBUTTON_TYPE_CHECK, TOOLBUTTON_STATE_ENABLE, 2, 102); DxLib::AddToolBarButton(TOOLBUTTON_TYPE_CHECK, TOOLBUTTON_STATE_ENABLE, 3, 103); #endif int PosX = 0, AccelX = 2; int R = 0, G = 0, B = 0; while (ProcessMessage() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)) { #if TOOLBAR_BLOCK if (GetToolBarButtonState(100)) { AccelX = -AccelX; } R = GetToolBarButtonState(101) ? 255 : 0; G = GetToolBarButtonState(102) ? 255 : 0; B = GetToolBarButtonState(103) ? 255 : 0; #endif ClearDrawScreen(); DrawCircle(PosX + 10, 20, 10, GetColor(R, G, B)); PosX = (PosX + AccelX + 300) % 300; ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: ツールバーを使用したプログラムの不具合 ( No.1 )
名前:管理人 日時:2021/10/31 17:22

> 1.ツールバーが表示されない > 2.最大化ボタンが無効となっている > 4.ウィンドウサイズの縦方向が自動補正される すみません、バグです 修正版をアップしましたので、よろしければお試し下さい m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) また、ツールバー機能は Direct3D 11 を使用した場合は正常に動作しませんので、 DxLib_Init の呼び出し前の行に SetUseDirect3DVersion( DX_DIRECT3D_9EX ); という記述を追加して、Direct3D 9 を使用するようにしてください m(_ _;m > 3.最大化ボタンを押すと設定ウィンドウサイズの最大サイズを越える こちらは仕様となります ( 最大化ボタンはどんなソフトでも『デスクトップ一杯にウィンドウを大きくする』動作なので… ) SetWindowMaximizeButtonBehavior( 1 ); を実行することで最大化ボタンを押しても 自動では最大化されないようになりますので、もしデスクトップ一杯に最大化されたくない、 とのことでしたら、SetWindowMaximizeButtonBehavior( 1 ); を実行した上で、 最大化ボタンが押されたかどうかを CheckWindowMaximizeButtonInput でチェックして、 押されていたら SetWindowSize でウィンドウを希望のサイズに変更する、といった処理を 組んでみて下さい m(_ _)m // メインウインドウの最大化ボタンが押されたかどうかを取得する // ( SetWindowMaximizeButtonBehavior( 1 ); が実行されている場合のみ有効な関数 ) // 引数: StateResetFlag TRUE = 押された状態をリセットする FALSE = 押された状態をリセットしない int CheckWindowMaximizeButtonInput( int StateResetFlag = TRUE ) ;
メンテ
Re: ツールバーを使用したプログラムの不具合 ( No.2 )
名前:紺帽子 日時:2021/11/01 19:50

修正版を使用し、SetUseDirect3DVersion(DX_DIRECT3D_9EX);を追加してツールバーが正常に働くことを確認しました。 ウィンドウは、最大化ボタンを有効にしているときはウィンドウの最大サイズを制限しないという方針に落ち着きました。 SetWindowMaximizeButtonBehavior関数とCheckWindowMaximizeButtonInput関数も試してみましたが サイズを元に戻す動作やアイコンの変更、最大化ボタンを押した後のウィンドウの位置をどうするかという問題がでたことと デフォルトの動作と異なると違和感が強いため前述の方法を取りました。 ツールバーの問題からは離れてしまいますがウィンドウ関連で気になる点があります。 下記のコードを実行したときに起こることです。 1. SetGraphMode関数で指定したサイズにウィンドウの拡大が制限されていても、最大化ボタンを押すとやはり最大化します。 DirectX9を使用し、ウィンドウの拡大縮小を許可しているときは、 描画領域の指定サイズを超えた部分に背景色が適用されず、黒い無効領域と先ほどまでの描画内容が残ってしまいます。 バックバッファのサイズをデスクトップ領域と同じサイズを使用すれば気にならないので一応報告ということで。 2. SetWindowSizeChangeEnableFlag(TRUE, FALSE); をコメントアウトすると 描画が縮小されることと、最大化したとき描画位置がずれます。 #include "DxLib.h" int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { SetUseDirect3DVersion(DX_DIRECT3D_9EX); SetGraphMode(640, 480, 32); // バックバッファのサイズ SetWindowStyleMode(7); // 最大化ボタンを有効化 SetWindowSizeChangeEnableFlag(TRUE, FALSE); // ウィンドウの拡大縮小を許可する ChangeWindowMode(TRUE); // ウィンドウモード SetWindowSize(320, 240); // ウィンドウの初期サイズ SetBackgroundColor(128, 128, 128); // 背景を灰色にする if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); int PosX = 0; int GrHandle = LoadGraph(TEXT("Src1.bmp")); // サンプルプログラム実行用フォルダの画像(256x256)を使用 while (ProcessMessage() == 0) { ClearDrawScreen(); DrawGraph(0, 0, GrHandle, FALSE); DrawCircle(PosX, 15, 15, GetColor(255, 0, 0)); PosX = (PosX + 2) % 300; ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: ツールバーを使用したプログラムの不具合 ( No.3 )
名前:紺帽子 日時:2021/11/02 20:49

もうひとつ疑問が生じました。 ウィンドウの拡大許可と、タイトルバーなしのウィンドウスタイルを組み合わせたとき上部に細い白いバーが表示されます。 これは消すことができないのでしょうか? #include "DxLib.h" int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { SetWindowStyleMode(1); // 1, 2, 4 の タイトルバーなしのスタイルを使用する SetWindowSizeChangeEnableFlag(TRUE, FALSE); // ウィンドウの拡大縮小を許可する ChangeWindowMode(TRUE); SetBackgroundColor(128, 128, 128); if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)) { ClearDrawScreen(); ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: ツールバーを使用したプログラムの不具合 ( No.4 )
名前:管理人 日時:2021/11/03 06:13

> 1. > SetGraphMode関数で指定したサイズにウィンドウの拡大が制限されていても、最大化ボタンを押すとやはり最大化します。 >  > 2. > SetWindowSizeChangeEnableFlag(TRUE, FALSE); をコメントアウトすると > 描画が縮小されることと、最大化したとき描画位置がずれます。 最大化ボタンはオマケ機能みたいなもので、基本的に最大化ボタンは SetGraphMode にデスクトップと同じサイズが設定されて 起動していることを前提としていますので、仕様とさせていただきます m(_ _;m > ウィンドウの拡大許可と、タイトルバーなしのウィンドウスタイルを組み合わせたとき上部に細い白いバーが表示されます。 > これは消すことができないのでしょうか? こちらはOSの仕様のようです ウィンドウのサイズを変更できる設定にすると必ず表示されてしまうので、消すことはできません
メンテ
Re: ツールバーを使用したプログラムの不具合 ( No.5 )
名前:紺帽子(解決) 日時:2021/11/03 20:31

疑問が解消されました。 対応ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存