トップページ > 記事閲覧
透過ウィンドウの移動
名前:てつ 日時: 2016/02/21 11:08

初めまして、プログラム初心者です。 透過ウィンドウに表示したモデルをデスクトップ上に自由にドラッグ移動させたいのですが、上手くできませんでした。 GetCursorPos(&MousePos); DxLib::SetWindowPosition(MousePos.x, MousePos.y); これだと、左端の原点部に一旦ズレてから移動するため、 GetCursorPos(&MousePos); GetMousePoint(&MouseX, &MouseY); DxLib::SetWindowPosition(MousePos.x - MouseX, MousePos.y - MouseY); としてみたのですが、 MousePos.xとMouseXが同値のようで動いてくれませんでした。 どうすれば、左端の原点部に一旦ズレずに移動できるでしょうか。 ご教示よろしくお願いいたします。
メンテ

Page: 1 |

Re: 透過ウィンドウの移動 ( No.1 )
名前:管理人 日時:2016/02/22 01:41

マウスの左ボタンが押された後の最初のループでカーソルとウインドウの座標を記憶しておいて、 以降のループではマウスの左ボタンが離されるまで『記憶しておいたカーソルの座標』と 『現在のカーソルの座標』との差分に『記憶しておいたウインドウの座標』を足したものを使って SetWindowPosition を実行するようにすると意図した挙動になると思います 透過ウインドウではありませんが、ウインドウのクライアント領域を左クリックで掴んで 移動することができるサンプルを組んでみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int StartFlag = FALSE ; POINT StartCursorPos ; int StartWinX, StartWinY ; POINT NowCursorPos ; ChangeWindowMode(TRUE); SetUseDirectInputFlag( FALSE ) ; if( DxLib_Init() == -1)return -1; SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // マウスの左ボタンが押されているかで分岐 if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) { // 左ボタンが押されていたら現在のカーソルの位置を取得 GetCursorPos( &NowCursorPos ) ; // 左ボタンが押されてから初めてのループかどうかで分岐 if( StartFlag == FALSE ) { // 左ボタンが押されてから初めてのループの場合 // 左ボタンが押されてから初めてのループかどうかをチェックするためのフラグを立てる StartFlag = TRUE ; // 左ボタンが押され始めた時のカーソルの位置とウインドウの位置を保存 StartCursorPos = NowCursorPos ; GetWindowPosition( &StartWinX, &StartWinY ) ; } else { // 左ボタンが押されてから初めてのループではない場合 // 左ボタンが押されてから初めてのループのときに保存しておいたカーソルの座標と、 // 現在のカーソルの座標の差分を左ボタンが押されてから初めてのループのときの // ウインドウの位置に足す SetWindowPosition( StartWinX + NowCursorPos.x - StartCursorPos.x, StartWinY + NowCursorPos.y - StartCursorPos.y ) ; } } else { // 左ボタンが押されてなかったら『左ボタンが押されてから初めてのループか // どうかをチェックするためのフラグ』を倒す StartFlag = FALSE ; } ScreenFlip() ; } DxLib_End() ; return 0 ; }
メンテ
Re: 透過ウィンドウの移動 ( No.2 )
名前:てつ(解決) 日時:2016/02/22 06:04

判りやすい説明付きのソースをありがとうございます。 ループ毎に初回値を取り直す必要があったのですね。 無事解決しました。
メンテ

Page: 1 |

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

   クッキー保存