在保持宽高比的同时在中心绘制图像

时间:2012-05-25 20:08:11

标签: c++ gdi+

第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部分:现在我已经在这个

之上绘制了一个矩形
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;

我的第1部分已经解决了,因为Adrians现在回答我的问题第2部分

由于

-Pankaj

1 个答案:

答案 0 :(得分:0)

当控件的大小发生变化时,您会在窗口中发布WM_SIZE消息。您必须根据新尺寸刷新宽高比。