2013-08-07 13 views
5

は私がやり続ける、以下:lParamをPOINTに変換する便利な関数がwin32(windows.h)にありますか?

LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { 
    mouse.x = LOWORD(lParam); 
    mouse.y = HIWORD(lParam); 
    // ... 
    return 0; 
} 

私は私のためにPointLOWORD(lParam)HIWORD(lParam)を変換する便利な方法がありますかしら?だから私はmouse = ToPoint(lParam)のような何かをすることができますか?

答えて

6

ありませんが、あなた自身をロールバックするのは簡単だろう:直接

POINT ToPoint(LPARAM lParam) 
{ 
    POINT p={GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)}; 

    return p; 
} 
+3

'WM_MOUSEMOVE'のドキュメントには、' LOWORD'/'HIWORD'は座標を取得するべきではないことが明確に述べられています。 –

+1

ここで私は、人々がドキュメントを読むのが面倒すぎるので、苦労して得た報酬を費やしています。誤解を招くようなアドバイスを単に削除していただければ幸いです。 – IInspectable

+0

正しいマクロを使用するために私の答えが更新されました。 –

1

ないが、そこGET_X_LPARAM()であり、Y.

+1

はい、これは 'WM_MOUSEMOVE'のドキュメントに明記されています。 'MAKEPOINTS()'マクロもあります。 –

+0

@RemyLebeauドキュメンテーションは、MAKEPOINTSがPOINT構造体へのポインタを返すと述べています。私はこのポインタを使った後に 'free()'しなければなりませんか? – bodacydo

+0

@bodacydo:ドキュメントをもう一度注意深く読んでください。 'MAKEPOINTS()'はポインタを返さず、ドキュメントはそれがそうであると言っていません。 'MAKEPOINTS()'は 'POINTS point = MAKEPOINTS(lParam);'の代わりに実際の 'POINTS'構造体を返します。 –

5

CPoint p(lParam);

+0

私はdownvotesを理解しているかわかりません...あなたは、CPARのための便利なコンストラクタは、LPARAMを正しいx/yコンポーネントに変換することを認識していますか?そして、そのCPointはPOINTの単なるラッパーにすぎませんか? – mark

+2

はい、私たちは結びついています、ありがとうございます。しかし、問題はMFCではなくタグ付きのwinapiであるため、私は質問に対処しないので、私はdownvoteに自由を取った。あなたが単純に無回答を削除し、私があなたに費やさなければならなかった評判を返すだけであれば、新たに得られた洞察力で私は感謝します。 – IInspectable

+0

さて、1)OPはPOINTやCPointを意味するかどうかはっきりしていなかったPointについて尋ねられました.2)OnMouseMoveの使用はATLの使用を示唆しました。 Microsoftでは、「CPoint」は「MFCとATLによって共有されるクラス」にあるため、有効な提案のようです。 – mark

10

使用GET_X_LPARAM()ように使用CPoint、のために対応、またはMAKEPOINTS()のように、WM_MOUSEMOVE documentationは:

水平および垂直位置を取得するために、次のコードを使用:

XPOS = GET_X_LPARAM(lParamに)。

yPos = GET_Y_LPARAM(lParam);

上記のように、x座標は下位の短いの戻り値にあります。 y座標は上位短くです(両方ともの値を表しています。複数のモニターを持つシステムでは負の値を取る可能性があるからです)。戻り値が変数に割り当てられている場合は、MAKEPOINTSマクロを使用して戻り値からPOINTS構造体を取得できます。 GET_X_LPARAMまたはGET_Y_LPARAMマクロを使用して、x座標またはy座標を抽出することもできます。これらのマクロは、複数のモニタを備えたシステムで誤った結果を返すので

重要は、カーソル位置のx座標とy軸座標を抽出するためにLOWORDまたはHIWORDマクロを使用しないでください。複数のモニタを持つシステムは、負のx座標とy座標を持つことができます。LOWORDHIWORDは、座標を符号なし量として扱います。

+0

うわー...私はLOWORDとHIWORDを使わないことを知らなかった。 GET_X_LPARAMとGET_Y_LPARAMを使用するようにコードを変換しました。ありがとう! – bodacydo

+0

@bodacydo 'WM_MOUSEMOVE'メッセージでは、' LOWORD'/'HIWORD'の問題は決してクライアント座標として渡されるので、決して明らかになりません。そのようなものとして、決してゼロより小さくなることはありません。 ['SetCapture'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646262.aspx)を使用するまで、突然事態が奇妙になります。 @レミ私が引用した文書は不正確だと思います。特に、ウィンドウの位置に関係なく、クライアント座標は常に> = 0です。どう思いますか? – IInspectable

+0

@Tim:座標は、メッセージを受け取るウィンドウのクライアント領域を基準にしています。キャプチャ中に負の座標を報告することができます。マウスがキャプチャウィンドウの左および/または上に移動すると、ウィンドウがマウスをキャプチャし、負の座標を受け取ることができます。自分で試してみてください。任意のUIコントロールを取り、 'WM_LBUTTONDOWN'に対して' SetCapture() 'を呼び出し、' WM_LBUTTONUP'に対して 'ReleaseCapture()'を呼び出し、 'WM_MOUSEMOVE'が受け取る座標を記録します。これを実行し、コントロール上のマウスの左ボタンを押したまま、マウスをコントロールの外側に動かします。 –

関連する問題