网上收集的三个自绘按钮控件加载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.下载