0

第 1 部分:在我的一个项目中,我想使用 GDI+ 在自定义控件的中心显示图像,同时保持图像的纵横比。这是我的代码

Gdiplus::Image image(imagePathWStr); // imagePathWStr is the Image Path

int originalWidth = image.GetWidth();
int originalHeight = image.GetHeight();

// This code calculates the aspect ratio in which I have to draw the image
int16 cntrlwidth = controlPosition.right - controlPosition.left;  // controlPosition is the custom Control Rect
int16 cntrlheigth = controlPosition.bottom - controlPosition.top;
float percentWidth = (float)cntrlwidth / (float)originalWidth;
float percentHeight = (float)cntrlheigth / (float)originalHeight;

float percent = percentHeight < percentWidth ? percentHeight : percentWidth;

int newImageWidth = (int)(originalWidth * percent);
int newImageHeight = (int)(originalHeight * percent);

Gdiplus::RectF imageContainer;
imageContainer.X = controlPosition.left;
imageContainer.Y = controlPosition.top;
imageContainer.Width = controlPosition.right;
imageContainer.Height = controlPosition.bottom;

Gdiplus::Graphics gdiGraphics(hDC);
Gdiplus::Unit scrUnit = Gdiplus::UnitPixel;
gdiGraphics.DrawImage(&image, imageContainer, 0, 0, originalWidth, originalHeight, scrUnit);

但是,当控件垂直调整大小时,图像会向右移动并且并不总是保持在中心位置,此外,当控件水平调整大小时,它也会移动到底部。我不知道为什么。我在 Windows 上使用 C++。

第 2 部分:现在我在此之上还绘制了一个 Rectangle

Gdiplus::RectF cropRect;
cropRect.X = 100;
cropRect.Y = 100;
cropRect.Width = 300;
cropRect.Height = 300;

Gdiplus::Pen* myPen = new Gdiplus::Pen(Gdiplus::Color::White);
myPen->SetWidth(3);
gdiGraphics.DrawRectangle(myPen, cropRect);

现在,当我调整控件的大小时,图像的大小得到了正确的调整,但这个矩形不是,我相应地乘以宽度和高度

Gdiplus::RectF cropRectangle;
cropRectangle.X = cropRect.GetLeft();
cropRectangle.Y = cropRec.GetTop();
cropRectangle.Width = (cropRec.Width)* percent;
cropRectangle.Height = (cropRec.Height ) * percent;

在 Adrians 回答之后,我的第 1 部分已得到解决,现在我被困在问题的第 2 部分中

谢谢

-潘卡伊

4

1 回答 1

0

当控件的大小发生变化时,您将在窗口中发布一条 WM_SIZE 消息。您必须根据新尺寸刷新纵横比。

于 2012-05-25T20:14:11.260 回答