在窗口托盘菜单中添加图像

在窗口托盘菜单中添加图像,第1张

概述在窗口托盘菜单中添加图像

我正在为使用python的windows编写简单的托盘。

我成功地创build了一个托盘图标,菜单,子菜单。 我stucked添加特定托盘项目的图像。

这里是我使用的代码。 ( 链接 )即使这个代码没有工作。 windows文档不清楚。

def addMenuItem(self,wID,Title,menu): path = os.path.dirname(os.path.abspath(__file__)) path += "print_pref.ico" option_icon = self.prep_menu_icon(path) item,extras = win32gui_struct.PackMENUITEMINFO(text=Title,hbmpItem=option_icon,wID=wID) win32gui.InsertMenuItem(menu,1,item) def prep_menu_icon(self,icon): # First load the icon. ico_x = win32API.GetSystemMetrics(win32con.SM_CXSMICON) ico_y = win32API.GetSystemMetrics(win32con.SM_CYSMICON) hicon = win32gui.LoadImage(0,icon,win32con.IMAGE_ICON,ico_x,ico_y,win32con.LR_LOADFROMfile) hdcBitmap = win32gui.CreateCompatibleDC(0) hdcScreen = win32gui.GetDC(0) hbm = win32gui.CreateCompatibleBitmap(hdcScreen,ico_y) hbmold = win32gui.SelectObject(hdcBitmap,hbm) # Fill the background. brush = win32gui.GetSyscolorBrush(win32con.color_MENU) win32gui.FillRect(hdcBitmap,(0,16,16),brush) # unclear if brush needs to be Feed. Best clue I can find is: # "GetSyscolorBrush returns a cached brush instead of allocating a new # one." - implIEs no DeleteObject # draw the icon win32gui.DrawIconEx(hdcBitmap,hicon,win32con.DI_norMAL) win32gui.SelectObject(hdcBitmap,hbmold) win32gui.DeleteDC(hdcBitmap) return hbm

有人能帮我吗。

windows相当于POSIX srandom(…)和random()函数?

windows:XP – > current:如何判断在CONSolE或RDP会话中?

为什么getsockopt返回一个错误?

如何以编程方式使用windows应用程序将本地networking上的连接代理服务器configuration到Internet

在windows上获取对Chrome的UDP套接字的接收callback

编辑

self.tray = win32gui.CreatePopupMenu() self.addMenuItem(1,"Open",self.tray)

附上图像。 在“打开”旁边的小方框里,我想要图像来。

C ++如何检查Outlook进程是否已经在运行

实时移动GTK +窗口

什么 *** 作系统中断来自closuresterminal选项卡?

使用存储在文件中的variables来触发事件

Vista中的sed – 如何删除之间的所有符号?

对可能不会导致错误的类型的句柄存在问题。

我通过使用像PyCDC和PyCBitMap的win32ui类而不是句柄来得到这个工作。

尝试将prep_menu_icon更改为:

def prep_menu_icon(self,icon): # First load the icon. ico_x = win32API.GetSystemMetrics(win32con.SM_CXSMICON) ico_y = win32API.GetSystemMetrics(win32con.SM_CYSMICON) hIcon = win32gui.LoadImage(0,win32con.LR_LOADFROMfile) hwndDC = win32gui.GetwindowDC(self.hwnd) dc = win32ui.CreateDCFromHandle(hwndDC) memDC = dc.CreateCompatibleDC() iconBitmap = win32ui.CreateBitmap() iconBitmap.CreateCompatibleBitmap(dc,ico_y) oldBmp = memDC.SelectObject(iconBitmap) brush = win32gui.GetSyscolorBrush(win32con.color_MENU) win32gui.FillRect(memDC.GetSafeHdc(),ico_y),brush) win32gui.DrawIconEx(memDC.GetSafeHdc(),hIcon,win32con.DI_norMAL) memDC.SelectObject(oldBmp) memDC.DeleteDC() win32gui.ReleaseDC(self.hwnd,hwndDC) return iconBitmap.GetHandle()

我得到菜单项图标:

我似乎无法得到在我的电脑上设置的软件包,所以不能真正测试这个,但这一行

option_icon = self.prep_menu_icon("print_pref.ico")

给我一些关心。 我不确定你是否正在阅读你认为是你的文件。

这将表明一个转义序列。 在windows上,您需要将这些反斜杠加倍以防止它们像"\print_pref.ico"一样被转义。 如果您正在尝试在当前目录中加载文件,则可能完全不需要,只需提供文件名"print_pref.ico" 。 如果您试图在驱动器的根目录中找到文件,则需要提供驱动器盘符"C:\print_pref.ico" 。

将代码行167更改为item,hbmpItem=5,wID=wID) ,然后您将找到一个关闭图标。 但是由5和option_icon构造的MENUITEMINFO没有区别。

类型不匹配是我可以成像的唯一原因。option_icon的类型是hgdiobjdect ,而MENUITEMINFO.hbmpItem需要一个HBITMAP 。应该有一个转换。

这很奇怪,我不认为hbmpitem是一个句柄,它可以被分配到5,所以它更像是内核中的某个表的索引。如果这样的话,类型应该不重要。

讨论handle问题:

您可以尝试MENUITEMINFO预定义的所有数字,然后打印该item ,您会发现该数字只是传递给struct.and一个句柄是某种指针,这个数字不是内存地址。所以它是某种索引。

prep_menu_icon是一个正常的C ++函数的python版本, hcion hbitmap转换为hbitmap 。 python版本缺少一些类型GetHandle ,它不起作用,但是GetHandle做了一些魔术。

总结

以上是内存溢出为你收集整理的在窗口托盘菜单中添加图像全部内容,希望文章能够帮你解决在窗口托盘菜单中添加图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1155232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存