2018年05月18日
《その390》ポインタ位置・マウスの動作 を取得
ポインタ位置・マウスの動作 を取得
前回《389》は、マウスボタンの状態だけの取得でしたが、今回は、ポインタ位置の取得も行います。
ポインタが「moving」か「stopped」かも表示するので、例えば、「pressed」と「moving」が同時に表示されていれば ドラッグ中ということになります。
アプリをスタートしました。
ポインタが Page 内を動いています。2つの数値は X-Y座標です。
ポインタが停止しました。
マウスボタンが押されています。
ドラッグ中です。
クリックしました。
クリックが成立したあと、ポインタが動いています。
ダブルクリックしました。
ダブルクリックが成立したあと、ポインタが動いています。
ポインタが Page外に出ました。
ポインタが Page内に入って、動いています。
以下は、MainPage.xaml.cpp です。
//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//
#include "pch.h"
#include "MainPage.xaml.h"
using namespace App9;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
MainPage::MainPage()
{
InitializeComponent();
// タイマーのスタート
StartTimer();
}
// click_interval
// (click_intervalミリ秒以内ならばダブルクリックと判断)
const int click_interval = 500; // millisecond
int double_clicked = 0; // ダブルクリックのとき 1
int last_clicked_time = 0; // 直前のクリック時刻
int pointer_exited = 0; // ポインタが Page外のとき 1
// 位置
float x = 0;
float y = 0;
// マウスボタンが押されたときのイベントハンドラ
void App9::MainPage::
Page_PointerPressed(Platform::Object^ sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
// マウスボタンが押された時刻の取得
SYSTEMTIME syst;
GetSystemTime(&syst);
int current = syst.wSecond * 1000 + syst.wMilliseconds;
// クリックの間隔が tsミリ秒より大きいなら
// ダブルクリックではありません。
if (current - last_clicked_time > click_interval) {
double_clicked = 0;
// mouse-button pressed
box1->Text = "pressed";
}
// クリックの間隔が tsミリ秒以下なら
// ダブルクリックです。
else {
double_clicked = 1;
// mouse-button double-clicked
box1->Text = "double_clicked";
}
last_clicked_time = current;
}
// マウスボタンが解放されたときのイベントハンドラ
void App9::MainPage::
Page_PointerReleased(Platform::Object^ sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
// ダブルクリックでないときは、
// マウスボタンが解放された時点
// で クリック が成立します。
if (!double_clicked) {
// mouse-button clicked
box1->Text = "clicked";
}
}
// ポインタが動いているときのイベントハンドラ
void App9::MainPage::
Page_PointerMoved(Platform::Object^ sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
box2->Text = "moving";
auto pt = e->GetCurrentPoint(this);
x = pt->Position.X;
y = pt->Position.Y;
box3->Text = ((int)x).ToString();
box4->Text = ((int)y).ToString();
}
// タイマーのスタート
void MainPage::StartTimer() {
auto timer = ref new Windows::UI::Xaml::DispatcherTimer();
TimeSpan span;
span.Duration = 10000;
timer->Interval = span;
timer->Start();
auto rcpt
= timer->Tick +=
ref new EventHandler<Object^>(this, &MainPage::OnTick);
}
// タイマー ON のときの作業
void MainPage::OnTick(Object^ sender, Object^ e) {
if (!pointer_exited)
box2->Text = "stopped";
}
// ポインタが Page外に出たときのイベントハンドラ
void App9::MainPage::
Page_PointerExited(Platform::Object^ sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
pointer_exited = 1;
box1->Text = "";
box2->Text = "pointer_exited";
box3->Text = "";
box4->Text = "";
}
// ポインタが Page内に入ったときのイベントハンドラ
void App9::MainPage::
Page_PointerEntered(Platform::Object^ sender,
Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e)
{
pointer_exited = 0;
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7671513
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック