您好,目前我正在使用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),则point one应具有坐标(-200, 0),point two应具有坐标(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);
}
只要我保持鼠标在同一位置,它就能正常工作,但是当我移动到其他位置时,它不会按预期缩放,之后再次缩放就会正确。也许这可以帮助一点。
提前感谢!
已解决
好的,我现在解决了我的问题。我只是根据鼠标位置乘以缩放因子移动了我的坐标系原点。谢谢你们的回答。