请教:弹出式菜单无法显示的问题
eym 2003-08-21 09:13:33 //##################################################################################################
//##程序:TEST
//##日期:2003.8
//##################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////////
// 预编译处理
#include <windows.h>
#include "resource.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数声明
void WINAPI OnInitDialog();
void WINAPI OnCommand(WPARAM wParam, LPARAM lParam);
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 全局变量
HINSTANCE g_hInstance;
HWND g_hWnd;
HMENU g_hMenu;
const char c_szAppName[] = "TEST";
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
g_hInstance = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC) MainDlgProc);
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 主窗口回调函数
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
NOTIFYICONDATA Nid;
POINT pt;
switch (uMsg)
{
// 初始化
case WM_INITDIALOG:
g_hWnd = hDlg;
OnInitDialog();
break;
case WM_SIZE:
if (wParam == SIZE_MINIMIZED)
{
// 添加系统托盘图标
ZeroMemory(&Nid, sizeof(NOTIFYICONDATA));
Nid.cbSize = sizeof(NOTIFYICONDATA);
Nid.hWnd = g_hWnd;
Nid.uID = IDC_NOTIFYICON;
Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Nid.uCallbackMessage = WM_NOTIFYICON;
Nid.hIcon = (HICON) GetClassLong(g_hWnd, GCL_HICON);
lstrcpy(Nid.szTip, c_szAppName);
Shell_NotifyIcon(NIM_ADD, &Nid);
ShowWindow(g_hWnd, SW_HIDE);
}
break;
// 处理Command消息
case WM_COMMAND:
OnCommand(wParam, lParam);
break;
// 处理系统托盘图标消息
case WM_NOTIFYICON:
if (lParam == WM_LBUTTONUP)
{
// 删除系统托盘图标,恢复主窗口
ZeroMemory(&Nid, sizeof(NOTIFYICONDATA));
Nid.cbSize = sizeof(NOTIFYICONDATA);
Nid.hWnd = g_hWnd;
Nid.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, &Nid);
ShowWindow(g_hWnd, SW_SHOWNORMAL);
SetForegroundWindow(g_hWnd);
}
if (lParam == WM_RBUTTONDOWN)
{
// 取得鼠标所在的屏幕位置
GetCursorPos(&pt);
// 弹出菜单
TrackPopupMenuEx(g_hMenu, TPM_VERTICAL|TPM_LEFTALIGN, pt.x, pt.y, g_hWnd, NULL);
}
break;
// 关闭
case WM_CLOSE:
OnCommand(MAKEWPARAM(IDC_EXIT, 0), lParam);
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 初始化
void WINAPI OnInitDialog()
{
HICON hIcon;
// 设置窗口图标
hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAINICON));
SetClassLong(g_hWnd, GCL_HICON, (LONG) hIcon);
DeleteObject(hIcon);
// 载入菜单
g_hMenu = LoadMenu(g_hInstance, c_szAppName);
// 设置为右键点击弹出菜单
g_hMenu = GetSubMenu(g_hMenu, 0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 命令消息处理
void WINAPI OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
// 确定
case IDC_OK:
PostMessage(g_hWnd, WM_SIZE, SIZE_MINIMIZED, 0);
break;
// 退出
case IDC_EXIT:
EndDialog(g_hWnd, 0);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////