社区
C++ 语言
帖子详情
c++ 程序可以使用png图标做菜单吗?怎么用?谢谢!
zhu6789888
2009-06-11 05:52:35
我最近做MFC程序,想用PNG的图片做菜单,要怎么样做呢,
通过代码来实现,有这样的方法或者API吗》??
谢谢了!!
...全文
971
23
打赏
收藏
c++ 程序可以使用png图标做菜单吗?怎么用?谢谢!
我最近做MFC程序,想用PNG的图片做菜单,要怎么样做呢, 通过代码来实现,有这样的方法或者API吗》?? 谢谢了!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nodeserver
2010-08-30
打赏
举报
回复
尽是copy党。靠
用GDI+。非常容易就能显示png图片,还可以使用带alpha通道透明背景的png
mihanse
2010-04-12
打赏
举报
回复
mark!!!
qmhz
2009-12-28
打赏
举报
回复
mark!!!
ycht520
2009-08-11
打赏
举报
回复
mark
fairchild811
2009-06-13
打赏
举报
回复
MFC好像暂时还不行
ice50303
2009-06-13
打赏
举报
回复
蹭个分~
dengkais
2009-06-13
打赏
举报
回复
6楼的,你的代码真长!
Jalien
2009-06-13
打赏
举报
回复
不知道,不过我想与其这样还不如直接用个工具将png转换一下。
猫已经找不回了
2009-06-13
打赏
举报
回复
[Quote=引用 14 楼 lin12345 的回复:]
QT支持C++吗
[/Quote]
汗,QT的接口已经代码本来就是C++,当然也兼容C风格。
lin12345
2009-06-12
打赏
举报
回复
QT支持C++吗
fldx
2009-06-12
打赏
举报
回复
Qt是内建支持png的,如果楼主只是做一个程序的话,还不如用Qt呢。。。上手很快的。。。。
pathuang68
2009-06-11
打赏
举报
回复
学习了
满衣兄
2009-06-11
打赏
举报
回复
肯定能做到,关注.
xxf012005
2009-06-11
打赏
举报
回复
QT是完全没问题,png,jpg都可以。
amossavez
2009-06-11
打赏
举报
回复
用QT做界面吧,很容易上手的
liliangbao
2009-06-11
打赏
举报
回复
up
猫已经找不回了
2009-06-11
打赏
举报
回复
[Quote=引用楼主 zhu6789888 的帖子:]
我最近做MFC程序,想用PNG的图片做菜单,要怎么样做呢,
通过代码来实现,有这样的方法或者API吗》??
谢谢了!!
[/Quote]
至少QT是完全没问题,png,jpg都可以。
「已注销」
2009-06-11
打赏
举报
回复
如果要使用PNG图片:
MFC的CToolBar类中对图标的处理仅提供了三个函数:SetImageList()、 SetHotImageList()和SetDisabledImageList()。对于图像的透明,也仅支持镂空效果,即要么图标显示前景,要么显示背景。而PNG图像中的半透明效果、边缘羽化后的效果均无法表现。CToolBar没有提供图标自画功能,如何实现更漂亮的ToolBar呢?
答案就是:自已画!
虽然CToolBar没有提供自画方法,但使用它提供的三个函数,我们仍可以把自己画的内容应用到CToolBar上。
我们先按ToolBar上图标的大小创建一个位图,然后用系统的颜色画上背景,再使用GDI+的函数把PNG画到到位图中,最后使用生成的位图生成CImgList,再使用CToolBar的三个函数把新的CImgList传给CToolBar,这样,一个使用带有半透明效果的ToolBar就出现了。
CImageToolBar从CToolBar继承,源代码如下
ImageToolBar.h
class CImageToolBar : public CToolBar
{
DECLARE_DYNAMIC(CImageToolBar)
public:
ULONG_PTR gdiplusToken;
CImageToolBar();
virtual ~CImageToolBar();
enum SET_ERR { SUCCESS = 0, RESOURCE_ERR, TOOBAR_ERR, SIZE_ERR, ERR };
int SetImage(const char * imgPath);
int SetImage(int sourceId);
int SetImage(HBITMAP h_bmp);
int RefreshImg();
protected:
Image * m_pImage;
void ColorReplace(CBitmap & bmpImg, COLORREF from, COLORREF to);
int GetButtonCount();
void GetButtonImgSize(CSize & size);
void GetToolImgRect(CRect & imgRect);
virtual void DrawBarImg(CBitmap & bmpImg);
virtual void RendHotImg(CBitmap & bmpImg);
virtual void RendDisableImg(CBitmap & bmpImg);
protected:
DECLARE_MESSAGE_MAP()
public:
};
ImageToolBar.cpp
IMPLEMENT_DYNAMIC(CImageToolBar, CToolBar)
CImageToolBar::CImageToolBar()
{
m_pImage = NULL;
GdiplusStartupInput gdiplusStartupInput;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
CImageToolBar::~CImageToolBar()
{
if (m_pImage!=NULL)
delete m_pImage;
GdiplusShutdown(gdiplusToken);
}
BEGIN_MESSAGE_MAP(CImageToolBar, CToolBar)
END_MESSAGE_MAP()
// CImageToolBar 消息处理程序
int CImageToolBar::SetImage(const char * imgPath)
{
if (m_pImage!=NULL)
delete m_pImage;
m_pImage = Image::FromFile(CStringW(imgPath));
if (m_pImage == NULL)
return RESOURCE_ERR;
return RefreshImg();
}
int CImageToolBar::SetImage(int sourceId)
{
CBitmap bitmap;
if (bitmap.LoadBitmap(sourceId))
return SetImage(bitmap);
return RESOURCE_ERR;
}
int CImageToolBar::SetImage(HBITMAP h_bmp )
{
if (m_pImage!=NULL)
delete m_pImage;
m_pImage = Bitmap::FromHBITMAP(h_bmp,NULL);
if (m_pImage == NULL)
return RESOURCE_ERR;
return RefreshImg();
}
int CImageToolBar::RefreshImg()
{
if (m_hWnd == NULL)
return TOOBAR_ERR;
CToolBarCtrl& ToolBarCtrl = GetToolBarCtrl();
CSize ButtonSize;
GetButtonImgSize(ButtonSize);
CBitmap BmpBack;
CRect BKRect;
GetToolImgRect(BKRect);
CDC * pWndDC = GetWindowDC();
BmpBack.CreateCompatibleBitmap(pWndDC, BKRect.Width(), BKRect.Height());
ReleaseDC(pWndDC);
CImageList ImgList;
{ // normal
DrawBarImg(BmpBack);
ImgList.Create(ButtonSize.cx, ButtonSize.cy, ILC_COLORDDB ¦ ILC_MASK, 1, 1);
ImgList.Add(&BmpBack, RGB(0,0,0) );
ToolBarCtrl.SetImageList(&ImgList);
ImgList.Detach();
}
{ // hot
DrawBarImg(BmpBack);
RendHotImg(BmpBack);
ImgList.Create(ButtonSize.cx, ButtonSize.cy, ILC_COLORDDB ¦ ILC_MASK, 1, 1);
ImgList.Add(&BmpBack, RGB(0,0,0) );
ToolBarCtrl.SetHotImageList(&ImgList);
ImgList.Detach();
}
{
// disable
DrawBarImg(BmpBack);
RendDisableImg(BmpBack);
ImgList.Create(ButtonSize.cx, ButtonSize.cy, ILC_COLORDDB ¦ ILC_MASK, 1, 1);
ImgList.Add(&BmpBack, RGB(0,0,0) );
ToolBarCtrl.SetDisabledImageList(&ImgList);
ImgList.Detach();
}
ReleaseDC(pWndDC);
return SUCCESS;
}
void CImageToolBar::ColorReplace(CBitmap & bmpImg, COLORREF from, COLORREF to)
{
CImage img;
img.Attach(bmpImg);
COLORREF BKold = img.GetPixel(0,0);
COLORREF BKnew = GetSysColor(COLOR_BTNFACE);
int w = img.GetWidth(),
h = img.GetHeight();
int x,y;
for (x=0; x < w; ++x)
{
for (y=0; y < h; ++y)
{
if (img.GetPixel(x,y) == from)
img.SetPixel(x,y, to);
}
}
img.Detach();
}
void CImageToolBar::GetButtonImgSize(CSize & size)
{
size = GetToolBarCtrl().GetButtonSize();
size.cx -= 7;
size.cy -= 6;
}
int CImageToolBar::GetButtonCount()
{
int count = GetToolBarCtrl().GetButtonCount();
for (int i=count-1; i>=0; --i)
{
if (TBBS_BUTTON != GetButtonStyle(i))
--count;
}
return count;
}
void CImageToolBar::GetToolImgRect(CRect & imgRect)
{
CSize size;
GetButtonImgSize(size);
imgRect.left = 0;
imgRect.top = 0;
imgRect.bottom = size.cy;
imgRect.right = size.cx * GetButtonCount();
}
void CImageToolBar::DrawBarImg(CBitmap & bmpImg)
{
if (m_pImage==NULL)
return;
CRect BKRect;
GetToolImgRect(BKRect);
CDC DrawDC,
*pWndDC = GetWindowDC();
DrawDC.CreateCompatibleDC(pWndDC);
DrawDC.SelectObject(&bmpImg);
ReleaseDC(pWndDC);
DrawDC.FillRect(&BKRect, &CBrush(GetSysColor(COLOR_BTNFACE) ) );
Graphics graphics(DrawDC);
graphics.DrawImage(m_pImage, 0.0, 0.0, BKRect.Width(), BKRect.Height());
if (m_pImage->GetType() < ImageTypeMetafile)
{
COLORREF bk = DrawDC.GetPixel(0,0);
DrawDC.DeleteDC();
ColorReplace(bmpImg, bk, GetSysColor(COLOR_BTNFACE));
}
}
void CImageToolBar::RendHotImg(CBitmap & bmpImg)
{
CRect BKRect;
GetToolImgRect(BKRect);
CDC DrawDC,
*pWndDC = GetWindowDC();
DrawDC.CreateCompatibleDC(pWndDC);
DrawDC.SelectObject(&bmpImg);
ReleaseDC(pWndDC);
unsigned char r,g,b;
COLORREF color;
for (int x = 0; x <BKRect.Width(); ++x)
for (int y=0; y <BKRect.Height(); ++y)
{
color = DrawDC.GetPixel(x,y);
r = (color>>0)&0x0ff;
g = (color>> 8)&0x0ff;
b = (color>>16)&0x0ff;
r += min(255-r, r*0.15);
g += min(255-g, g*0.15);
b += min(255-b, b*0.15);
DrawDC.SetPixel(x,y,RGB(r,g,b));
}
}
void CImageToolBar::RendDisableImg(CBitmap & bmpImg)
{
try{
CRect BKRect;
GetToolImgRect(BKRect);
CDC DrawDC,
*pWndDC = GetWindowDC();
DrawDC.CreateCompatibleDC(pWndDC);
DrawDC.SelectObject(&bmpImg);
ReleaseDC(pWndDC);
CImage Img;
if (!Img.Create(BKRect.Width(), BKRect.Height(), 32))
return;
CDC ImgDC;
ImgDC.Attach(Img.GetDC());
ImgDC.FillRect(&BKRect, &CBrush(GetSysColor(COLOR_BTNFACE)) );
ImgDC.Detach();
Img.AlphaBlend(DrawDC, BKRect, BKRect, 180);
Img.ReleaseDC();
}catch(...)
{
}
}
「已注销」
2009-06-11
打赏
举报
回复
菜单自绘
http://search.download.csdn.net/search/%E8%87%AA%E7%BB%98%E8%8F%9C%E5%8D%95
xlttap
2009-06-11
打赏
举报
回复
完全可以,我前几天就做过。
不过我是在linux下开发的,不是你们用的MFC
加载更多回复(3)
wxwidgets 界面编程如何
使用
png
图片
wxwidgets 是跨平台的GUI
C++
库,相比MFC, 更易学,更易
使用
。GUI编程会用到小
图标
,下面介绍一种将
使用
的
png
图标
和编译的 exe 文件打包到一起的办法先
使用
VC编译下面的代码为一个 exe 文件,比如:convert.exe #include #include #include #include #ifndef PATH_MAX
C++
控制台创建窗口,加载
png
图片,实现悬浮窗
代码传送门 #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; //声明自定义消息处理函数 LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wPara...
QListWidget的
图标
模式
本文介绍了Qt中QListWidget的
图标
模式(Icon Mode)功能。主要内容包括:如何设置
图标
模式、自定义
图标
和文本、
使用
QSS样式美化界面、调整
图标
大小、实现拖放功能、
使用
自定义委托等高级用法。文章还提供了性能优化建议和一个完整的示例代码,展示如何创建具有现代UI风格的
图标
视图列表。通过合理的配置和样式设置,开发者可以创建出类似文件管理器的直观用户界面,适用于图片、文件等视觉化项目的展示和管理。
QT
C++
系统托盘
图标
开发:从QSystemTrayIcon入门到实战优化
系统托盘
图标
是桌面应用开发中的基础功能,它通过后台常驻服务提升用户体验与资源管理效率。其实现原理在于操作系统提供的通知区域API,允许应用在主窗口关闭后仍保持后台运行状态。在跨平台开发中,QT框架的QSystemTrayIcon类封装了Windows、macOS和Linux的底层差异,提供了统一的对象接口,显著提升了开发效率。该技术的核心价值在于将应用从“工具”升级为“服务”,实现快速访问、状态提示和后台任务管理。典型应用场景包括音乐播放器、下载工具、即时通讯软件等需要后台运行的
程序
。本文以
C++
QT开发
EXE文件
图标
提取与资源查看工具详解
/ 必须为0,历史遗留// 1=
图标
(.ico),2=光标(.cur)// 包含多少个图像条目} ICONDIR;// 宽度(0表示256px)// 高度(0表示256px)// 颜色数(0表示 >8bpp)// 保留,必须为0// 位平面数,总是1// 每像素位数(1, 4, 8, 16, 24, 32)// 该图像资源总大小(字节)// 相对于资源起始的偏移📌 关键点解读:idReserved必须为0,否则系统认为这不是合法
图标
。
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章