纯WIN32 API 托盘菜单的问题...

libzbtiocq2 2011-01-25 12:58:43
_tWinmain
WinProc
什么的都写好了,
最简单的那种WIN32 API程序框架
图标也进了托盘,一切正常...
没有MFC就不知道托盘菜单应该怎么搞了..
我想要有个托盘图标右键弹出的菜单,
搜了能看懂的资料,发现都是以MFC为主的右键菜单...

请教三个问题,
1、如果纯API来搞菜单,我想右键弹出一个菜单项"功能1",点击就去执行一个函数,应该怎么写?

2、有个IDR_MENU1,现在不像MFC那样能对菜单项添加事件处理了,如果我真想对托盘图标右键挂载IDR_MENU1,应该怎么做?

3、IDR_MENU1现在似乎不能想MFC那样添加事件处理程序了,上面的菜单项应该如何制定?
如功能1跟函数void makesome()关联起来?或者自写的SendMessage(XXX)语句关联起来?


LRESULT CALLBACK WndProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
POINT pt;

switch(msg)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;

case WM_ICONNOTIFY:
switch (lParam)
{
case WM_RBUTTONDOWN: //对右键的反应

break;

case WM_LBUTTONDBLCLK:
break;

default:
break;
}
break;

case WM_CLOSE:
PostQuitMessage(0);
::Shell_NotifyIcon(NIM_DELETE, &nid);
break;

case WM_DESTROY:
PostQuitMessage(0);
::Shell_NotifyIcon(NIM_DELETE, &nid);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
...全文
533 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacky_qiu 2011-01-25
  • 打赏
  • 举报
回复
如果是用菜单资源,如下:
HMENU hMenu=LoadMenu(g_hfe,MAKEINTRESOURCE(IDR_MENU1));
hMenu = GetSubMenu (hMenu, 0) ;
jacky_qiu 2011-01-25
  • 打赏
  • 举报
回复



vs2008下编译通过 愿顺利 阿弥陀佛!

#include <windows.h>
#include <tchar.h>
#include "trace.h"
#include "resource.h"


#define WM_PROC WM_USER+100

// struct for Shell_NotifyIcon args
NOTIFYICONDATA m_nid;

/****************************************************************************
创建托盘图标函数
****************************************************************************/
bool SetupTrayIcon(HWND m_hWnd)
{
m_nid.cbSize=sizeof(NOTIFYICONDATA); // 结构大小(sizeof struct),必须设置
m_nid.hWnd=m_hWnd; // 接收 托盘通知消息 的窗口句柄
m_nid.uID=IDI_ICON; // 图标ID ( 由回调函数的WPARAM 指定)
m_nid.uFlags=NIF_MESSAGE //表示uCallbackMessage 有效 #define NIF_MESSAGE 0x1
|NIF_ICON //表示hIcon 有效 #define NIF_ICON 0x2
|NIF_TIP; //表示szTip 有效 #define NIF_TIP 0x4
m_nid.uCallbackMessage=WM_PROC; // 消息被发送到此窗口过程
m_nid.hIcon=::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON)); // 图标句柄
strcpy(m_nid.szTip,"我的任务栏程序"); // 提示文本

return 0!=Shell_NotifyIcon(NIM_ADD,&m_nid);
}



HWND CreateWnd();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hWnd=CreateWnd();

SetupTrayIcon(hWnd); //创建托盘图标

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PROC:
{
switch((UINT)lParam)
{
case WM_RBUTTONDOWN:
{
//Win32创建菜单
POINT point;
::GetCursorPos(&point);
HMENU hMenuPopup = CreatePopupMenu () ;
AppendMenu(hMenuPopup, MF_STRING, 1, "统计字符个数");
AppendMenu(hMenuPopup, MF_STRING, 2, "&Open...");
AppendMenu(hMenuPopup, MF_STRING, 3, "Save &As...");
AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL) ;
AppendMenu(hMenuPopup, MF_STRING, 4, "E&xit") ;
TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL) ;
DestroyMenu (hMenuPopup);
}
break;
}
}

case WM_COMMAND:
{
switch(wParam)
{
case 1:
{
::MessageBox(NULL,TEXT("1"),NULL,MB_OK);
}
break;
case 2:
{
::MessageBox(NULL,TEXT("2"),NULL,MB_OK);
}
break;
}

}
break;

case WM_CLOSE:
{
Shell_NotifyIcon(NIM_DELETE,&m_nid);//删除任务栏图标
DestroyWindow(hWnd);//既关闭按钮,可以在此时询问用户是否确定要关闭,再调用DestroyWindow关闭程序
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}


HWND CreateWnd()
{
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.lpszMenuName = NULL;
wndcls.hInstance = NULL;
wndcls.style = NULL/*CS_HREDRAW|CS_VREDRAW*/;
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls.lpszClassName = _T("Win32");
wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hIcon = LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON));
wndcls.lpfnWndProc = WndProc;

if (!RegisterClass(&wndcls))
return NULL;

HWND hWnd = CreateWindowEx(WS_EX_TOPMOST,
_T("Win32"),
_T("Demo"),
WS_OVERLAPPEDWINDOW,
225,160,400,400,NULL,NULL,NULL,NULL) ;

if (!hWnd)
return NULL;

ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);

return hWnd;
}



fishion 2011-01-25
  • 打赏
  • 举报
回复
hMenu = LoadMenu(g_Histance, MAKEINTRESOURCE(IDR_TRAYMENU));

case WM_ICONNOTIFY:
switch(lParam)
{
case WM_RBUTTONDOWN:
{
GetCursorPos(&point);
SetForegroundWindow(hwnd); // 修正当用户按下ESCAPE 键或者在菜单之外单击鼠标时菜单不会消失的情况
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL);
}
break;
case WM_LBUTTONDBLCLK:
ShowWindow(hwnd , SW_SHOW);
break;
}
break;
Eleven 2011-01-25
  • 打赏
  • 举报
回复
TrackPopupMenu()弹出菜单
CopyReg 2011-01-25
  • 打赏
  • 举报
回复
问题1:菜单项被单击会响应:WM_COMMAND消息,而ID是wParam的低16位
后面的等高手...睡觉去

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧