こんにちは、現在 C++ で win32 アプリケーションを書いていますが、ウィンドウのコンテンツを拡大するのに本当に問題があります。ズームを行うために私が始めた疑似コードは次のとおりです。
// point One
int XPointOne = -200;
int YPointTwo = 0;
// point Two
int XPointTwo = 200;
int YPointTwo = 0;
// Draw point function.
DrawPoint(XCoordinate * ScalingFactor, YCoordinate * ScalingFactor) {
....
}
私の座標系は、原点がウィンドウの中心になるように設定されています。マウスホイールを使用したときにズームしたいと思います。上記のソリューションの問題は、ズームが常にウィンドウの中心から発生することです。マウスがウィンドウの中央にない場合、これは見苦しく見えます。マウスがある領域にズームしたいのですが、x 方向と y 方向のオフセットを計算する適切なアルゴリズムが見つかりません。たとえば、マウスの座標が (-200, 0) の場合、ポイント 1 は座標 (-200, 0) で、ポイント 2 は座標 (600, 0) で、倍率は 2 です。私はすでに多くのことを試しましたが、特にズーム中にマウスが他の場所に移動したときにすべてが台無しになると、うまくいきませんでした。誰でもこの問題を解決する方法を知っていますか?
これが私のアプリケーションのコード例です。最初のスニペットは、WM_MOUSEWHEEL メッセージを処理するためのコールバック関数です。
VOID OnMouseWheel(WPARAM const& WParam, LPARAM const& LParam) {
if(GET_WHEEL_DELTA_WPARAM(WParam) > 0)
{
// Zoom in
Draw.ScaleFactor += 0.1;
}
else
{
// Zoom out
}
}
Draw は、単に GDI 関数をラップするクラスです。倍率メンバーがあります。以下のスニペットは、倍率を使用して円を画面に正しく表示する Draw オブジェクトの DrawCircle メンバー関数です。
VOID DrawCircle(DOUBLE const& XCoordinate, DOUBLE const& YCoordinate, DOUBLE const& Radius, COLORREF const& Color) {
HBRUSH Brush = CreateSolidBrush(Color);
HBRUSH OldBrush = (HBRUSH)SelectObject(this->MemoryDC, Brush);
Ellipse(this->MemoryDC, (INT) ((XCoordinate - Radius) * this->ScaleFactor),
-(INT)((YCoordinate + Radius) * this->ScaleFactor),
(INT)((XCoordinate + Radius) * this->ScaleFactor),
-(INT)((YCoordinate - Radius) * this->ScaleFactor));
SelectObject(this->MemoryDC, OldBrush);
DeleteObject(Brush);
}
ご覧のとおり、私の DrawCircle 関数は、現在の倍率を適用するときにマウスの位置を考慮していません。
編集
解決策に近づいたのは、マウス コールバック関数の更新版です。
VOID OnMouseWheel(WPARAM const& WParam, LPARAM const& LParam) {
// Get Mouse position in real coordinates and not window coordinates.
INT XOffset = (Window.GetClientWidth() / -2) + XMousePos;
INT YOffset = (Window.GetClientHeight() / 2) - YMousePos;
if(GET_WHEEL_DELTA_WPARAM(WParam) > 0)
{
Draw.ScaleFactor += 0.1;
Draw.XOffsetScale = -XOffset * (Draw.ScaleFactor - 1.0);
Draw.YOffsetScale = YOffset * (Draw.ScaleFactor - 1.0);
}
else
{
// ...
}
}
そして、これが円を描く関数です。
VOID DrawCircle(DOUBLE const& XCoordinate, DOUBLE const& YCoordinate, DOUBLE const& Radius, COLORREF const& Color) {
HBRUSH Brush = CreateSolidBrush(Color);
HBRUSH OldBrush = (HBRUSH)SelectObject(this->MemoryDC, Brush);
Ellipse(this->MemoryDC, (INT) ((XCoordinate - Radius) * this->ScaleFactor + XOffsetScale) ,
-(INT)((YCoordinate + Radius) * this->ScaleFactor - YOffsetScale),
(INT)((XCoordinate + Radius) * this->ScaleFactor + XOffsetScale),
-(INT)((YCoordinate - Radius) * this->ScaleFactor - YOffsetScale));
SelectObject(this->MemoryDC, OldBrush);
DeleteObject(Brush);
}
これは、マウスを同じ位置に置いている限り機能しますが、別の位置に移動すると、期待どおりにズームしなくなり、その後再び正しくズームします。多分これは少し役立ちます。
前もって感謝します!
解決済み
わかりました、私は今私の問題を解決しました。マウスの位置にスケーリング係数を掛けて、座標系の原点を移動しました。回答ありがとうございます。