喫茶XRAYトップページ

[▲前のスレッド]

[8019] バルーン型のヒントウィンドウ返信 削除
2014/9/26 (金) 23:55:18 Mr.XRAY
バルーン型のヒントウィンドウ,つまりツールチップの表示です.
Delphi 2009 以降でしたら,以下の記事で可能です.

[ヒントとメッセージ - Delphi 2009 特集]
http://www.watercolor-city.net/ct_delphi/delphi_tiburon/doc_vcl/vcl_balloonhint.htm

Delphi 2007 以前の場合は,以下のコードを参考にして,

http://lupin.client.jp/delphi/#32

例えば,次のコードでテストできます.
動作確認は Windows 7 U64(SP1) + Delphi 7, 2007-R2 ですが,
Delphi 6 でも使用可能だと思います.

implementation

uses CommCtrl;

{$R *.dfm}

//-----------------------------------------------------------------------------
//  バルーン型のツールチップの表示(Delphi 2007 以前用)
//  TToolInfoの使用にはusesにCommCtrlが必要
//-----------------------------------------------------------------------------
procedure ShowBalloonTip(hWnd: THandle; Text: String);
const
  TTS_BALLOON = $40;
var
  hWndTip  : THandle;
  TI       : TToolInfo;
  MaxWidth : Integer;
begin
  hWndTip := CreateWindow(
               TOOLTIPS_CLASS,
               nil,
               WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
               0,
               0,
               0,
               0,
               hWnd,
               0,
               HInstance,
               nil);

  if hWndTip <> 0 then begin
    TI.cbSize := SizeOf(TI);
    TI.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS or TTS_NOPREFIX;
    TI.hwnd   := hWnd;
    MaxWidth  := 200;

    TI.lpszText := PChar(Text);
    Windows.GetClientRect(hWnd, ti.rect);

    SendMessage(hWndTip, TTM_ADDTOOL, 0, LParam(@TI));
    SendMessage(hWndTip, TTM_SETMAXTIPWIDTH, 0, Integer(MaxWidth));
  end;
end;

//-----------------------------------------------------------------------------
//  フォーム表示開始時の処理
//  Button1のヒントウィンドウを設定
//-----------------------------------------------------------------------------
procedure TForm1.FormShow(Sender: TObject);
var
  StrHint : String;
begin
  StrHint := '複数行のヒント文字列' + sLineBreak + 'テストヒント';
  ShowBalloonTip(Button1.Handle, StrHint);
end;


[参考リンク]

[Tooltip (Windows)]
http://msdn.microsoft.com/en-us/library/windows/desktop/bb760246%28v=vs.85%29.aspx
[Tooltip (Windows)] ウェブ翻訳
http://www.microsofttranslator.com/bv.aspx?from=en&to=ja&a=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fwindows%2Fdesktop%2Fbb760246%2528v%3Dvs.85%2529.aspx

[How to Implement Multiline Tooltips (Windows)]
http://msdn.microsoft.com/en-us/library/windows/desktop/hh298403%28v=vs.85%29.aspx
[How to Implement Multiline Tooltips (Windows)] ウェブ翻訳
http://www.microsofttranslator.com/bv.aspx?from=en&to=ja&a=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fwindows%2Fdesktop%2Fhh298403%28v%3Dvs.85%29.aspx



[8020] :バルーン型でないヒントウィンドウ返信 削除
2014/9/27 (土) 00:03:39 Mr.XRAY
Halbow 資料館の[ヒントウィンドウのカスタマイズ] にあるコンポーネントを
複数行の文字列を表示できるようにするには,
MyHintUnit.pas 内の以下の部分を変更します.

http://mrxray.on.coocan.jp/Halbow/Notes/N018.html

//    変更前
//    DrawText(Canvas.Handle, PChar(Caption), -1, R,
//                        DT_LEFT or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE);

//  変更後
    DrawText(Canvas.Handle, PChar(Caption), -1, R,
                        DT_LEFT or DT_NOPREFIX or DT_VCENTER);


Windows 7 U64(SP1) + Delphi 7 Pro で確認してみました.


[8021] ネタ元返信 削除
2014/9/27 (土) 00:13:53 Mr.XRAY
ネタ元は以下です.

[複数行を表示するバルーンツールチップを表示するには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201409/14090010.txt

なんですが,

>表示しようとする文字列に改行(#13#10)を入れてみたのですが、改行が無視されてしまい、1行で表示されてしまいます。

と言われても(書かれても),肝心の文字列を描画するコードがありません.
アドバイス,指摘のしようがありません.

バルーンツールチップの表示だけをテストするプロジェクトを新規に作成して
そのコードを示してくださればいいのですが,例によって,
「何万行もあるプログラムでやっているので,そういうことはできません」
と言われてしまうと,言葉を返せなくなります.
そのようなレスは,うかつにはできません (^^;

# 私こと Mr.XRAY を黙らせるのは簡単です.
#「何万行,云々」と言えばいいのです.ホホホホッ.


[8022] Re:バルーン型のヒントウィンドウ返信 削除
2014/9/27 (土) 00:21:43 Mr.XRAY
> Delphi 2007 以前の場合は,以下のコードを参考にして,
>
> http://lupin.client.jp/delphi/#32


↑のコードでは SetWindowPos を実行していますが,機能しません.
TToolInfo を使用したヒントウィンドウの位置の設定は,メッセージを使用します.
詳しくは,ネットで検索してみてください.
また,定数類も定義していますが,少なくても Delphi 6 以降では CommCtrl.pas
内に定義があります.TToolInfo レコード型も定義があります.
どのバージョンからこれらの定義があるのかは不明です.


[8023] TBalloonHintコンポーネントの簡単な使用方法返信 削除
2014/9/27 (土) 12:55:00 Mr.XRAY
> [ヒントとメッセージ - Delphi 2009 特集]
> http://www.watercolor-city.net/ct_delphi/delphi_tiburon/doc_vcl/vcl_balloonhint.htm


そのページの [TBalloonHint・チュートリアル] という記事です.
使い方は簡単です.
デフォルトでは,マウスカーソルの位置に表示するようです.

//-----------------------------------------------------------------------------
//  フォーム表示開始時の処理
//  Button1のヒントを設定
//-----------------------------------------------------------------------------
procedure TForm1.FormShow(Sender: TObject);
begin
  Button1.CustomHint := BalloonHint1;
  Button1.ShowHint := True;
  Button1.Hint := '複数行のヒント文字列' + sLineBreak + 'テストヒント';
end;


[8024] コンポーネントがどのタブにあるか返信 削除
2014/9/27 (土) 13:11:08 Mr.XRAY
> そのページの [TBalloonHint・チュートリアル] という記事です.

該当するコンポーネントが,コンポーネントパレットの,どのタブにあるかを
知るには,下図のように,検索窓で,コンポーネントのクラス名で探します.
クラス名ですから,先頭に 'T' を付けることに注意します.


[8032] Re:バルーン型のヒントウィンドウ返信 削除
2014/9/28 (日) 00:49:00 Mr.XRAY
もののついでですので.
Halbow 資料館の以下のサンプルコードを使用したサンプルです.
動作確認は Windows 7 U64(SP1) + Delphi 7 Pro です.

[27−4 ツールチップをコードでつくる]
http://mrxray.on.coocan.jp/Halbow/Chap27.html#Chap27-4

Delphi XE5 でも動作しますが,ランタイムテーマが無効だと動作しません.
また,背景色の設定が無視されるようです.
Delphi 2009 で実装されている TBalloonHint コンポーネントも,ランタイムテーマ
が無効だと,バルーン型ではなく,普通のツールチップになります.

下のコードでは,CreateWindowEx の TTS_BALLOON を除けば,普通のツールチップに
なります.
つまり,Halbow さんのコードに TTS_BALLOON フラグを追加しただけですが,
実際には,変数名を若干変えています.Delphi 6 以降では 主な定数名は定義済み
ですので,コードから削除しています.
Halbow さんのコードは Delphi 3 での確認コードです.
また,表示時間に関するコードを追加しています.


implementation

uses CommCtrl;

{$R *.dfm}

//------------------------------------------------------------
//             Helper Handlers
//------------------------------------------------------------
function CreateToolTip(hParent: HWND): HWND;
const
  TTS_BALLOON = $40;
begin
  Result := CreateWindowEx(WS_EX_TOPMOST,
                           TOOLTIPS_CLASS,
                           nil,
                           WS_POPUP or TTS_NOPREFIX or TTS_ALWAYSTIP or TTS_BALLOON,
                           0,
                           0,
                           0,
                           0,
                           hParent,
                           0,
                           hInstance,
                           nil);
end;

function TTMAddToolControl(hToolTip, MainWndHandle, hCtrl: HWND;
  Tips: String): Boolean;
var
  TI : TToolInfo;
begin
  ZeroMemory(@TI, SizeOf(TI));

  TI.cbSize   := SizeOf(TI);
  TI.hwnd     := MainWndHandle;
  TI.uFlags   := TTF_SUBCLASS or TTF_IDISHWND;
  TI.uId      := hCtrl;
  TI.lpszText := PChar(Tips);

  Result := Boolean(SendMessage(hToolTip, TTM_ADDTOOL, 0, LPARAM(@TI)));
end;

function TTMAddToolRect(hToolTip, hParent: HWND; ID: Integer; Rect: TRect;
  Tips: String): Boolean;
var
  TI : TToolInfo;
  r  : TRect;
begin
  ZeroMemory(@TI, SizeOf(TI));
  SetRect(r, Rect.Left, Rect.Top, Rect.Left + Rect.Right, Rect.Top + Rect.Bottom);

  TI.cbSize   := SizeOf(TI);
  TI.uFlags   := TTF_SUBCLASS;
  TI.hwnd     := hParent;
  TI.uId      := ID;
  TI.Rect     := r;
  TI.lpszText := PChar(Tips);

  Result := Boolean(SendMessage(hToolTip, TTM_ADDTOOL, 0, LPARAM(@TI)));
end;

procedure TTMSetBkColor(hToolTip: HWND; CL: COLORREF);
begin
  SendMessage(hToolTip, TTM_SETTIPBKCOLOR, CL, 0);
end;

procedure TTMSetTextColor(hToolTip: HWND; CL: COLORREF);
begin
  SendMessage(hToolTip, TTM_SETTIPTEXTCOLOR, CL, 0);
end;

procedure TTMSetMaxWidth(hToolTip: HWND; MW: Integer);
begin
  SendMessage(hToolTip, TTM_SETMAXTIPWIDTH, 0, MW);
end;

procedure TTMSetMargin(hToolTip: HWND; R: TRect);
begin
  SendMessage(hToolTip, TTM_SETMARGIN, 0, Integer(@R));
end;

//-----------------------------------------------------------------------------
//  フォーム表示開始時の処理
//  Button1のヒントウィンドウを設定
//-----------------------------------------------------------------------------
procedure TForm1.FormShow(Sender: TObject);
var
  hToolTip : HWND;
  StrHint  : String;
begin
  StrHint := '複数行のヒント文字列' + sLineBreak + 'テストヒント';

  hToolTip := CreateToolTip(Handle);
  TTMAddToolControl(hToolTip, Handle, Button1.Handle, StrHint);
  TTMSetMaxWidth(hToolTip, 200);
  TTMSetBkColor(hToolTip, $00D5F2D9);

  //表示開始までの時間(ミリ秒指定)
  SendMessage(hToolTip, TTM_SETDELAYTIME, TTDT_INITIAL, MakeLParam(10, 0));
  //表示時間(ミリ秒指定)
  //WORD値の指定となっているが,実際にはLPARAM自体がIntegerなのでSmallInt以内?
  SendMessage(hToolTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, MakeLParam(MAXSHORT, 0));
end;


メッセージ類については,このスレッドの最初の書き込みにある MSDN の記事へのリンクを
参考にしてください.

※ SendMessage の 第3引数は WPALAM型(UINT_PTR :  NativeUInt型) です.
   32 ビットアプリでは 符号なし32ビット整数で,
   64 ビットアプリでは 符号なし64ビット整数です.
※ SendMessage の 第4引数は LPALAM型(INT_PTR :  NativeInt型) です.
   32 ビットアプリでは 符号あり32ビット整数で,
   64 ビットアプリでは 符号あり64ビット整数です.
※ Integer 型は,32ビットアプリでも64ビットアプリでも 32 ビットの符号あり整数値です.
   Cardinal 型は,32ビットアプリでも64ビットアプリでも 32 ビットの符号なし整数値です.
   つまり,Integer と Cardinal はプラットフォームに依存しません.



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82