トップページ > 記事閲覧
SetMouseDispFlagの仕様
名前:8127 日時: 2018/08/09 15:41

毎度毎度お世話になっています。 現在、SetMouseDispFlagでマウスポインタを隠す処理は、 マウスポインタが「Dxlibで管理しているウィンドウの中 or タイトルバー」にある場合に発生しますが、 この挙動を以下のように変更する関数を実装していただくことは可能ですか? (1) マウスポインタがDxlibで管理しているウィンドウの中にあるときだけ隠され、タイトルバーにかかっているときは表示する ※ソフトの終了(右上の[x])を押したいときにマウスポインタが見えないと不便なので(1)の挙動がデフォルトでもいい気がします。 (2) マウスポインタの位置に関わらず常に非表示にする #define TEKITOUNA_MACRO_0 0 //従来の挙動にする #define TEKITOUNA_MACRO_1 1 //(1)の挙動にする #define TEKITOUNA_MACRO_2 2 //(2)の挙動にする void SetMouseDispMode(int mode)
メンテ

Page: 1 |

Re: SetMouseDispFlagの仕様 ( No.1 )
名前:管理人 日時:2018/08/10 01:02

SetMouseDispFlag のご要望了解しました ところで > (2) > マウスポインタの位置に関わらず常に非表示にする は、デスクトップ上のどこにマウスカーソルがあっても非表示にするということでしょうか? 仮にそうだとしますと、OS の仕様の関係でマウスカーソルがウィンドウの外側にある場合は ソフト側の制御から外れるので、カーソルを非表示にすることはできません…
メンテ
Re: SetMouseDispFlagの仕様 ( No.2 )
名前:8127 日時:2018/08/10 16:19

管理人様、 ご返信ありがとうございます。 >デスクトップ上のどこにマウスカーソルがあっても非表示にするということでしょうか? その意図でしたが、OSの仕様で不可能なのですね・・・ もともと以下のようなサンプルで、マウスポインタを画面外に出せない処理を実現したかったのですが マウスポインタを画面内に戻す際、一瞬だけ画面の外側にポインタが映ってしまうのが気に食わないのです・・・ #include <algorithm> #include "DxLib.h" namespace { constexpr int windowWidth = 640; constexpr int windowHeight = 480; } bool dxlibInit() { ChangeWindowMode(TRUE); //ウインドウモードにする SetWindowSize(windowWidth, windowHeight); // DXライブラリ初期化処理 if (DxLib_Init() == -1) { return false; } SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定 return true; } void draw(int x, int y) { ClearDrawScreen(); DrawString(100, 100, "画面からポインタが出せないサンプル\n(上方向から出せます)\n[ESC]で終了", GetColor(255, 255, 255)); DrawString(x, y, "x", GetColor(255, 0, 0)); } std::pair<int, int> bindMouse() { int x, y, xNew, yNew; GetMousePoint(&x, &y); xNew = std::clamp(x, 0, windowWidth - 1); #undef min yNew = std::min({ y, windowHeight - 1 }); if (x != xNew || y != yNew)SetMousePoint(xNew, yNew); return { xNew, yNew }; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if (!dxlibInit()) { // エラーが起きたら直ちに終了 return 1; } SetMouseDispFlag(FALSE); while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { const auto[x, y] = bindMouse(); draw(x, y); ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: SetMouseDispFlagの仕様 ( No.3 )
名前:管理人 日時:2018/08/12 02:20

> もともと以下のようなサンプルで、マウスポインタを画面外に出せない処理を実現したかったのですが > マウスポインタを画面内に戻す際、一瞬だけ画面の外側にポインタが映ってしまうのが気に食わないのです・・・ 少し調べてみたところ、ClipCursor という Win32API を使用することでマウスポインタの移動を制限できそうです <ClipCursor> https://msdn.microsoft.com/ja-jp/library/cc410663.aspx あと、すみません、明日は保留しっぱなしの中規模案件を進めたいと思いますので、(1)の対応は 後日とさせてください m(_ _;m
メンテ
Re: SetMouseDispFlagの仕様 ( No.4 )
名前:8127 日時:2018/08/13 00:57

管理人さま、 ご情報ありがとうございます。ClipCursorを使ってみます。 >あと、すみません、明日は保留しっぱなしの中規模案件を進めたいと思いますので、(1)の対応は >後日とさせてください m(_ _;m 対応の検討ありがとうございます。いつも通り急いでいませんので 比較的余力のあるときにお願いします。
メンテ
Re: SetMouseDispFlagの仕様 ( No.5 )
名前:管理人 日時:2018/08/16 01:59

お待たせしました、(1)の対応ができましたので、よろしければお試しください 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.2 用 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 // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) (1)の対応、というより何方にとってもタイトルバーにある間は表示されていたほうが良いと思うので、 SetMouseDispMode は実装せず、SetMouseDispFlag( FALSE ) ; をウィンドウモードで実行した際は ウィンドウのクライアント領域にマウスカーソルがある場合のみマウスカーソルを非表示にするようにしました
メンテ
Re: SetMouseDispFlagの仕様 ( No.6 )
名前:8127(解決) 日時:2018/08/16 02:19

管理人さま、 >(1)の対応、というより何方にとってもタイトルバーにある間は表示されていたほうが良いと思うので、 そうですよね、これでタイトルバーにかかっている場合はSetMouseDispFlag(TRUE) ;とするような不自然な分岐をせずに済みます いつもありがとうございます。
メンテ

Page: 1 |

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

   クッキー保存