Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перекрыть хинт системных кнопок ? Как перекрыть хинт системных кнопок ? 
V
    Опции темы
ZBugz
  Дата 14.5.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Еще раз привет. А как перекрыть hint системных кнопок формы ? Ну те что закрыть\свернуть\минимизировать ?
 smile 
PM MAIL   Вверх
ZBugz
Дата 14.5.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Нашел такой для кнопок, когда тыкаешь правой кнопкой на программу, меню, работает smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ChangeMenuLanguage(AHandle: THandle);
const
  RusTranscriptionCount = 6;
  SysMenuID: array [0..RusTranscriptionCount - 1] of UINT =
    (SC_RESTORE, SC_MOVE, SC_SIZE, SC_MINIMIZE, SC_MAXIMIZE, SC_CLOSE);
  RusTranscription: array [0..RusTranscriptionCount - 1] of String =
    ( '&Восстановить', '&Переместить', '&Размер', '&Свернуть',
      'Р&азвернуть', '&Закрыть'#9'Alt+F4');
var
  SysMenu: HMENU;
  MenuItem: TMenuItemInfo;
  ItemCount, I, A: Integer;
  MenuString: array [0..MAXCHAR - 1] of Char;
begin
  SysMenu := GetSystemMenu(AHandle, False);
  if SysMenu <> 0 then
  begin
    ItemCount := GetMenuItemCount(SysMenu);
    for I := 0 to ItemCount - 1 do
    begin
      ZeroMemory(@MenuItem, SizeOf(TMenuItemInfo));
      MenuItem.cbSize := SizeOf(TMenuItemInfo);
      MenuItem.fMask := MIIM_ID or MIIM_STRING or MIIM_BITMAP;
      MenuItem.dwTypeData := MenuString;
      MenuItem.cch := MAXCHAR;
      if GetMenuItemInfo(SysMenu, I, True, MenuItem) then
        for A := 0 to RusTranscriptionCount - 1 do
          if SysMenuID[A] = MenuItem.wID then
          begin
            MenuItem.dwTypeData := PChar(RusTranscription[A]);
            MenuItem.cch := Length(RusTranscription[A]);
            if not SetMenuItemInfo(SysMenu, I, True, MenuItem) then RaiseLastOSError;
          end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ChangeMenuLanguage(Handle);
  ChangeMenuLanguage(Application.Handle);
end;


Осталось на hint на кнопках ссвернуть\развернуть\минимизировать перехватить smile Жду пример  smile 
PM MAIL   Вверх
Amphiluke
Дата 18.5.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Как методически правильно отловить непосредственно сам момент всплывания системного tooltip'а и изменить поведение по умолчанию, хз.
Однако создать видимость «подмены» всплывающих подсказок (или скрыть их вообще нафиг) очень просто. Для этого сначала выясняем класс окна системного tooltip'а. Нашли, допустим, что это '#32774'.
Создаем в своем проекте, если необходимо, отдельную форму, которая будет подменять системный tooltip. Задаем ей атрибуты FormStyle=fsStayOnTop и BorderStyle=bsNone. Кидаем на форму компонент TLabel.
Далее пишем перехватчик мышиных событий в неклиентской области главного окна.
Код

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  end;

.............................

procedure TForm2.WMNCMouseMove(var Msg: TMessage);
var
  uFlag: Cardinal;
  sText: string;
begin
  inherited;

  sText := 'not visible';
  uFlag := SWP_SHOWWINDOW;
  case Msg.WParam of
    HTCLOSE: Form3.Label1.Caption := #13#10'Close [X]';
    HTMAXBUTTON: Form3.Label1.Caption := #13#10'Maximize [+]';
    HTMINBUTTON: Form3.Label1.Caption := #13#10'Minimize [-]';
  else
    uFlag := SWP_HIDEWINDOW;
  end;

  SetWindowPos(Form3.Handle, HWND_TOPMOST, Mouse.CursorPos.X,
    Mouse.CursorPos.Y + 20, Form3.Width, Form3.Height, uFlag or SWP_NOACTIVATE);
  if uFlag = SWP_SHOWWINDOW then
    EnumWindows(@HideSystemTooltip, 0);
end;


Последняя строка в этом обработчике удаляет системную подсказку, которая норовит вылезти при наведении на кнопки в заголовке окна. Вот функция-удалялка.
Код

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      ShowWindow(Wnd, SW_HIDE);
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;


Если в методе WMNCMouseMove убрать все начисто, за исключением строки 
Код

EnumWindows(@HideSystemTooltip, 0);

то просто получится эффект, при котором системная подсказка не будет появляться. Вот так.

В архиве пример с исходниками и программой.


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Titlebar_Hints.rar 189,11 Kb
PM   Вверх
ZBugz
  Дата 19.5.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Прикольно, работает.

Теперь тогда вопрос, а как созать свой хинт ?  smile А то с формой не красиво
PM MAIL   Вверх
Amphiluke
Дата 19.5.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Ну так добро пожаловать в MSDN.  smile

Добавлено через 1 минуту и 28 секунд
Ага. Ссылку не совсем точно дал.
http://msdn.microsoft.com/en-us/library/bb...6(v=VS.85).aspx
PM   Вверх
ZBugz
Дата 19.5.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(Amphiluke @ 19.5.2010,  14:20)
Ну так добро пожаловать в MSDN.  smile

Добавлено @ 14:22
Ага. Ссылку не совсем точно дал.
http://msdn.microsoft.com/en-us/library/bb...6(v=VS.85).aspx

Я там ниче не понимаю smile  А в инете тока примеры с панелями и формами... Лана, если что будет, жду smile А так если осилю, отпишу тут.

Я это вылавливаю потому, что при использовании забугорских и наших скинируемых компонентов, косяки с надписями возникают, т.е. показывают в основном английские, а хотца что бы моих мультиязычных приложениях все было переведенно.
PM MAIL   Вверх
Amphiluke
Дата 19.5.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Цитата(ZBugz @  19.5.2010,  18:29 Найти цитируемый пост)
Я там ниче не понимаю

Там вся работа только перевести готовый код с C на Delphi, а сам-то код уже готовый ждет вас там.

Вот: попробовал адаптировать для вашей задачи пример из MSDN создания собственного tooltip'а и управления им. Все отличие в том, что в их примере tooltip создается для обычной кнопки, а здесь — для кнопок в заголовке окна... Как вы и желали, никаких дополнительных форм создавать не нужно. Вот полный модуль приложения:
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CommCtrl, StdCtrls;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  g_toolItem: TOOLINFO;
  g_hwndTrackingTT: HWND;
  g_TrackingMouse: Boolean;
  oldX, oldY: Integer;

implementation

{$R *.dfm}

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      ShowWindow(Wnd, SW_HIDE);
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;

function CreateTrackingToolTip(toolID: Integer; hDlg: HWND;
  const pText: string): HWND;
var
  hwndTT: HWND;
begin
  Result := 0;
  // Create a tooltip.
  hwndTT := CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, nil,
    WS_POPUP or TTS_NOPREFIX or TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT, hDlg, 0, HInstance, nil);
  if (hwndTT = 0) then Exit;

  // Set up tool information.
  // In this case, the "tool" is the entire parent window.
  g_toolItem.cbSize := SizeOf(TOOLINFO);
  g_toolItem.uFlags := TTF_IDISHWND or TTF_TRACK or TTF_ABSOLUTE;
  g_toolItem.hwnd := hDlg;
  g_toolItem.hinst := HInstance;
  g_toolItem.lpszText := @pText[1];
  g_toolItem.uId := hDlg;
  GetClientRect(hDlg, g_toolItem.rect);

  // Associate the tooltip with the tool window.
  SendMessage(hwndTT, TTM_ADDTOOL, 0, LPARAM(PTOOLINFO(@g_toolItem)));
  Result := hwndTT;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  g_hwndTrackingTT := CreateTrackingToolTip(0, Handle, '');
end;

procedure TForm2.WMNCMouseMove(var Msg: TMessage);
var
  newX, newY: Integer;
  tme: Windows.TTrackMouseEvent;
  coords: string;
  pt: TPoint;
begin
  inherited;

  EnumWindows(@HideSystemTooltip, 0);

  g_TrackingMouse := (Msg.WParam = HTCLOSE) or (Msg.WParam = HTMAXBUTTON) or
    (Msg.WParam = HTMINBUTTON);

  if (not g_TrackingMouse) then // The mouse has just entered the window.
  begin
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, 0, LPARAM(@g_toolItem));
    Exit;
  end
  else
  begin
    // Request notification when the mouse leaves.
    tme.cbSize := SizeOf(TTrackMouseEvent);
    tme.hwndTrack := Handle;
    tme.dwFlags := TME_LEAVE;
    TrackMouseEvent(tme);

    // Activate the tooltip.
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, 1, LPARAM(@g_toolItem));
  end;

  newX := Mouse.CursorPos.X;
  newY := Mouse.CursorPos.Y;

  // Make sure the mouse has actually moved. The presence of the tooltip
  // causes Windows to send the message continuously.
  if ((newX <> oldX) or (newY <> oldY)) then
  begin
    oldX := newX;
    oldY := newY;

    // Update the text.
    coords := IntToStr(newX) + ', ' + IntToStr(newY);
    g_toolItem.lpszText := @coords[1];
    SendMessage(g_hwndTrackingTT, TTM_SETTOOLINFO, 0, LPARAM(@g_toolItem));

    // Position the tooltip.
    // The coordinates are adjusted so that the tooltip does not
    // overlap the mouse pointer.
    pt.X := newX;
    pt.Y := newY;
    SendMessage(g_hwndTrackingTT, TTM_TRACKPOSITION, 0,
      LPARAM(MakeLong(pt.x + 10, pt.y - 20)));
  end;
end;

end.

PM   Вверх
ZBugz
  Дата 20.5.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Все, спасибо  smile 
Пример прилагаю. Достойно DPKB  smile Ни у кого нету такого примера smile По крайне мере я не нашел.

Есдинственно замечание: На Delphi 6 все работает. На Delphi 2010 что бы заработали hints у кнопок, надо включить в свойствах проекта "Enable runtime themes"

Проверяйте, если что, отпишите тут, что я не так там написал...

Это сообщение отредактировал(а) ZBugz - 20.5.2010, 14:43

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  SystemHint.rar 4,37 Kb
PM MAIL   Вверх
Amphiluke
Дата 20.5.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Есть еще направления оптимизации этой программы. smile
Дело в том, что системный tooltip «обслуживает» все окна, имеющие заголовок с кнопками, т.е. он присутствует в системе в единственном экземпляре. Иными словами, то окно класса '#32774' достаточно отыскать при помощи EnumWindows лишь один раз, сохранить его дескриптор в переменной, и больше в перехватчике сообщения WM_NCMOUSEMOVE не затрачивать время на перебор окон и поиск среди них окна класса '#32774'.
Это вам домашнее задание, если хотите. smile

Добавлено через 14 минут и 3 секунды
P.S. Немного не так выразился, как хотел. Самое главное, что системный tooltip не пересоздается всякий раз, когда должна всплывать подсказка и не уничтожается, когда она должна исчезнуть. Именно поэтому можно один раз найти и сохранить Handle окна tooltip'а и потом использовать его.
А то, что системный tooltip обслуживает и остальные окна, — это да, но имеет второстепенное значение в данном случае.
PM   Вверх
ZBugz
Дата 20.5.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Спасибо конечно, я такой профан в этом, что домашнее задание не получиться  smile 
Я на уровне "Hello word" пока  smile 
PM MAIL   Вверх
Amphiluke
Дата 20.5.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Ладно. Грех, конечно user posted image , но покажу тогда сам, что имел в виду. Если вдруг кому-нибудь еще понадобится, то пусть будет чуть более завершенный пример для использования...
Вот как в конечном виде может выглядеть код для этой задачки.
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CommCtrl, StdCtrls;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    SysTooltip: HWND;
    g_toolItem: TOOLINFO;
    g_hwndTrackingTT: HWND;
    g_TrackingMouse: Boolean;
    oldX, oldY: Integer;
    function CreateTrackingToolTip(toolID: Integer; hDlg: HWND;
      const pText: string): HWND;
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      Form2.SysTooltip := Wnd;
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;

function TForm2.CreateTrackingToolTip(toolID: Integer; hDlg: HWND;
  const pText: string): HWND;
var
  hwndTT: HWND;
begin
  Result := 0;
  // Create a tooltip.
  hwndTT := CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, nil,
    WS_POPUP or TTS_NOPREFIX or TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT, hDlg, 0, HInstance, nil);
  if (hwndTT = 0) then Exit;

  // Set up tool information.
  // In this case, the "tool" is the entire parent window.
  g_toolItem.cbSize := SizeOf(TOOLINFO);
  g_toolItem.uFlags := TTF_IDISHWND or TTF_TRACK or TTF_ABSOLUTE;
  g_toolItem.hwnd := hDlg;
  g_toolItem.hinst := HInstance;
  g_toolItem.lpszText := @pText[1];
  g_toolItem.uId := hDlg;
  Windows.GetClientRect(hDlg, g_toolItem.rect);

  // Associate the tooltip with the tool window.
  SendMessage(hwndTT, TTM_ADDTOOL, 0, LPARAM(PTOOLINFO(@g_toolItem)));
  Result := hwndTT;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  SysTooltip := 0;
  g_hwndTrackingTT := CreateTrackingToolTip(0, Handle, '');
end;

procedure TForm2.WMNCMouseMove(var Msg: TMessage);
var
  newX, newY: Integer;
  tme: Windows.TTrackMouseEvent;
  coords: string;
  pt: TPoint;
begin
  inherited;

  if not IsWindow(SysTooltip) then  
    EnumWindows(@HideSystemTooltip, 0);
  if IsWindowVisible(SysTooltip) then
    ShowWindow(SysTooltip, SW_HIDE);

  g_TrackingMouse := (Msg.WParam = HTCLOSE) or (Msg.WParam = HTMAXBUTTON) or
    (Msg.WParam = HTMINBUTTON);

  if (not g_TrackingMouse) then // The mouse has just entered the window.
  begin
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, 0, LPARAM(@g_toolItem));
    Exit;
  end
  else
  begin
    // Request notification when the mouse leaves.
    tme.cbSize := SizeOf(TTrackMouseEvent);
    tme.hwndTrack := Handle;
    tme.dwFlags := TME_LEAVE;
    TrackMouseEvent(tme);

    // Activate the tooltip.
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, 1, LPARAM(@g_toolItem));
  end;

  newX := Mouse.CursorPos.X;
  newY := Mouse.CursorPos.Y;

  // Make sure the mouse has actually moved. The presence of the tooltip
  // causes Windows to send the message continuously.
  if ((newX <> oldX) or (newY <> oldY)) then
  begin
    oldX := newX;
    oldY := newY;

    // Update the text.
    coords := IntToStr(newX) + ', ' + IntToStr(newY);
    g_toolItem.lpszText := @coords[1];
    SendMessage(g_hwndTrackingTT, TTM_SETTOOLINFO, 0, LPARAM(@g_toolItem));

    // Position the tooltip.
    // The coordinates are adjusted so that the tooltip does not
    // overlap the mouse pointer.
    pt.X := newX;
    pt.Y := newY;
    SendMessage(g_hwndTrackingTT, TTM_TRACKPOSITION, 0,
      LPARAM(MakeLong(pt.x + 10, pt.y - 20)));
  end;
end;

end.


PM   Вверх
ZBugz
Дата 20.5.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Ну тогда для полного счастья надо как то задержку показа сделать, как в стандартном окне smile

Добавлено через 7 минут и 18 секунд
И кстати, SysTooltip всегда = 0, а должен же быть '#32774' ?
PM MAIL   Вверх
Amphiluke
Дата 20.5.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Цитата(ZBugz @  20.5.2010,  20:09 Найти цитируемый пост)
Ну тогда для полного счастья надо как то задержку показа сделать, как в стандартном окне

Похоже, я вас самого начала немного неправильно понял.  smile 

Если вам не нужно создавать tooltip своего собственного дизайна, и если не нужно вызывать его когда душе заблагорассудится, а достаточно просто заменить текст стандартной всплывающей подсказки, полностью сохранив при этом поведение по умолчанию, то тогда нафиг не нужно конструировать собственное окно класса TOOLTIPS_CLASS... Просто достаточно в момент всплытия рисовать на окне стандартного tooltip'а свой текст обычными функциями GDI.
Вот.  smile 
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    SysTooltip: HWND;
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      Form2.SysTooltip := Wnd;
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  SysTooltip := 0;
  EnumWindows(@HideSystemTooltip, 0);
end;

procedure TForm2.WMNCMouseMove(var Msg: TMessage);
var
  DC: HDC;
  HintText: string;
  sz: TSize;
  rc: TRect;
  Cnv: TCanvas;
begin
  inherited;

  if not IsWindow(SysTooltip) then
    EnumWindows(@HideSystemTooltip, 0);
  if not IsWindowVisible(SysTooltip) then Exit;
  

  case Msg.WParam of
    HTCLOSE: HintText := 'Кнопка-закрывалка';
    HTMAXBUTTON: HintText := 'Кнопка-разворачивалка';
    HTMINBUTTON: HintText := 'Кнопка-сворачивалка';
  else
    Exit;
  end;
  DC := GetDC(SysTooltip);
  if DC = 0 then Exit;
  try
    Cnv := TCanvas.Create;
    try
      Cnv.Handle := DC;
      sz := Cnv.TextExtent(HintText);
      SetWindowPos(SysTooltip, HWND_TOPMOST, 0, 0, sz.cx + 10, sz.cy + 3,
        SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);
      Windows.GetClientRect(SysTooltip, rc);
      Cnv.Brush.Color := clInfoBk;
      Cnv.FillRect(rc);
      DrawText(DC, @HintText[1], -1, rc, DT_CENTER or DT_VCENTER);
    finally
      Cnv.Free;
    end;
  finally
    ReleaseDC(SysTooltip, DC);
  end;
end;

end.

PM   Вверх
ZBugz
Дата 21.5.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата

Похоже, я вас самого начала немного неправильно понял.  smile 

Это как обычно smile У меня часто с русским изьяснительным проблемы  smile 
А код не пашет  smile 

Стандартный вылазиет и прям видно что хочет нарисоваться свое, но не может, в итоге видно только полоску от хинта... А стандартный так и показываеться...
PM MAIL   Вверх
Amphiluke
Дата 21.5.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 5
Всего: 112



Странно. У меня (в D2007) вообще никаких проблем не наблюдается. Вы использовали в точности тот же код?

И как понять

Цитата(ZBugz @  21.5.2010,  18:34 Найти цитируемый пост)
в итоге видно только полоску от хинта...

при том что
Цитата(ZBugz @  21.5.2010,  18:34 Найти цитируемый пост)
стандартный так и показываеться...


Так что все-таки вылазит: какая-то полоска вместо хинта или же обычный нормальный полноценный хинт со стандартной надписью?


Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  DrawOnTooltip.png 2,73 Kb
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.