トップページ > 記事閲覧
マウスの場所を取得したい
名前:クラウス 日時: 2018/02/12 23:22

初めて投稿させて頂きます。 クラウスと申します。 マウスの位置をGetMousePointで取得したのですが、 やる度に位置がずれているので、 ScreenToClientでウインドウのハンドルと紐付けを行ってウインドウの位置を固定化したかったのですが、 ちょっとやり方がわからずにいます。 ソースは以下に記載致しました。 出来ればウインドウの位置を左上を(0.0)と設定した上で、 位置を取得したいのですがどうしたらよろしいでしょうか。 左上の位置はともかくウインドウの位置を取得して、 system_btn_01.pngを押した際に画面を移動させれる様にしたいです。 ----------------------------------------------------------------------------------------------------- #include <windows.h> #include "DxLib.h" bool System_flag = false; int MouseX, MouseY; POINT MousePoint; HWND hWnd; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { unsigned int cEnter = 0; bool sFlag = false; // ウィンドウモードに設定 ChangeWindowMode(TRUE); // ウィンドウサイズ設定 SetWindowSize(1024, 768); // DXライブラリ初期化 if (DxLib_Init() == -1) return -1; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // マウスを表示状態にする SetMouseDispFlag(TRUE); // マウスカーソルのスクリーン座標を取得 GetCursorPos(&MousePoint); // スクリーン座標を指定のウインドウのクライアント領域での座標に変換 ScreenToClient(hWnd, &MousePoint); while (1) { // タイトル表示 LoadGraphScreen(-200, 0, "Title.bmp", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if (sFlag == false) { // 文字列の描画 DrawString(270, 350, "Please Enter", cEnter); // 裏画面の内容を表画面に反映させる ScreenFlip(); sFlag = true; // 1秒待ち // WaitTimer(1000); } else { // 裏画面の内容を表画面に反映させる ScreenFlip(); sFlag = false; // 1秒待ち // WaitTimer(1000); } if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = true; break; } else { // 押されていない } } while (1) { if (System_flag == true) { // 画面に描かれているものを一回全部消す ClearDrawScreen(); // 画面にウインドウを表示 LoadGraphScreen(0, 388, "Window.bmp", FALSE); LoadGraphScreen(0, 347, "name.bmp", FALSE); LoadGraphScreen(542, 388, "system_btn_01.png", FALSE); LoadGraphScreen(542, 413, "system_btn_02.png", FALSE); LoadGraphScreen(542, 438, "system_btn_03.png", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // マウスの位置を取得 GetMousePoint(&MouseX, &MouseY); if (MouseX > 306 && MouseX < 406) { if (MouseY > 314 && MouseY < 414) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = false; break; } } } } else { // 画面にウインドウを表示 LoadGraphScreen(-200, 0, "menu.jpg", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = true; break; } } // Windows システムからくる情報を処理する if (ProcessMessage() == -1) break; // ESCキーが押されたらループから抜ける if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break; } // ソフトの終了 return 0; } -----------------------------------------------------------------------------------------------------
メンテ

Page: 1 |

Re: マウスの場所を取得したい ( No.1 )
名前:管理人 日時:2018/02/13 00:50

> 出来ればウインドウの位置を左上を(0.0)と設定した上で、 > 位置を取得したいのですがどうしたらよろしいでしょうか。 ウィンドウのサイズ設定に SetWindowSize を使用されていますが、こちらを SetGraphMode に変更してみてください // ウィンドウサイズ設定 SetWindowSize(1024, 768);     ↓ // ウィンドウサイズ設定 SetGraphMode(1024, 768, 32); これで GetMousePoint で取得できる座標がウィンドウのクライアント領域の左上の位置を(0,0)としたものになります
メンテ
Re: マウスの場所を取得したい ( No.2 )
名前:管理人 日時:2018/02/18 23:46

> ですが、GetMousePointで取得できる値が定まらず、 > -になることがあります。 ウィンドウより左側や上側にマウスカーソルがある場合に GetMousePoint で 取得できる値がマイナスになるのは正常な動作です > hWndをウインドウとリンクしていないのかと思うのですが、 > ウインドウとリンクさせるにはどうしたらいいでしょうか? // DXライブラリ初期化 if (DxLib_Init() == -1) return -1; の後に hWnd = GetMainWindowHandle(); という記述を追加すれば hWnd とウィンドウをリンクさせることができます
メンテ
Re: マウスの場所を取得したい ( No.3 )
名前:クラウス 日時:2018/02/18 23:51

管理人様 ご回答ありがとうございます。 度々の質問で申し訳ないのですが、 SetGraphModeに変更致しました。 ですが、GetMousePointで取得できる値が定まらず、 -になることがあります。 hWndをウインドウとリンクしていないのかと思うのですが、 ウインドウとリンクさせるにはどうしたらいいでしょうか? また、テキストを読み込んで表示したいのですが、 DrawStringで表示がされていないようです。 何故なのでしょうか? やりたいこととしては以下になります。 @スタート画面(クリックで次画面) Aボタン配置&テキスト読み込み B画面上のボタンクリック  →ボタンクリック判定 別画面に移動  →ボタン外      次シナリオ表示 以上、よろしくお願い致します。 ----------------------------------------------------------------------------------------------------- #include <windows.h> #include "DxLib.h" bool System_flag = false; int MouseX, MouseY; POINT MousePoint; HWND hWnd; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { unsigned int cEnter = 0; // スタートフラグ bool sFlag = false; // システムフラグ int text_row = 0; // 行カウント char text[256][256]; // 読み込みテキスト int page_counter = 0; // ページ数カウント int font_size = 18; // フォントサイズ double line_height = 1.73; // 行の高さ int text_x = 5; // テキスト表示開始位置(x) int text_y = 630; // テキスト表示開始位置(y) int shadow_color[] = { 5, 5, 5 }; // 影色 int font_color[] = { 230, 230, 230 }; // 文字色 // 文字色を取得 int font_color_dx = GetColor(font_color[0], font_color[1], font_color[2]); // 影色を取得 int shadow_color_dx = GetColor(shadow_color[0], shadow_color[1], shadow_color[2]); // ウィンドウモードに設定 ChangeWindowMode(TRUE); // ウィンドウサイズ設定 SetGraphMode(1024, 768, 32); // DXライブラリ初期化 if (DxLib_Init() == -1) return -1; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // マウスを表示状態にする SetMouseDispFlag(TRUE); // マウスカーソルのスクリーン座標を取得 //GetCursorPos(&MousePoint); // スクリーン座標を指定のウインドウのクライアント領域での座標に変換 //ScreenToClient(hWnd, &MousePoint); while (1) { // タイトル表示 LoadGraphScreen(-200, 0, "Title.png", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if (sFlag == false) { // 文字列の描画 DrawString(512, 384, "Please Enter", cEnter); // 裏画面の内容を表画面に反映させる ScreenFlip(); sFlag = true; // 1秒待ち // WaitTimer(1000); } else { // 裏画面の内容を表画面に反映させる ScreenFlip(); sFlag = false; // 1秒待ち // WaitTimer(1000); } if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); // 読み込むファイル名 int file_handler = FileRead_open("シナリオ.txt"); // ファイル読み込み while (FileRead_eof(file_handler) == 0 && text_row < 256) { FileRead_gets(text[text_row], 256, file_handler); text_row++; } // ファイルを閉じる FileRead_close(file_handler); System_flag = true; break; } else { // 押されていない } } while (1) { if (System_flag == true) { // 画面に描かれているものを一回全部消す ClearDrawScreen(); // 画面にウインドウを表示 LoadGraphScreen(0, 625, "Window.bmp", FALSE); LoadGraphScreen(0, 585, "name.bmp", FALSE); LoadGraphScreen(815, 620, "system_btn_01.png", FALSE); LoadGraphScreen(815, 670, "system_btn_02.png", FALSE); LoadGraphScreen(815, 720, "system_btn_03.png", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // マウスの位置を取得 GetMousePoint(&MouseX, &MouseY); if (MouseX > 306 && MouseX < 406) { if (MouseY > 314 && MouseY < 414) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = false; break; } } else { // 文字列の描画 for (int row = 0; row <= page_counter; row++) { int x = text_x; int y = (int)(text_y + ((font_size * line_height) * row)); DrawString(x, y, text[row], font_color_dx); } } } } else { // 画面にウインドウを表示 LoadGraphScreen(-200, 0, "menu.jpg", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = true; break; } } // Windows システムからくる情報を処理する if (ProcessMessage() == -1) break; // ESCキーが押されたらループから抜ける if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break; } // ソフトの終了 return 0; }
メンテ
Re: マウスの場所を取得したい ( No.4 )
名前:管理人 日時:2018/02/19 00:59

> また、テキストを読み込んで表示したいのですが、 > DrawStringで表示がされていないようです。 > 何故なのでしょうか? プログラムを拝見しただけでは原因はわかりませんでした ただ、左クリックしている間のみ文字列が描画されるようになっているのが少し気になりました こちらは意図した動作なのでしょうか? ともあれ、実際に実行しながら原因を調べた方がより正確なご返答ができると思いますので、 お手数で申し訳ありませんがプログラムの実行に必要なファイル( シナリオ.txt や Window.bmp, system_btn_01.png など )を どこかのアップローダーにアップしていただけないでしょうか?
メンテ
Re: マウスの場所を取得したい ( No.5 )
名前:クラウス 日時:2018/02/19 23:50

早々の回答ありがとうございます。 以下よろしくお願い致します。 1.クリック位置の取得 2.ボタンでの画面表示 >ただ、左クリックしている間のみ文字列が描画されるようになっているのが少し気になりました >こちらは意図した動作なのでしょうか? その通りです。 >ともあれ、実際に実行しながら原因を調べた方がより正確なご返答ができると思いますので、 >お手数で申し訳ありませんがプログラムの実行に必要なファイル( シナリオ.txt や Window.bmp, system_btn_01.png など )を >どこかのアップローダーにアップしていただけないでしょうか? 以下にアップロードしました。 禁止されていたので頭に必要な物をつけてください。 「://fast-uploader.com/file/7074606796632/」PASSは1591です。
メンテ
Re: マウスの場所を取得したい ( No.6 )
名前:管理人 日時:2018/02/20 00:56

ファイルをアップしていただきありがとうございます > DrawStringで表示がされていないようです。 > 何故なのでしょうか? 原因がわかりました、こちらの ScreenFlip の実行を DrawString の前に実行してしまっているのが原因です // 裏画面の内容を表画面に反映させる ScreenFlip(); ScreenFlip を実行する位置を移動して以下のようにしたところ DrawString の表示がされるようになりました if (System_flag == true) { // 画面に描かれているものを一回全部消す ClearDrawScreen(); // 画面にウインドウを表示 LoadGraphScreen(0, 625, "Window.bmp", FALSE); LoadGraphScreen(0, 585, "name.bmp", FALSE); LoadGraphScreen(815, 620, "system_btn_01.png", FALSE); LoadGraphScreen(815, 670, "system_btn_02.png", FALSE); LoadGraphScreen(815, 720, "system_btn_03.png", FALSE); if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { // マウスの位置を取得 GetMousePoint(&MouseX, &MouseY); if (MouseX > 306 && MouseX < 406) { if (MouseY > 314 && MouseY < 414) { // test.mid PlayMusic("decision1.mp3", DX_PLAYTYPE_NORMAL); System_flag = false; break; } } else { // 文字列の描画 for (int row = 0; row <= page_counter; row++) { int x = text_x; int y = (int)(text_y + ((font_size * line_height) * row)); DrawString(x, y, text[row], font_color_dx); } } } // 裏画面の内容を表画面に反映させる ScreenFlip(); } else { > 以下よろしくお願い致します。 > 1.クリック位置の取得 クリック位置は GetMousePoint で取得できます > 2.ボタンでの画面表示 ・・・? すみません、何をされたいのかもう少し詳しく教えていただけますでしょうか?
メンテ
Re: マウスの場所を取得したい ( No.7 )
名前:クラウス 日時:2018/07/17 23:51

ご無沙汰しております。 試用期限が切れとなって再度アカウントを入力する事で続けて利用できることを最近知りました。 仕事等の都合で時間が出来たので再開しました。 やりたい事は以下になります。 1.オープニング(仮)画面表示→左クリックでゲーム画面移行 2.ゲーム画面のパーツ読み込み、シナリオ読み込み 3.ゲーム画面で左クリックをする事でシナリオを読み込んで表示 ※念のため再度必要なcppと画像は期限は1週間で以下にアップロードいたしました。 「://fast-uploader.com/file/7087394460410/」PASSは1591です。 >原因がわかりました、こちらの ScreenFlip の実行を DrawString の前に実行してしまっているのが原因です > > // 裏画面の内容を表画面に反映させる > ScreenFlip(); > >ScreenFlip を実行する位置を移動して以下のようにしたところ DrawString の表示がされるようになりました ありがとうございます。 文字が表示されました。 疑問なのですが、左クリックをした時のみ文字が表示されているのですが、 常時表示し、 押した後には改行まで読み込み入力待ちにするにはどうしたらいいでしょうか? 今 :松ぼっくり「\コンニチワ/」※これはテストです。(左クリック1回目) 希望:松ぼっくり「\コンニチワ/」          (左クリック1回目)    ※これはテストです。              (左クリック2回目) 以上、よろしくお願い致します。
メンテ
Re: マウスの場所を取得したい ( No.8 )
名前:管理人 日時:2018/07/18 01:02

> 疑問なのですが、左クリックをした時のみ文字が表示されているのですが、 > 常時表示し、 > 押した後には改行まで読み込み入力待ちにするにはどうしたらいいでしょうか? 現在はボタンの入力に応じて徐々に文章を出す、という処理の基礎的な部分がない状態ですので よろしければサンプルプログラムページの <DXライブラリ サンプルプログラム> https://dxlib.xsrv.jp/dxprogram.html 6.サウンドノベル風文字列描画基本 20.サウンドノベル風文字列描画、テキストバッファ使用バージョン 20−2.サウンドノベル風文字列描画、半角文字対応+テキストバッファ使用バージョン のプログラムをご覧になってみてください、文字を徐々に表示しながら、キー入力待ちなどもするプログラムのサンプルとなっています m(_ _)m
メンテ
Re: マウスの場所を取得したい ( No.9 )
名前:クラウス 日時:2019/02/17 23:49

ご無沙汰しております。 ボタンの入力に応じて徐々に文章を出す、という処理の基礎的な部分も勉強させて頂いてます。 今ファイル分割しています。 初期画面は出るのですが、 Main.cppからFlame.cppを呼び出してSystem_flag = trueにしているのですが、 Flame_Drawから出た際にまたfalseに戻ってきてしまっています。 System_flagの値を維持するにはどうしたらいいでしょうか? ★やりたい事 1.Main.cppからFlame.cpp等の呼び出し 2.Flame.cppからMain.cppに戻った際に値の維持を行う。 3.オープニング画面からメッセージウインドウ画面へ移動 ★ファイル ttp://whitecats.dip.jp/up/download/1550414827/attach/1550414827.zip 合言葉:dxlib パスワード:1591 sample.cpp ============================================================================================= #include "DxLib.h" #include "Flame.h" #include "Graphic.h" #include "Effect.h" HWND hWnd; bool System_flag = false; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { unsigned int cEnter = 0; // スタートフラグ // ウィンドウモードに設定 ChangeWindowMode(TRUE); // ウィンドウサイズ設定 SetGraphMode(1024, 768, 32); // DXライブラリ初期化 if (DxLib_Init() == -1) return -1; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); SetDrawScreen(DX_SCREEN_BACK); Flame_Initialize(); //フレーム初期化 Graphic_Initialize(); //画像初期化 Effect_Initialize(); //エフェクト初期化 while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { Flame_Update(System_flag); //フレーム計算 Graphic_Update(System_flag); //画像的計算 Effect_Update(System_flag); //エフェクト計算 Flame_Draw(System_flag); //フレーム描画 Graphic_Draw(System_flag); //画像的描画 Effect_Draw(System_flag); //エフェクト描画 } DxLib_End(); return 0; } ============================================================================================= Flame.cpp ============================================================================================= #include "DxLib.h" unsigned int cEnter = 0; void Flame_Initialize() { } int Flame_Update(bool System_flag) { return 0; } int Flame_Draw(bool System_flag) { if (System_flag == true) { // 画面にウインドウを表示 LoadGraphScreen(0, 0, "back.png", FALSE); LoadGraphScreen(0, 625, "Window.bmp", FALSE); LoadGraphScreen(0, 585, "name.bmp", FALSE); LoadGraphScreen(815, 620, "system_btn_01.png", FALSE); LoadGraphScreen(815, 670, "system_btn_02.png", FALSE); LoadGraphScreen(815, 720, "system_btn_03.png", FALSE); } else { // タイトル表示 LoadGraphScreen(-200, 0, "Title.png", FALSE); // 裏画面の内容を表画面に反映させる ScreenFlip(); // 文字列の描画 DrawString(512, 384, "Please Enter", cEnter); // 裏画面の内容を表画面に反映させる ScreenFlip(); System_flag = true; // 1秒待ち // WaitTimer(1000); } return 0; } =============================================================================================
メンテ
Re: マウスの場所を取得したい ( No.10 )
名前:とある名無し 日時:2019/02/18 17:29

> System_flagの値を維持するにはどうしたらいいでしょうか? 1. main にて System_flag を以下のように代入します。 System_flag = Flame_Draw(System_flag); 2. Flame_Draw 内で戻り値の設定をします return 0; を return System_flag; に変更。 これで System_flag が true に変更され維持できます。
メンテ
Re: マウスの場所を取得したい ( No.11 )
名前:C-- 日時:2019/03/03 23:10

Flame_Update(System_flag); を実行しても、関数側には「System_flagの値だけ」が届くので そこでいじっても元のSystem_flagは変わりません。 つまり、元に戻ってしまうのではなく、そもそも変わっていない、ということです。 方法としては @とある名無しさん が書かれているように、関数の戻り値で更新する の他には Aextern宣言をして他のファイルから読み書きできるようにする(この場合、System_flagは引数から削除しましょう) B参照渡し(アドレス渡し)にする などがあります。ABはお調べください。
メンテ

Page: 1 |

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

   クッキー保存