Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Падсказка над иконкой в трее


demon ©   (2009-01-03 17:11:00) 

Как сделать длинную всплывающую подсказку над иконкой в трее?
Если использовать NotifyIconData_50, то длинна ограничиваеться 63 символами


demon   (2009-01-04 23:37:00) [1]

Вот как это реализовал, все работает как задумано, покритикуйте код:

program hint;

uses
 Windows,  Messages;

const
 WndClass   = 'TWinApiWnd';
 WndCaption = 'Работа с Hint (Нажми и тащи)';
 hintClass  = 'HintClass';

var
 Wc  : TWndClassEx;
 Wnd : HWND;
 Msg : TMsg;
 BRUSH: HBRUSH;
 flag: boolean = false;
 HinthWnd: Hwnd;
 BRUSH_HINT_BK : HBRUSH;

procedure ShowHint(x, y: integer; Strings: array of string);
const
 MaxCount = 9;
var
 Font:  hFont;
 rect1: Trect;
 wrkPenNew: hPen;
 dc: hdc;
 pt: TSize;
 p : pChar;
 count, MaxLength, i: integer;
begin
 MaxLength:=0;

 // получаем количество строк
 for i:=0 to MaxCount do
   if Strings[i]='' then break;
 count:= i;

 dc := GetDc(HinthWnd);
 Font := CreateFont(14, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH, 'MS Sans Serif');
 SelectObject(DC, Font);

 // Найдем самую длинную строку
 for i:=0 to MaxCount do
 begin
   GetTextExtentPoint32(dc, Pchar(Strings[i]), Length(Strings[i]), pt);
   if pt.cx > MaxLength then MaxLength := pt.cx;
 end;

 SetWindowPos (HinthWnd, 0, x,y, MaxLength + 6, 14*count+4, SWP_NOACTIVATE + SWP_SHOWWINDOW) ;
 ShowWindow(HinthWnd, SW_SHOWNORMAL);
 GetClientRect(HinthWnd, rect1);

 // рамка
 wrkPenNew:=CreatePen(PS_SOLID,1, $000000);
 SelectObject(DC,wrkPenNew);
 LineTo(DC, rect1.Right-1,0);
 LineTo(DC, rect1.Right-1,  rect1.Bottom-1);
 LineTo(DC, 0, rect1.Bottom-1);
 LineTo(DC, 0, 0);
 DeleteObject(wrkPenNew);

 SetBkMode(DC, Transparent);
 SetTextColor(DC, $000000);

 for i:=0 to Count-1 do
   TextOut(DC, 3, 2+i*14, PChar(Strings[i]), Length(Strings[i]) );

 ReleaseDC(HinthWnd, DC);
 DeleteObject(Font);
end;

function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
var
 p: tpoint;
 Strings : array [0..9] of string;
begin
  case Msg of

     WM_CLOSE:
     begin
       result:=0;
       halt;
     end;

     WM_LBUTTONDOWN  :
     begin
      flag:=true;
      result:=0;
     end;

     WM_LBUTTONUP :
     begin
       ShowWindow(HinthWnd, SW_HIDE);
       flag:=false;
       result:=0;
     end;

     WM_MOUSEMOVE:
     begin
       if flag then
       begin
         GetCursorPos(p);
         Strings[0]:='Test hint :)...';
         Strings[1]:='еще одна страка';
         Strings[2]:='А это третья, самая длинная строка.';
         ShowHint(p.X + 3, p.y + 34, Strings );
       end;
       result:=0;
     end;
     else
       Result := DefWindowProc( Wnd, Msg, wParam, lParam );
  end;
end;

begin
 BRUSH  := CreateSolidBrush( $000000 );
 BRUSH_HINT_BK := CreateSolidBrush( GetSysColor(COLOR_INFOBK) );

 with Wc do
 begin
   cbSize := SizeOf( Wc );
   style := CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS or CS_DROPSHADOW;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := hInstance;
   hIcon := LoadIcon( 0, IDI_APPLICATION );
   hCursor := LoadCursor( 0, IDC_ARROW );
   hbrBackground := BRUSH;
   lpszMenuName := nil;
   lpszClassName := WndClass;
  end;

 RegisterClassEx( Wc );

 Wnd := CreateWindowEx(
   0, WndClass,
   WndCaption,
   WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN,
   400, 200, 300, 300,
   0, 0, hInstance, nil );

 // создаем окно хинта
 with Wc do
 begin
   cbSize := SizeOf( Wc );
   style := 0;
   lpfnWndProc := @DefWindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := hInstance;
   //      hIcon := LoadIcon( 0, IDI_APPLICATION );
   //      hCursor := LoadCursor( 0, IDC_ARROW );
   hbrBackground := BRUSH_HINT_BK;
   lpszMenuName := nil;
   lpszClassName := HintClass;
 end;

 RegisterClassEx( Wc );

 HinthWnd := CreateWindowEx(
   WS_EX_TOPMOST or
   WS_EX_TOOLWINDOW,
   HintClass,
   '',
   WS_POPUP,
   400, 200, 300, 15,
   0, 0,
   hInstance,
   nil );

 ShowWindow( Wnd, SW_SHOWNORMAL );

 while GetMessage( Msg, 0, 0, 0 ) do
 begin
   TranslateMessage( Msg );
   DispatchMessage( Msg );
 end;
 Halt( Msg.wParam );
end.


Johnmen   (2009-01-04 01:08:00) [2]


> demon ©   (04.01.09 00:52) [10]
> Johnmen, спасибо тебе за помощь

Пожалуйста. Обращайтесь ещё.


demon   (2009-01-04 00:52:00) [3]

Разобрался GetSysColor(COLOR_INFOBK)

Johnmen, спасибо тебе за помощь


Johnmen   (2009-01-04 00:45:00) [4]


> но у меня прога на API

Да никто и не сомневается, что ты реальный пацан, пишущий реальные проги. Не боись...


Johnmen   (2009-01-04 00:43:00) [5]


>  Падсказка над иконкой в трее

Вот просто интересно, слово "Падсказка" от слова "падла"?


demon   (2009-01-04 00:43:00) [6]

Работает, но у меня прога на API, незнаю как это прикрутить...


Anatoly Podgoretsky   (2009-01-04 00:34:00) [7]

Проверь clInfoBk работает ли на ХР и выше


demon   (2009-01-04 00:26:00) [8]

А как получить цвет который установлен для фона всех хинтов в системе?


blackman   (2009-01-03 21:23:00) [9]

Хинт любой формы
http://articles.org.ru/cfaq/index.php?qid=511
Всплывающая подсказка
http://articles.org.ru/lessond/les19.php


KilkennyCat   (2009-01-03 17:23:00) [10]

ToolTip + MSDN и вопросов не будет.


demon   (2009-01-03 17:20:00) [11]

А может есть какие наработки у кого, примеры кода, а тотьма вопросов возникает


DVM   (2009-01-03 17:16:00) [12]


> demon ©

Сделай свое окно там как делают антивирусы многие. И цитируй там хоть Войну и Мир с картинками.


Наверх

Титульная страница Поиск, карта сайта Написать письмо