laifik |
Отправлено: 02.11.2004, 09:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
Эта тема не раз обсуждалась. Если прописать просто в событии OnMouseMove Грида код:
CODE | TGridCoord Cell = DBGridEh1->MouseCoord(X,Y);
try
{
DBGridEh1->Hint = "";
DBGridEh1->ShowHint = false;
if ((Cell.X < 0)||(Cell.Y < 0)) return;
{
DBGridEh1->ShowHint = true;
DBGridEh1->Hint = ModuleLoad->ADORD->FieldByName("NaimenRD")->AsString;
}
}
catch(...) {}
| , то появляется Hint длиной строкой на весь экран. Я хочу, чтобы вырисовывался прямоугольник. Поэтому делаю через функцию
CODE | void __fastcall TFormCard::DBGridEh1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
Application->HintPause = 0;
Application->HintShortPause = 0;
Application->HintHidePause = 10000000000;
Application->OnShowHint = DoShowHint;
}
| , а далее
CODE | void __fastcall TFormCard::DoShowHint(System::AnsiString &HintStr, bool
&CanShow, THintInfo &HintInfo)
{
int X, Y;
CanShow = true;
if (HintInfo.HintControl == DBGridEh1 )
{
if( Mouse->Capture )
{
CanShow = false;
return;
}
HintInfo.ReshowTimeout = 100;
TRect R;
TGridCoord Cell = DBGridEh1->MouseCoord(X,Y);
try
{
DBGridEh1->Hint = "";
DBGridEh1->ShowHint = false;
if ((Cell.X < 0)||(Cell.Y < 0)) return;
{
DBGridEh1->ShowHint = true;
DBGridEh1->Hint = ModuleLoad->ADORD->FieldByName("NaimenRD")->AsString;
R.Left = DBGridEh1->Left;
R.Top = DBGridEh1->Top;
R.Right = DBGridEh1->Left + DBGridEh1->Width;
R.Bottom = DBGridEh1->Top + DBGridEh1->Height;
TPoint w_tl=TPoint(R.Left,R.Top);
TPoint w_br=TPoint(R.Right,R.Bottom);
w_tl=DBGridEh1->ClientToScreen(w_tl);
w_br=DBGridEh1->ClientToScreen(w_br);
HintInfo.CursorRect=TRect(w_tl,w_br);
HintInfo.HintPos=w_tl;
}
}
catch(...) {}
}
| и у меня не работает. В чем моя ошибка? |
|
Gedeon |
Отправлено: 02.11.2004, 10:19 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Вот именно не раз обсуждалось, AVC сделал отличное решение этой проблемы, ищите в поиске, по поводу формы хинта тоже в поиск, все это было.
|
|
laifik |
Отправлено: 02.11.2004, 11:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
QUOTE (Gedeon @ 02/11/2004, 11:21) | Вот именно не раз обсуждалось, AVC сделал отличное решение этой проблемы, ищите в поиске, по поводу формы хинта тоже в поиск, все это было. |
Gedeon, я честно просмотрела все форумы, rambler и yandex на эту тему и все, что касается hint-а. В основном, коды на Делпфи (один и тот же код повторяется десятки раз). И нет ни одного примера на С++ Билдере с выводом хинта в компактный прямоугольник. На Делпфи есть такой намек, но я не знаю, как его перевести на Си.
Если можно, укажите ссылку на AVC. Если это код на компонент StringGrid, то я его наизусть знаю. Он существенно отличается от DBGrid. |
|
Gedeon |
Отправлено: 02.11.2004, 12:07 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Искать эффективнее поиском того форума, где сейчас находитесь. Вот ссылочка на DBGrid || DBGridEh
https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e
А вот как сделать другой хинт
https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e
|
|
laifik |
Отправлено: 02.11.2004, 14:03 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 70
|
Спасибо за коды. Таких я еще не видела. Буду разбираться.
Но не думала, что этот вопрос такой объемный. С "деревом" и ЛистБоксом все было гораздо проще. |
|
Rius |
Отправлено: 02.11.2004, 14:09 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Кидаешь данный код в файл HintX.pas и подключаешь к C++Builder по Shift+F11.
CODE |
unit HintX;
//-----------------------------------------------------------------------------
interface
uses
Windows, Messages, Controls, Graphics, Classes;
type
THintX = class(THintWindow)
protected
procedure Paint; override;
public
procedure ActivateHint(Rect: TRect; const AHint: AnsiString); override;
function CalcHintRect(MaxWidth: Integer; const AHint: string;
AData: Pointer): TRect; override;
end;
//-----------------------------------------------------------------------------
implementation
uses Forms;
{ TIconHintX }
//-----------------------------------------------------------------------------
{-Вычисляем новый размер окошка подсказки для помещения в него иконки:-}
function THintX.CalcHintRect(MaxWidth: Integer;
const AHint: string; AData: Pointer): TRect;
begin
Result := inherited CalcHintRect(MaxWidth, AHint, AData);
Result.Right := (Canvas.TextWidth(AHint) + 10);
Result.Bottom := Canvas.TextHeight('М') * 2 + 10;
// MessageBeep(MB_OK);
end;
//-----------------------------------------------------------------------------
procedure THintX.Paint;
const
MARGIN = 5;
var
Rect: TRect;
Styles: TFontStyles;
begin
// inherited;
Include (Styles, fsBold);
Canvas.Font.Style := Styles;
Rect.Left := 2;
Rect.Top := 2;
Rect.Right := Width — 2;
Rect.Bottom := Canvas.TextHeight('М') + 2;
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top, 'Подсказка');
Canvas.Pen.Color := clSkyBlue;
Canvas.MoveTo(2, Rect.Bottom+2);
Canvas.LineTo(Canvas.TextWidth('Подсказка') + 7, Rect.Bottom+2);
Canvas.LineTo(Canvas.TextWidth('Подсказка') + 7, 2);
Exclude (Styles, fsBold);
Canvas.Font.Style := Styles;
Rect.Top := Rect.Bottom + 2;
Rect.Bottom := Height — 2;
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Caption);
Canvas.Pen.Color := 12626353;
// Canvas.RoundRect(0,0,Width-2,Height-2,15,15);
Canvas.Rectangle(0,0,Width-2,Height-2);
// Canvas.Draw(MARGIN, MARGIN * 5, Application.Icon);
//рисуем рамку окошка подсказки
// SendMessage(Handle, WM_NCPAINT, 0, 0);
end;
//-----------------------------------------------------------------------------
procedure THintX.ActivateHint(Rect: TRect; const AHint: AnsiString);
var
regn1: HRGN;
begin
inherited;
// regn1 := CreateRoundRectRgn(0,0,Width,Height,15,15);
// SetWindowRgn(Self.Handle,regn1,true);
end;
//-----------------------------------------------------------------------------
initialization
//связываем наш новый класс с классом окошка
//подсказки установленным поумолчанию:
HintWindowClass := THintX;
end.
|
На С++ перевести несложно, но есть непонятные участки.
|
|
Guest |
Отправлено: 02.11.2004, 14:37 |
|
Не зарегистрирован
|
QUOTE | есть непонятные участки |
Какие ? |
|
Rius |
Отправлено: 02.11.2004, 16:36 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Вот непонятно, куда это в билдере ставить:
CODE | initialization
//связываем наш новый класс с классом окошка
//подсказки установленным поумолчанию:
HintWindowClass := THintX;
|
|
|
Guest |
Отправлено: 02.11.2004, 17:26 |
|
Не зарегистрирован
|
Секция инициализации.
Вызывается один раз при старте модуля.
Первый пришедший в голову аналог (по смыслу) на C
Application->OnShowHint = ваша_функция_показывающая_Hint
из топика https://rxlib.ru/forums/index.php?ac...6bc0e0233121b8e упоминавшегося ранее. |
|
|