[BlueLeaf1336]> PROGRAM>

DrawTextExの使い方

historyTOP

2006/02/21:作成
2006/02/24:修正

overviewTOP

いつも悩むのが、DrawTextExのパラメータです。一体全体どれを指定すんねん、と。そういうわけで指定したパラメータでDrawTextExのプレビュー表示を行うプログラムを作りました。

作ってみた感じでは、使えなさそう、です。

使い方とかTOP

実行すると、図のようなレイアウトに何の工夫もない、でも異常に配置に悩んだ馬鹿でかい画面が開きます。左のリストボックスで書式を指定したり、真ん中の上の3つのエディットボックスで拡張書式を指定したり、ど真ん中の文字列を修正したりすると、右のペイントボックスに描画します。あとは...フォントを変更できます。

なんか、あんまり。

それから、あれです。設定した内容を試せるソースコードをクリップボードにコピーできます。図のような内容で画面右上のボタンを押せば、フォームに Button1 をひとつおいた状態を想定したサンプルをクリップボードに書き込みます。

当然ですが、その時点でどれだけ重要なデータがクリップボードに書き込まれていたとしてもなくなりますのでご注意ください。

procedure TForm1.Button1Click(Sender: TObject);
var
    R: TRect;                       //  描画領域
    DrawFormat: Cardinal;           //  書式
    DrawParams: TDrawTextParams;    //  拡張書式
    ResDrawTextEx: Integer;         //  戻り値
begin
    //  描画領域決定(とりあえずフォームに)
    R := Self.ClientRect;
    //  書式設定
    DrawFormat := DT_EDITCONTROL or DT_WORDBREAK or DT_WORD_ELLIPSIS;
    //  拡張書式設定
    FillChar(DrawParams, SizeOf(DrawParams), 0);
    DrawParams.cbSize := SizeOf(DrawParams);
    DrawParams.iTabLength   := 0;
    DrawParams.iLeftMargin  := 10;
    DrawParams.iRightMargin := 10;
    //  実行
    ResDrawTextEx := DrawTextEx(
                        Self.Canvas.Handle,     //  とりあえずフォームに
                        PChar(ParamStr(0)),     //  とりあえずEXEパスを
                        -1,                     //  固定で十分
                        R,                      //  必ず変数で
                        DrawFormat,             //  書式
                        @DrawParams             //  拡張書式
                        );
    ShowMessage(SysErrorMessage(GetLastError()));
end;

実際に、新しいプロジェクトを作って、ボタンをひとつおいてクリックイベントを作って、上のソースコードをそのまま貼り付けて実行できます。

ちゃんと左端と右端にマージンがとってあって、文字列の終わりが省略されててそれなりに描画されてますが、よく考えるとフォントを一切反映してません。まぁそういうことで。

2006/02/24TOP

クリップボードにコピーするソースコードで、横着して、フラグの足しこみを「+」でやっていたのを、「or」で連結するようにしました。

for i := 0 to LbDTFormat.Items.Count - 1 do
begin
    if (LbDTFormat.Selected[i]) then
    begin
        StrBuf2.Add(LbDTFormat.Items[i]);
    end;
end;
StrBuf2.Delimiter := '+';
Temp := StrBuf2.DelimitedText;
Temp := StringReplace(Temp, '+', ' or ', [rfReplaceAll]);
StrBuf.Add('    DrawFormat := ' + Temp + ';');

リストボックスで選択されているフラグを連結する時に、TStringList.DelimitedText を使えば楽だと気づいて(コレは、TStringList.CommaText が「,」で連結してくれる所を、好きな文字で連結するメソッド)、でも、Delimiter として指定できるのが、Char だけだとコレも気づいて、横着して「+」を指定していたんですが、やっぱりフラグは「or」でつながないと駄目だと思い直しました。でも、プレビュー処理のところはちゃんと「or」で連結してました。「+」は出力結果だけです。

で、上記のコードの、赤字部分が修正箇所です。わざわざこんなことを書いているのは、ひょっとしたら、フラグをなぜ「or」でつながないと駄目かわからない人がいるんじゃないかと思ったからです(実は最近まで「+」でもええやん、と思ってました)。実際「+」のままでも動きます。

理由は、「間違って同じフラグを連結してしまった時におかしくなるかならないか」の違いです。「or」でつなぐと、同じフラグを10回連結しようが100回連結しようが、問題なく動きますが、「+」でつなぐと、当然足し算なので全く違うフラグになってしまいます。例題だそうかと思いましたが、邪魔くさいので。

ダウンロードTOP

20060224DrawTextExTest.zip(207,395bytes)

EOFTOP