Заставка

Программирование на старых и современных языках, а так-же дизайн

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование на старых и современных языках, а так-же дизайн » Си/Си++ » Область уведомлений в Win32, на Dev-C++ 5.11


Область уведомлений в Win32, на Dev-C++ 5.11

Сообщений 1 страница 2 из 2

1

Здесь покажу как сделать вот такое приложение, которое добавит иконку и меню в область уведомлений, а так-же покажу как сделать всплывающую подсказку.
https://i.ibb.co/T1nThD7/systra0-min.jpg

https://i.ibb.co/z67zV1b/systra1-min.jpg

Для того чтобы отобразить иконку, подсказку, всплывающую подсказку в область уведомлений, отобразить меню при нажатие на правую кнопку мыши по иконки, или удалить, то нужно использовать функцию Shell_NotifyIcon,
BOOL Shell_NotifyIcon(
  DWORD dwMessage,
  PNOTIFYICONDATAA lpData
);

Параметры:
dwMessage:
NIM_ADD - добавляет иконку.
NIM_MODIFY - модифицирует область уведомлений.
NIM_DELETE - удаляет иконку.

PNOTIFYICONDATA:
Настройка...

resource.h:

Код:
#define IDI_ICON_SYS_TRAY1               100
#define IDR_POPUPMENU                                101
#define IDM_HELLO                                        102
#define IDM_CLOSE                                        103

resource.rc

Код:
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"

IDI_ICON_SYS_TRAY1          ICON           "systray_icon.ico"
IDR_POPUPMENU MENU 
{
   POPUP "TEST" 
   {     
        MENUITEM "Hello",               IDM_HELLO
        MENUITEM "Close",               IDM_CLOSE
   }
}

main.c:

Код:
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

#define WM_USR_NOTIF WM_USER + 1
#ifndef NIF_SHOWTIP
   #define NIF_SHOWTIP 0x00000080
#endif

NOTIFYICONDATA notif;
const char appname[] = "System Tray Win32 Demo";

void show_notification(int duration, char *title, char *message) {
   notif.uTimeout = duration;	
   strcpy(notif.szInfo, message);
   strcpy(notif.szInfoTitle, title);
   Shell_NotifyIcon(NIM_MODIFY, &notif);	
}

int show_popup(HWND hwnd) {
   HMENU hmMenu;
   HMENU hmSubMenu;
   POINT lpClickedPoint;
   
   GetCursorPos(&lpClickedPoint);  
   hmMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_POPUPMENU));
   hmSubMenu = GetSubMenu(hmMenu, 0);
   if(!hmSubMenu) {
     DestroyMenu(hmMenu);
     return -1;
   }      
   
   SetForegroundWindow(hwnd);
   TrackPopupMenu(hmSubMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_BOTTOMALIGN, lpClickedPoint.x, lpClickedPoint.y, 0, hwnd, NULL);
   SendMessage(hwnd, WM_NULL, 0, 0);
   DestroyMenu(hmMenu);	
   return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
    case WM_CREATE:
    	if(!Shell_NotifyIcon(NIM_ADD, &notif)) 
    	  DestroyWindow(hwnd);
    	break;

    case WM_USR_NOTIF:
      switch(LOWORD(lParam)) {
      	case WM_RBUTTONDOWN:
          if(show_popup(hwnd) == -1)
            return -1;
        break;
      }	
    break;
    
    case WM_COMMAND:
    	switch(LOWORD(wParam)) {
        case IDM_HELLO:
        	show_notification(5000, appname, "Hello!");
        	return;
        break;
        case IDM_CLOSE:
        	SendMessage(hwnd, WM_DESTROY, 0, 0);
        break;
    	}

    case WM_DESTROY: {
    	Shell_NotifyIcon(NIM_DELETE, &notif);
    	PostQuitMessage(0);
    	break;
    }
    
    default:
    	return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc;
	HWND hwnd;
	MSG msg;

	memset(&wc,0,sizeof(wc));
	wc.cbSize     = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc;
	wc.hInstance	 = hInstance;
	wc.hCursor     = LoadCursor(NULL, IDC_ARROW);
	
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon     = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIconSm     = LoadIcon(NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wc)) {
    MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
    return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass", appname, WS_VISIBLE|WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    640,
    480,
    NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
    MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
    return 0;
	}

	notif.cbSize = sizeof(NOTIFYICONDATA);
	notif.uID = 100;
	notif.hWnd = hwnd;
	notif.uFlags = NIF_ICON | NIF_SHOWTIP | NIF_INFO | NIF_MESSAGE | NIF_TIP;
	notif.hIcon = LoadIcon(hInstance, (LPCTSTR)MAKEINTRESOURCE(IDI_ICON_SYS_TRAY1));
	strcpy(notif.szTip, appname);
	notif.uCallbackMessage = WM_USR_NOTIF;
	notif.dwInfoFlags = NIIF_INFO;	

	if(!Shell_NotifyIcon(NIM_ADD, &notif))
	  return 0;

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

0

2

Для добавление в область уведомления:

Код:
	notif.cbSize = sizeof(NOTIFYICONDATA);
	notif.uID = 100;
	notif.hWnd = hwnd;
	notif.uFlags = NIF_ICON | NIF_SHOWTIP | NIF_INFO | NIF_MESSAGE | NIF_TIP;
	notif.hIcon = LoadIcon(hInstance, (LPCTSTR)MAKEINTRESOURCE(IDI_ICON_SYS_TRAY1));
	strcpy(notif.szTip, appname);
	notif.uCallbackMessage = WM_USR_NOTIF;
	notif.dwInfoFlags = NIIF_INFO;	

	if(!Shell_NotifyIcon(NIM_ADD, &notif))
	  return 0;

Для отображение меню:

Код:
int show_popup(HWND hwnd) {
   HMENU hmMenu;
   HMENU hmSubMenu;
   POINT lpClickedPoint;
   
   GetCursorPos(&lpClickedPoint);  
   hmMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_POPUPMENU));
   hmSubMenu = GetSubMenu(hmMenu, 0);
   if(!hmSubMenu) {
     DestroyMenu(hmMenu);
     return -1;
   }      
   
   SetForegroundWindow(hwnd);
   TrackPopupMenu(hmSubMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_BOTTOMALIGN, lpClickedPoint.x, lpClickedPoint.y, 0, hwnd, NULL);
   SendMessage(hwnd, WM_NULL, 0, 0);
   DestroyMenu(hmMenu);	
   return 0;
}

Для показания оповещания:

Код:
void show_notification(int duration, char *title, char *message) {
   notif.uTimeout = duration;	
   strcpy(notif.szInfo, message);
   strcpy(notif.szInfoTitle, title);
   Shell_NotifyIcon(NIM_MODIFY, &notif);	
}

0


Вы здесь » Программирование на старых и современных языках, а так-же дизайн » Си/Си++ » Область уведомлений в Win32, на Dev-C++ 5.11