Нарисуйте растровое изображение на окне в wpf
Я новичок в WPF.
Я реализовал код в mfc, который загружает растровое изображение и рисует его в окне, теперь хочу перенести аналогичную функциональность в WPF.
Я хочу нарисовать растровое изображение в моем окне WPF и выполнить некоторые операции. Окно не будет иметь кнопки min, max, close.
ниже мой код MFC.
LRESULT Mywindow::OnPaint(UINT, WPARAM, LPARAM, BOOL&)
{
CPaintDC dc(this);
CDC cdc;
HDC hdc = dc.GetSafeHdc();
cdc.Attach(hdc);
paintBitmapOnWindow(&cdc);
}
void Mywindow::paintBitmapOnWindow(CDC* pCdc)
{
HBITMAP backgroundBitmap;
backgroundBitmap = (HBITMAP)::LoadImage(0, _T("C:\\temp.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CDC cdcCompatible;
cdcCompatible.CreateCompatibleDC(pCdc);
cdcCompatible.SelectObject(backgroundBitmap);
CRect clientRect;
GetClientRect(clientRect);
int clientHalfWidth = 800 / 2;
CRect clientLeft;
CRect imageLeft;
BITMAP bm;
::GetObject(backgroundBitmap, sizeof(BITMAP), (PSTR)&bm);
clientLeft.SetRect(clientRect.left, clientRect.top, clientRect.left + clientHalfWidth, clientRect.bottom);
int bitmapHalfWidth = bm.bmWidth / 2;
int bitmapLeftOffset = bitmapHalfWidth - 0;
imageLeft.SetRect(bitmapLeftOffset - clientLeft.Width(), 0, bitmapLeftOffset, bm.bmHeight);
pCdc->StretchBlt(clientLeft.left, clientLeft.top, clientLeft.Width(), clientLeft.Height(), &cdcCompatible,
imageLeft.left, imageLeft.top, imageLeft.Width(), imageLeft.Height(), SRCCOPY);
cdcCompatible.DeleteDC();
}
Каковы аналогичные функции / класс, который я могу использовать, чтобы преобразовать его в WPF?
1 ответ
Решение
Если вы хотите перетаскивать растровое изображение прямо в окно и хотите напрямую управлять рендерингом, вы можете просто переопределить функцию OnRender. Однако есть подвох (отмечено в комментариях к коду)...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Background = Brushes.Transparent; // <-- necessary (strange bug)
// Charles Petzold writes about this at the following link:
// http://social.msdn.microsoft.com/Forums/vstudio/en-US/750e91c2-c370-4f0a-b18e-892afd99bd9b/drawing-in-onrender-beginnerquestion?forum=wpf
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
BitmapSource bitmapSource = new BitmapImage(new Uri("C:\\Temp.png", UriKind.Absolute));
CroppedBitmap croppedBitmap = new CroppedBitmap(bitmapSource, new Int32Rect(20, 20, 100, 100));
drawingContext.DrawImage(croppedBitmap, new Rect(0.0d, 0.0d, this.RenderSize.Width / 2.0d, this.RenderSize.Height));
}
}