Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Иконка в SysTray

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4

Открыть новую тему     Написать ответ в эту тему

a4n



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
=)) дак ты сам вначале разверись, потом посылай читать! Не знаю рабочий ли у тебя код, но коментариев излишне
 
Иконку я сделал, сейчас приведу в порядок код и выкину. Для CreateIconIndirect надо маску и собсно битовый массив, маска должна быть квадрат просто монохромный, а я её вообще не делал, указал битмапа два одинаковых с моим рисунком.
 
p.s код на mfc и на vcl сильно отличаються.
 
Добавлено:
 CClientDC dc(this);
   CRect rect;  
   CDC dcMem;  
   CBitmap bitmap, *pBitmap;
   HFONT font;  
   font = CreateFont(0 , 6,1,2,400,false,      
                         true,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS ,  
                         CLIP_CHARACTER_PRECIS,PROOF_QUALITY, VARIABLE_PITCH,  
                         CString("Courier New"));  
   dcMem.CreateCompatibleDC(&dc);  
   SelectObject(dcMem,font);  
   rect.left=0;  
   rect.top=0;  
   rect.right=16;  
   rect.bottom=16;  
 
   dc.BitBlt(0,0,rect.right,rect.bottom,&dcMem,0,0,SRCCOPY);
   bitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);  
   pBitmap=dcMem.SelectObject(&bitmap);  
   dcMem.DrawText("a4n",rect,DT_CENTER|DT_VCENTER);  
 
   //Create a icon
   ICONINFO iinfo={true, 0,0, bitmap, bitmap};
   HICON hicon = CreateIconIndirect(&iinfo);
 
   NOTIFYICONDATA ndata;
   ndata.cbSize=sizeof(NOTIFYICONDATA);
   ndata.uID=2000;
   ndata.hWnd=m_hWnd;
   ndata.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
   ndata.uCallbackMessage=MYWM_NOTIFYICON;
   ndata.hIcon= hicon;
   strcpy(ndata.szTip,"подсказка");  
   Shell_NotifyIcon(NIM_ADD,&ndata);
 

Всего записей: 81 | Зарегистр. 02-12-2004 | Отправлено: 09:08 12-10-2005 | Исправлено: a4n, 15:05 12-10-2005
a4n



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а если добавить вот это, то можно под текст картинку запихнуть красиво
CBitmap bitmap, *pBitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
pBitmap=dcMem.SelectObject(&bitmap);
SetBkMode(dcMem,TRANSPARENT);

Всего записей: 81 | Зарегистр. 02-12-2004 | Отправлено: 17:18 12-10-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
a4n
А вот теперь я вспомнил, почему у меня так битмапы отличаются и называются XOR и AND, короче мне хотелось сделать не просто текст в иконке, а чтобы как у тотал командера при копировании, когда он в трей свернут, то есть квадратненький индикатор копирования, на котором циферки бегут (а я то думаю, че у меня так сложно, по сравнению с твоим кодом, я долго подбирал флаги, чтобы правильно инвертировались цвета, то есть если на данной линии фон белый, то часть буквы синяя и наоборот).

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:05 13-10-2005
a4n



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
=)
 
С подборкой там самая запара. Мне до сих пор шрифт не подобрать и фон под него хорший =)

Всего записей: 81 | Зарегистр. 02-12-2004 | Отправлено: 12:07 13-10-2005
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Зраствуйте, ребята. Помогите кто чем может. Необходимы сишные исходники для дельфи, чтобы создать диалоговое окно, поместить иконку проги в трей, через трей вызвать всплывающее меню (через это меню вызвать хотя бы мессаджбокс), через трей в меню открыть что-нибудь или вызвать пресловутый мессаджбокс. Если у вас что-нибудь, выложите на какой-нибудь файлообменник. Понимаю что моя просьба наверное самая глупая здесь будет, но я новичок в программировании. Поймите правильно. Нужно все по простецки.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 01:50 23-06-2007
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Необходимы сишные исходники для дельфи

Я правильно понял? Может тебе еще бейсиковские для фортрана дать?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:30 23-06-2007
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не так сказал. Ну просто начал работать в Дельфи, глядя в Windows SDK. Там не все сразу понятно. Я ж говорю что я новичок, поэтому и прошу помощи. :)

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:02 23-06-2007 | Исправлено: Maks150988, 12:02 23-06-2007
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если ты всетаки о раскале то вот пример простой но я думаю понятный Пример

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 12:38 24-06-2007
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за пример. Но поймите правильно, мне это все равно что младенцу дать примеры интегралов из высшей математики и сказать чтобы он решил их. :-)
Хотя бы посмотреть как что взаимодействует с ресурсами. А то я даже не знаю как функции и процедуры правильно приделать.
Также и проблемно найти исходник для отображения окна поверх других окон. Смысл таков: есть диалоговое окно. На нем есть чекбокс. Отмечаешь его - окно поверх, убираешь галочку - нормальное состояние окна. Как ни скачаю примеры, везде идет работа с формами. Поделитесь плиз у кого есть то что мне нужно.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:14 24-06-2007
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Тогда вначале возьми лубую книгу для начинающих по дельфи и разберись, так как сомневаюсь, что кто то будет тебе разжевывать работу с АПИ на дельфи - это не самое приятное дело - объяснять АПИ новичку, который ничего не знает.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:03 25-06-2007
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt, дык в этом и проблема. Как не возьму книгу про Дельфи, везде идет работа с формами... И все типовые примерчики тоже основаны на работе с формами. Не было б вопросов, не спрашивал бы здесь... Неохото делать программу с формами.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:10 25-06-2007
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вначале разберись с логикой работы на Дельфи, иначе вот такой код

Код:
 
procedure OnDrawItem(const DStr:PDRAWITEMSTRUCT);
var
     DC                 :HDC;
     Rect               :TRect;
     BtnText            Char;
     hFont,hTFont       :HGDIOBJ;
begin
   case DStr.CtlType of
   ODT_BUTTON:
   begin
      DC:=DStr.hDC;
      Rect:=DStr.rcItem;
      case DStr.CtlID of
      BTN_CLOSE: begin
          Dec(Rect.Right);
 

сведет тебя с ума.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:27 26-06-2007
BukaP

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как я понял tray - это окно класса "TrayNotifyWnd", в которое Explorer добавляет Icon.
Подскажите пожалуйста, как получить координаты добавленного Icon?

Всего записей: 34 | Зарегистр. 22-09-2003 | Отправлено: 17:39 01-08-2007
BukaP

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очень помог проект:
http://www.codeproject.com/tools/ShellTrayInfo.asp
 
Мой код:
(Фунция принимает в качестве входного параметра дескриптор окна и идентификатор искомой иконки)
 

Код:
 
BOOL CStudyTrayDlg::isCurOnTrayIcon(HWND hIconWnd, UINT iconID)
{
    CString tmpStr = "";
    struct TRAYDATA
    {
        HWND hwnd;                
        UINT uID;                
        UINT uCallbackMessage;    
        DWORD Reserved[2];        
        HICON hIcon;                
    };
 
    //Получение дескриптора окна ToolbarWindow32 содержащего иконки
    HWND hToolBarWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
    if(hToolBarWnd)
    {
        hToolBarWnd = ::FindWindowEx(hToolBarWnd, NULL, _T("TrayNotifyWnd"), NULL);
        if(hToolBarWnd)
        {
            hToolBarWnd = ::FindWindowEx(hToolBarWnd , NULL, _T("SysPager"), NULL);
            if(hToolBarWnd)
            {                
                hToolBarWnd = ::FindWindowEx(hToolBarWnd, NULL, _T("ToolbarWindow32"), NULL);
            }
        }
    }
    if (hToolBarWnd == NULL)
    {
        AfxMessageBox("Не удалось получить дескриптор ToolbarWindow32!", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
 
    //Получение идентификатора процесса Tray
    DWORD trayID;
    GetWindowThreadProcessId(hToolBarWnd, &trayID);
     
    //Получение количества кнопок в окне ToolbarWindow32
    int countButton = (int)::SendMessage(hToolBarWnd, TB_BUTTONCOUNT, 0, 0);
     
    //Получение дескриптора процесса по его ID
    HANDLE hTrayProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, trayID);
    if (!hTrayProc)
    {
        AfxMessageBox("Не удалось получить дескриптор процесса Tray!", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
 
    //Выделение памяти в процессе Tray для доступа к резултатам обработки посылаемых событий
    const LPVOID pTrayData = VirtualAllocEx(
                                            hTrayProc,            //Дексриптор процесса в котором выделяем память
                                            NULL,                //Адресс начала выделения (NULL - выберается системой)
                                            sizeof(TBBUTTON),    //Размер выделяемой области памяти
                                            MEM_COMMIT,            //Программное распеределение памяти
                                            PAGE_READWRITE        //Разрешение на чтение и запись памяти
                                        );
    if (!pTrayData)
    {
        CloseHandle(hTrayProc);
        AfxMessageBox("Не удалось выделить виртуальную память!", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
    const LPVOID pIconRect = pTrayData;        //Переменная указывающая на туже области для структуры данных иконки
 
    TBBUTTON buttonData        =    {0};        //Структура данных кнопки окна Toolbar
    TRAYDATA iconData        =    {0};        //Cтруктура данных иконцки кнопки окна Toolbar
    RECT iconRect            =    {0};        //Координаты иконки
 
    //Получение координат иконки в окне Toolbar
    for(int num = 0; num < countButton; ++num)
    {    
        //Заполнение памяти структурой данных об кнопке Toolbar
        ::SendMessage(
                        hToolBarWnd,                    //Дескриптор окна Toolbar  
                        TB_GETBUTTON,                    //Запрос информации об кнопках
                        num,                            //Номер кнопки от 0 до countButton
                        (LPARAM)pTrayData                //Указатель на выделенную область памяти
                    );
 
        //Считывание из памяти процесса структуры TBBUTTON
        if (!ReadProcessMemory(
                                hTrayProc,                //Дескриптор процесса
                                pTrayData,                //Указатель на считываемую область памяти
                                (LPVOID)&buttonData,    //Указатель на сохраняемую область памяти
                                sizeof(TBBUTTON),        //Размер копируемой памяти
                                NULL                    //Количество считанных байт
                            )
        )
        {
            VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
            CloseHandle(hTrayProc);
            AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
            return FALSE;
        }
 
        //Получение структуры TRAYDATA
        if (!ReadProcessMemory(
                                hTrayProc,
                                (LPCVOID)buttonData.dwData,
                                &iconData,
                                sizeof(TRAYDATA),
                                NULL
                            )
        )
        {
            VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
            CloseHandle(hTrayProc);
            AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
            return FALSE;
        }
 
        //Проверка соответсвия иконки заданным параметрам
        //Критерий поиска дескриптор окна и идентификатор ресурса
        if ((iconData.hwnd == hIconWnd) && (iconData.uID == iconID))
        {
            //Получение размера Icon
            ::SendMessage(hToolBarWnd, TB_GETRECT, buttonData.idCommand, (LPARAM)pIconRect);
            if (!ReadProcessMemory(
                                hTrayProc,
                                pIconRect,
                                (LPVOID)&iconRect,
                                sizeof(RECT),
                                NULL
                            )
            )
            {
                VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
                CloseHandle(hTrayProc);
                AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
                return FALSE;
            }
            break;
        }
    }
    VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
    CloseHandle(hTrayProc);
 
    BOOL setIcon    =    FALSE;        //Мышь над иконкой TRUE - да / FALSE - нет
    RECT trayCRect    =    {0};        //Размер клиенской области окна
    RECT trayWRect    =    {0};        //Координаты окна
    POINT curPoint    =    {0};        //Координаты курсора мыши
 
    ::GetWindowRect(hToolBarWnd, &trayWRect);
    ::GetClientRect(hToolBarWnd, &trayCRect);
    ::GetCursorPos(&curPoint);
 
    iconRect.top = trayWRect.top + iconRect.top + 1;
    iconRect.left = trayWRect.left + iconRect.left + 1;
    iconRect.right = trayWRect.left + iconRect.right - 1;
    iconRect.bottom = trayWRect.top + iconRect.bottom - 1;
 
    //Проверка поподания курсора мыши в область иконки
    if ((iconRect.left < curPoint.x) && (iconRect.right > curPoint.x) && (iconRect.top < curPoint.y) && (iconRect.bottom > curPoint.y))
        setIcon = TRUE;
 
    return setIcon;
}
 

Всего записей: 34 | Зарегистр. 22-09-2003 | Отправлено: 16:18 02-08-2007 | Исправлено: BukaP, 15:27 03-08-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Иконка в SysTray


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru