代码怪 会编程,懂技术,爱科学,更会分享
C++/Duilib自定义控件实现
发布于: 2021-01-18 更新于: 2025-02-26

一、根据当前的需要来继承相应的控件,已便减少重复开发

一般继承 DoPaint来写,若需要在最上层显示的,则要继承DoPostPaint()

例读取图片旋转显示,配合GDI+来,注意Gdiplus::Bitmap的构造函数,本例PNG,使用PixelFormat32bppPARGB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

bool RotateAnimation::DoPaint(HDC hDC, const RECT& rcPaint, CControlUI* pStopControl)
{
Gdiplus::PointF centerPos(m_rcItem.left + GetWidth()/ 2, m_rcItem.top + GetHeight()/ 2);

Gdiplus::Graphics graphics(hDC);
//graphics.SetSmoothingMode(SmoothingModeAntiAlias);

graphics.TranslateTransform(centerPos.X, centerPos.Y);
graphics.RotateTransform(m_fCurAngle);
graphics.TranslateTransform(-centerPos.X, -centerPos.Y);

const TImageInfo* imgInfo = GetManager()->GetImageEx(m_diBk.sImageName);
BITMAP bmp;
GetObject(imgInfo->hBitmap, sizeof(BITMAP), &bmp);
Gdiplus::Bitmap gdi_bmp(imgInfo->nX, imgInfo->nY, imgInfo->nX * 4, PixelFormat32bppPARGB, (BYTE*)bmp.bmBits);

graphics.DrawImage(&gdi_bmp, m_rcItem.left, m_rcItem.top, GetWidth(), GetHeight());
return true;
}
}

再细看一下DoPostPaint,首先要加入m_aPostPaintControls这个数组,在所有控件都被paint完成后,最后调用之,所以,它比DoPaint更在最上层

查看Duilib的源码的时候,都可以看到
在这里插入图片描述

--- 本文结束 The End ---