當前位置:編程學習大全網 - 源碼下載 - 如何在VC++中使壹個hello world窗口最小化到托盤 各位會的幫下忙。我才開始學VC++

如何在VC++中使壹個hello world窗口最小化到托盤 各位會的幫下忙。我才開始學VC++

完整代碼如下,自己參考!!

#include <wtypes.h>

#include "resource.h"

//任務欄右側提供托盤,允許程序加入圖標,並響應用戶輸入的消息,對在後臺運行的程序是有用的

//加入圖標,調用Shell_NotifyIcon即可,允許刪除和修改圖標,傳遞給該函數NOTIFYICONDATA結構

const char szClassName[]={ TEXT("ShellTrayWindowClass")}; //窗口類名

const char szTip[]={ TEXT("Shell tray icon demo")}; //托盤圖標提示字符

const int WM_SHELLICONNOTIFY=WM_USER+0x99; //通知消息

const int SMILLID=0x99; //托盤圖標編號

HICON hIconSmill; //托盤圖標句柄

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口過程

void AddTrayIcon(HWND); //輔助函數

void DeleteTrayIcon(HWND);

void ShowMenu(HWND);

int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)

{

WNDCLASSEX wcex;

MSG msg;

HWND hwnd;

hIconSmill=::LoadIcon(hInstance,MAKEINTRESOURCE(IDI_SMELL)); //加載托盤圖標資源

wcex.cbSize=sizeof(WNDCLASSEX); //窗口類

wcex.cbClsExtra=0;

wcex.cbWndExtra=0;

wcex.hInstance=hInstance;

wcex.lpszClassName=szClassName;

wcex.lpfnWndProc=WndProc;

wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);

wcex.style=0;

wcex.hbrBackground=(HBRUSH)::GetStockObject(NULL_BRUSH);

wcex.hCursor=::LoadCursor(NULL,IDC_ARROW);

wcex.hIcon=hIconSmill;

wcex.hIconSm=hIconSmill;

do {

if(!::RegisterClassEx(&wcex))

break;

//創建不可見的窗口

hwnd=::CreateWindow(szClassName,NULL,WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

if(!hwnd)

break;

while(::GetMessage(&msg,0,0,0)) //消息循環

{

::TranslateMessage(&msg);

::DispatchMessage(&msg);

}

} while(FALSE);

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) //主窗口過程

{

switch(msg)

{

case WM_CREATE: //創建窗口時向托盤加入圖標

AddTrayIcon(hWnd);

break;

case WM_COMMAND: //處理來自托盤的菜單命令

switch(LOWORD(wParam))

{

case IDM_HELLO:

::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);

return 0;

case IDM_EXIT:

::DestroyWindow(hWnd);

return 0;

default:

break;

}

break;

case WM_SHELLICONNOTIFY: //處理托盤圖標的鼠標事件

{

if(SMILLID==(UINT)wParam)

{

switch((UINT)lParam)

{

case WM_RBUTTONUP:

ShowMenu(hWnd);

return 0;

case WM_LBUTTONDBLCLK:

::MessageBox(NULL,TEXT("Hello from tray icon"),TEXT("Hello"),MB_OK);

return 0;

default:

break;

}

}

}

break;

case WM_DESTROY: //窗口銷毀時刪除托盤圖標,並退出程序

DeleteTrayIcon(hWnd);

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hWnd,msg,wParam,lParam);

}

void AddTrayIcon(HWND hwnd) //添加托盤圖標

{

NOTIFYICONDATA nid;

nid.cbSize=sizeof(NOTIFYICONDATA); //指定結構大小

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP; //指定結構的哪些成員是有效的

nid.hIcon=hIconSmill; //指定托盤圖標句柄

nid.hWnd=hwnd; //指定接收托盤消息的窗口句柄

nid.uID=SMILLID; //自定義的托盤圖標句柄,壹個程序可添加多個托盤圖標,以uID區分

nid.uCallbackMessage=WM_SHELLICONNOTIFY; //當用戶鼠標在托盤產生事件時用戶通知窗口程序的消息號

strcpy(nid.szTip,szTip); //鼠標在托盤圖標上停靠的提示字符串

Shell_NotifyIcon(NIM_ADD,&nid);

}

void DeleteTrayIcon(HWND hwnd)

{

NOTIFYICONDATA nid;

::ZeroMemory(&nid,sizeof(nid));

nid.cbSize=sizeof(NOTIFYICONDATA);

nid.uID=SMILLID;

nid.hWnd=hwnd;

nid.hIcon=hIconSmill;

Shell_NotifyIcon(NIM_DELETE,&nid);

}

void ShowMenu(HWND hwnd)

{

HMENU hMenu=::GetSubMenu(::GetMenu(hwnd),0);

POINT pt;

::GetCursorPos(&pt);

if(hMenu==NULL)

return;

if(::TrackPopupMenuEx(hMenu,TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_LEFTBUTTON,pt.x,pt.y,hwnd,NULL))

PostMessage(hwnd,WM_USER,0,0);

}

  • 上一篇:倫敦電影學院的校友名錄
  • 下一篇:微信裏保存的照片沒有查看原圖怎麽回事啊
  • copyright 2024編程學習大全網