четверг, 7 августа 2014 г.

Секреты WinAPI. Чекбокс в ToolTip, как?

Элементарно, ведь все это окна, даже тултип...


Примитивный пример:
type
  TOOLINFO = packed record
    cbSize: Integer;
    uFlags: Integer;
    hwnd: THandle;
    uId: Integer;
    rect: TRect;
    hinst: THandle;
    lpszText: PWideChar;
    lParam: Integer;
  end;


const TTF_TRANSPARENT = $0100;
      TTF_CENTERTIP = $0002;
      TTM_ADDTOOL = $0400 + 50;
      TTF_SUBCLASS = $0010;
var   hToolTip, hCheckBox, hCheckBox2: hwnd;
      ti: TOOLINFO;

{ ФОРМИРУЕМ ТУЛТИП }
var p: tpoint;
    txt: pansichar;
    buf: array[0..255] of char;
begin
  hToolTip:= CreateWindowEx(WS_EX_TOPMOST, 'Tooltips_Class32', nil,
  WS_POPUP or $1 or $2 or $40 or $80,
    0, 0, 0, 0, button1.Handle, 0, 0, nil);
  hCheckBox:= CreateWindow('button', 'press', WS_CHILD or WS_VISIBLE or BS_AUTOCHECKBOX,
                           12, 53, // x/y
                           12, 12, // w/h
                           hToolTip,
                           0,
                           button1.Handle,
                           nil);
  hCheckBox2:= CreateWindow('button', 'press', WS_CHILD or WS_VISIBLE or BS_AUTOCHECKBOX,
                           12, 67, // x/y
                           12, 12, // w/h
                           hToolTip,
                           0,
                           button1.Handle,
                           nil);
  if hToolTip <> 0 then
  begin
    ti.cbSize := SizeOf(ti);
    ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;
    ti.hwnd := Handle;
    // тело уведомления
    ti.lpszText:= '     не показывать уведомление'#13 +
                  '     не показывать бла-бла';
    Windows.GetClientRect(Handle, ti.rect);
    SendMessage(hToolTip, TTM_ADDTOOL, 0, Integer(@ti));

    SendMessage(hToolTip, WM_USER + 24, 0, 500); // ширина

    txt:= 'Привет test 123';
    FillChar(buf, SizeOf(buf), #0);
    lstrcpy(buf, txt);
    SendMessage(hToolTip, WM_USER + 32, 1{IconType}, lParam(@buf)); // тип иконки и заголовок

    GetCursorPos(p);
    SendMessage(hTooltip, WM_USER + 18, 0, MakeLParam(p.x, p.y)); // позиция
    SendMessage(hTooltip, WM_USER + 17, wParam(true), lParam(@ti)); // активация
  end;
end;

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.