Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Иконка в SysTray

Автор: a4n
Дата сообщения: 12.10.2005 16:18
а если добавить вот это, то можно под текст картинку запихнуть красиво
CBitmap bitmap, *pBitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
pBitmap=dcMem.SelectObject(&bitmap);
SetBkMode(dcMem,TRANSPARENT);
Автор: ShIvADeSt
Дата сообщения: 13.10.2005 01:05
a4n
А вот теперь я вспомнил, почему у меня так битмапы отличаются и называются XOR и AND, короче мне хотелось сделать не просто текст в иконке, а чтобы как у тотал командера при копировании, когда он в трей свернут, то есть квадратненький индикатор копирования, на котором циферки бегут (а я то думаю, че у меня так сложно, по сравнению с твоим кодом, я долго подбирал флаги, чтобы правильно инвертировались цвета, то есть если на данной линии фон белый, то часть буквы синяя и наоборот).
Автор: a4n
Дата сообщения: 13.10.2005 11:07
ShIvADeSt
=)

С подборкой там самая запара. Мне до сих пор шрифт не подобрать и фон под него хорший =)
Автор: Maks150988
Дата сообщения: 23.06.2007 00:50
Зраствуйте, ребята. Помогите кто чем может. Необходимы сишные исходники для дельфи, чтобы создать диалоговое окно, поместить иконку проги в трей, через трей вызвать всплывающее меню (через это меню вызвать хотя бы мессаджбокс), через трей в меню открыть что-нибудь или вызвать пресловутый мессаджбокс. Если у вас что-нибудь, выложите на какой-нибудь файлообменник. Понимаю что моя просьба наверное самая глупая здесь будет, но я новичок в программировании. Поймите правильно. Нужно все по простецки.
Автор: ShIvADeSt
Дата сообщения: 23.06.2007 07:30

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

Я правильно понял? Может тебе еще бейсиковские для фортрана дать?
Автор: Maks150988
Дата сообщения: 23.06.2007 11:02
Не так сказал. Ну просто начал работать в Дельфи, глядя в Windows SDK. Там не все сразу понятно. Я ж говорю что я новичок, поэтому и прошу помощи. :)
Автор: RedPromo
Дата сообщения: 24.06.2007 11:38
Если ты всетаки о раскале то вот пример простой но я думаю понятный [more=Пример]

Код:
{$WRITEABLECONST ON}

unit CTrayIcon;

interface

uses
SysUtils, Classes, Controls, Graphics, ImgList, Menus, Messages, Windows,
ShellAPI, ExtCtrls, Forms;

const
CM_TRAYICONEVENT      = WM_USER + 410;
TIMER_INTERVAL = 50;
DELAY_INTERVAL = 4;
ICON_ID      = 0;
PARTS_VALUE = 20;

type

TCTrayIcon = class(TComponent)
private
//FAboutBox: TCCAboutBox;
FActive: Boolean;
FAnimated: Boolean;
FHandle: THandle;
FIcon: TIcon;
FToolTip: string;
FImageChangeLink: TChangeLink;
FIcons: TImageList;
FInterval: Cardinal;
FIconIndex: Integer;
FPopupMenu: TPopupMenu;
FOwnerDrawMenu: Boolean;
FPreview: Boolean;

FOnMouseUp,
FOnMouseDown,
FOnDoubleClick: TMouseEvent;

procedure SetActive(Value: Boolean);
procedure SetAnimated(Value: Boolean);
procedure SetIcon(Value: TIcon);
procedure SetToolTip(Value: string);
procedure SetIcons(Value: TImageList);
procedure SetInterval(Value: Cardinal);
procedure SetPopupMenu(Value: TPopupMenu);
procedure SetPreview(Value: Boolean);
function GetPreview: Boolean;

procedure IconChange(Sender: TObject);
procedure IconsChange(Sender: TObject);
procedure UpdateTimer;
procedure UpdateIcon;
procedure ModifyIcon(AIcon: TIcon);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure Loaded; override;
procedure WndProc(var Message: TMessage); virtual;
procedure MouseDown(Button: TMouseButton); dynamic;
procedure MouseUp(Button: TMouseButton); dynamic;
procedure DoubleClick(Button: TMouseButton); dynamic;
public
// Set to True when you would like to previiew the icon work in design time.
property Preview: Boolean read GetPreview write SetPreview;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
// Displays information about the control and package version.
//property About: TCCAboutBox read FAboutBox write FAboutBox;
// Active property determines whenever tray icon is visible or not.
property Active: Boolean read FActive write SetActive default False;
// If Animated then (if Icons assigned) animated icon will be displayed otherwise icon will be a static one (Icon property).
//
// See Also:
// Icons
property Animated: Boolean read FAnimated write SetAnimated default False;
// Icon to be shown (if static icon).
//
// See Also:
// Animated
property Icon: TIcon read FIcon write SetIcon;
// Icons animated set will be created from (if animated icon).
//
// See Also:
// Animated
property Icons: TImageList read FIcons write SetIcons;
// If component displays animated icons Interval determineshow often new icon will be taken from the list.
//
// See Also:
// Animated
// Icons
property Interval: Cardinal read FInterval write SetInterval default 200;
// If PopupMenu assigned OwnerDrawMenu controls the way menu will be activated.
// If True then API TrackPopupMenu() will be used, otherwise Popup() method of the TPopupMenu component.
property OwnerDrawMenu: Boolean read FOwnerDrawMenu write FOwnerDrawMenu default False;
// PopupMenu points to TPopupMenu component that will be activated when icon is clicked.
property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu;
// Tool tip to be shown when mouse moves over the icon.
property ToolTip: string read FToolTip write SetToolTip;
// Event occurs when mouse is in icon area and mouse button was hit down.
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
// Event occurs when mouse is in icon area and mouse button was released.
property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
// Event occurs when mouse is in icon area and mouse button was CLICKED twice.
property OnDoubleClick: TMouseEvent read FOnDoubleClick write FOnDoubleClick;
end;


procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Примеры', [TCTrayIcon]);
end;

{TCTrayIcon}
constructor TCTrayIcon.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImageChangeLink := TChangeLink.Create;
FImageChangeLink.OnChange := IconsChange;

FHandle := AllocateHWnd(WndProc);

FIcon := TIcon.Create;
FIcon.OnChange := IconChange;

FActive := False;
FAnimated := False;
FToolTip := '';
FInterval := 200;
FIconIndex := 0;
FOwnerDrawMenu := False;
FPreview := False;
end;

destructor TCTrayIcon.Destroy;
begin
Active := False;
FImageChangeLink.Free;
DeallocateHWnd(FHandle);
FIcon.Free;
inherited Destroy;
end;

procedure TCTrayIcon.SetActive(Value: Boolean);
begin
if FActive <> Value then
begin
FActive := Value;
UpdateTimer;
UpdateIcon;
end;
end;

procedure TCTrayIcon.SetAnimated(Value: Boolean);
begin
if FAnimated <> Value then
begin
FAnimated := Value;
UpdateTimer;
UpdateIcon;
end;
end;

procedure TCTrayIcon.SetIcon(Value: TIcon);
begin
if FIcon <> Value then
FIcon.Assign(Value);
end;

procedure TCTrayIcon.SetToolTip(Value: string);
begin
if Length(Value) > 63 then
SetLength(Value, 63);

if FToolTip <> Value then
begin
FToolTip := Value;
UpdateTimer;
UpdateIcon;
end;
end;

procedure TCTrayIcon.SetIcons(Value: TImageList);
begin
if Assigned(Icons) then
Icons.UnRegisterChanges(FImageChangeLink);

FIcons := Value;

if Assigned(Icons) then
Icons.RegisterChanges(FImageChangeLink);

UpdateTimer;
UpdateIcon;
end;

procedure TCTrayIcon.SetInterval(Value: Cardinal);
begin
if FInterval <> Value then
begin
FInterval := Value;
UpdateTimer;
UpdateIcon;
end;
end;

procedure TCTrayIcon.SetPopupMenu(Value: TPopupMenu);
begin
if FPopupMenu <> Value then
FPopupMenu := Value;
end;

procedure TCTrayIcon.SetPreview(Value: Boolean);
begin
if FPreview <> Value then
begin
FPreview := Value;
UpdateTimer;
UpdateIcon;
end;
end;

function TCTrayIcon.GetPreview: Boolean;
begin
Result := not (csDesigning in ComponentState);
if not Result then
Result := FPreview;
end;

procedure TCTrayIcon.IconChange(Sender: TObject);
begin
UpdateTimer;
UpdateIcon;
end;

procedure TCTrayIcon.IconsChange(Sender: TObject);
begin
UpdateTimer;
UpdateIcon;
end;

procedure TCTrayIcon.UpdateTimer;
begin
KillTimer(FHandle, 1);
if (FInterval <> 0) and FActive and FAnimated and Assigned(FIcons) then
if SetTimer(FHandle, 1, FInterval, nil) = 0 then
raise EOutOfResources.Create('Low resources');
end;

procedure TCTrayIcon.UpdateIcon;
var
IconData: TNotifyIconData;
begin
with IconData do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := FHandle;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
hIcon := FIcon.Handle;
StrPCopy(szTip, FToolTip);
uCallbackMessage := CM_TRAYICONEVENT;
uID := ICON_ID;
end;

if Preview and FActive and (not FIcon.Empty or (FAnimated and Assigned(FIcons))) then
begin
Shell_NotifyIcon(NIM_ADD, @IconData);
Shell_NotifyIcon(NIM_MODIFY, @IconData);
end
else Shell_NotifyIcon(NIM_DELETE, @IconData);
end;

procedure TCTrayIcon.ModifyIcon(AIcon: TIcon);
var
IconData: TNotifyIconData;
begin
with IconData do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := FHandle;
uFlags := NIF_ICON;
hIcon := AIcon.Handle;
uID := ICON_ID;
end;
Shell_NotifyIcon(NIM_MODIFY, @IconData);
end;

procedure TCTrayIcon.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and Assigned(FIcons) and (AComponent = FIcons) then
FIcons := nil;
if (Operation = opRemove) and Assigned(FPopupMenu) and (AComponent = FPopupMenu) then
FPopupMenu := nil;
end;

procedure TCTrayIcon.Loaded;
begin
inherited Loaded;
UpdateTimer;
UpdateIcon;
end;

procedure TCTrayIcon.WndProc(var Message: TMessage);
var
AIcon: TIcon;
begin
with Message do
try
case Msg of
CM_TRAYICONEVENT:
case lParam of
WM_RBUTTONDOWN: MouseDown(mbRight);
WM_LBUTTONDOWN: MouseDown(mbLeft);
WM_RBUTTONUP: MouseUp(mbRight);
WM_LBUTTONUP: MouseUp(mbLeft);
WM_LBUTTONDBLCLK: DoubleClick(mbLeft);
WM_RBUTTONDBLCLK: DoubleClick(mbRight);
end;

WM_TIMER:
if Assigned(FIcons) and (wParam = 1) then
begin
AIcon := TIcon.Create;
try
FIcons.GetIcon(FIconIndex, AIcon);
ModifyIcon(AIcon);
finally
AIcon.Free;
end;

if FIconIndex < Pred(FIcons.Count) then
Inc(FIconIndex) else
FIconIndex := 0;
end;
end;
Result := DefWindowProc(FHandle, Msg, wParam, lParam);
except
Application.HandleException(Self);
end;
end;

procedure TCTrayIcon.MouseDown(Button: TMouseButton);
var
P: TPoint;
begin
GetCursorPos(P);
if Assigned(FOnMouseDown) then
FOnMouseDown(Self, Button, [], P.X, P.Y);
end;

procedure TCTrayIcon.MouseUp(Button: TMouseButton);
var
P: TPoint;
begin
GetCursorPos(P);

if (Assigned(FPopupMenu)) and (Button=mbRight) then
begin
SetForegroundWindow(FHandle);

if not FOwnerDrawMenu then
FPopupMenu.Popup(P.X, P.Y) else
TrackPopupMenu(FPopupMenu.Handle, TPM_LEFTALIGN or TPM_RIGHTBUTTON,
P.X, P.Y, 0, (FPopupMenu.Owner as TWinControl).Handle, nil);

SetForegroundWindow(FHandle);
end;

if Assigned(FOnMouseUp) then
FOnMouseUp(Self, Button, [], P.X, P.Y);
end;

procedure TCTrayIcon.DoubleClick(Button: TMouseButton);
var
P: TPoint;
begin
GetCursorPos(P);
if Assigned(FOnDoubleClick) then
FOnDoubleClick(Self, Button, [], P.X, P.Y);
end;

end.
Автор: Maks150988
Дата сообщения: 24.06.2007 18:14
Спасибо за пример. Но поймите правильно, мне это все равно что младенцу дать примеры интегралов из высшей математики и сказать чтобы он решил их. :-)
Хотя бы посмотреть как что взаимодействует с ресурсами. А то я даже не знаю как функции и процедуры правильно приделать.
Также и проблемно найти исходник для отображения окна поверх других окон. Смысл таков: есть диалоговое окно. На нем есть чекбокс. Отмечаешь его - окно поверх, убираешь галочку - нормальное состояние окна. Как ни скачаю примеры, везде идет работа с формами. Поделитесь плиз у кого есть то что мне нужно.
Автор: ShIvADeSt
Дата сообщения: 25.06.2007 01:03
Maks150988
Тогда вначале возьми лубую книгу для начинающих по дельфи и разберись, так как сомневаюсь, что кто то будет тебе разжевывать работу с АПИ на дельфи - это не самое приятное дело - объяснять АПИ новичку, который ничего не знает.
Автор: Maks150988
Дата сообщения: 25.06.2007 15:10
ShIvADeSt, дык в этом и проблема. Как не возьму книгу про Дельфи, везде идет работа с формами... И все типовые примерчики тоже основаны на работе с формами. Не было б вопросов, не спрашивал бы здесь... Неохото делать программу с формами.
Автор: ShIvADeSt
Дата сообщения: 26.06.2007 01:27
Вначале разберись с логикой работы на Дельфи, иначе вот такой код

Код:
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);
Автор: BukaP
Дата сообщения: 01.08.2007 16:39
Как я понял tray - это окно класса "TrayNotifyWnd", в которое Explorer добавляет Icon.
Подскажите пожалуйста, как получить координаты добавленного Icon?
Автор: BukaP
Дата сообщения: 02.08.2007 15:18
Очень помог проект:
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;
}

Страницы: 123

Предыдущая тема: нуна помощь по Си:)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.