0

パート 1: 私のプロジェクトの 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 に答える