自绘按钮加载png的类
程序员文章站
2022-03-10 22:08:26
...
网上收集的三个自绘按钮控件加载png的类
1.路径获取
// CMFCApplication1Dlg 对话框
CString getModulePath( )
{
CString strPath;
TCHAR wszPathName[260] = { 0 };
GetModuleFileName(0, wszPathName, 260);//获得完全路径+程序名
strPath = wszPathName; //CString 转换
int nPos = strPath.ReverseFind(L'\\');//返回此CString对象中与要求的字符匹配的最后一个字符的索引,从零开始
CString strModulePath = strPath.Left(nPos);//从左边1开始获取前 nCount个字符,这里是没有零哦
return strPath.Left(nPos);
}
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
SetBackgroundColor(RGB(0,0,255));
// TODO: 在此添加额外的初始化代码
//////1. lrButton类,加载路径方式,4个png合成一个大图,背景不透明问题未解决////////////
m_bt1.SetImage(getModulePath() + L"\\res\\sysbtn_close.png");
//////2. UPNGButton类,加载路径方式,按钮不同模式之间会相互覆盖,由于透明,造成越来越模糊////////////
//解决办法BOOL CPngButton::OnEraseBkgnd(CDC* pDC)忘了添加GetClientRect(rc);
m_bt2.SetButtonImage(L"skin\\module_application.png", L"skin\\module_sms.png", L"skin\\connect_wifiicon.png", NULL);
//////3. PNGButtonCtrl类,加载资源方式,按钮不同模式之间会相互覆盖,由于透明,造成越来越模糊////////////
CRect rt;
GetClientRect(&rt);
m_bt4.Create(rt.right - 100, 50, this, 250, IDB_PNG3, IDB_PNG4, IDB_PNG1, IDB_PNG1);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
2.背景图
BOOL CMFCApplication1Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HDC hdc = pDC->GetSafeHdc();
CRect rt;
GetClientRect(&rt);
HDC hMemdc = CreateCompatibleDC(hdc);
Image bk(getModulePath() + L"\\skin\\bg.png");
HBITMAP hMembmp = CreateCompatibleBitmap(hdc, rt.Width(), rt.Height());
HBITMAP hOldbmp = (HBITMAP)SelectObject(hMemdc, hMembmp);
Graphics graphics(hMemdc);
graphics.DrawImage(&bk, 0, 0, rt.Width(), bk.GetHeight());
BitBlt(hdc, 0, 0, rt.Width(), bk.GetHeight(), hMemdc, 0, 0, SRCCOPY);
graphics.ReleaseHDC(hMemdc);
SelectObject(hMemdc, hOldbmp);
DeleteDC(hMemdc);
DeleteObject(hMembmp);
return TRUE;
//return CDialogEx::OnEraseBkgnd(pDC);
}
4.下载