2010年5月15日土曜日

外部コンポーネント その1

ソフトウェアをすべて始めから開発するのは非常に大変です。
なので、オンラインリソースを参照したり、無償・有償に限らず外部コンポーネントを利用するのが、一般的な開発スタイルとなっています。

SQL Browser の開発でも類に漏れず、外部コンポーネントをいくつか利用しています。

その中で、今回は DockPanel Suite を紹介します。このコンポーネントは、Visual Studio のツールボックスのようなドッキングウィンドウを実現するためのものです。

フリーで提供されていて、しかもオープンソース(C#)のため、独自の改良も可能です。
また、サンプルソースも充実していますので、やり方がわからず困ることは少ないと思います。

と、いうわけで、非常にお勧めなコンポーネントなのですが、DockPanel_2_3_1_Soruce.zip のバージョンでは、日本語を利用した場合に問題があります。

ドッキングで隠れているとき、タブ表示されますが、文字が切れてしまいます。
また、Visual Studio と異なり、縦書き表示になります。















ソースをざっと眺めてみたら、VS2005AutoHideStrip.cs の 354行目~357行目 に問題があることが分かりました。

if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabVertical);
else
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);

DrawString でタブの文字を描画しているのですが、StringFormatTabVertical で縦書きになっています。
また、その前の 277行目~279行目 でタブの幅を算出しています。

int width = imageWidth + ImageGapLeft + ImageGapRight +
    TextRenderer.MeasureText(tab.Content.DockHandler.TabText, TextFont).Width +
    TextGapLeft + TextGapRight;

ここで、縦書きを考慮していないため、文字が切れてしまう訳です。
Visual Studio に合わせたいので、354行目~357行目 をコメントアウトして、「横書きのまま、90度回転させて描画」という修正を行うことにします。

// if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)

//     g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabVertical);
// else
//     g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);

if (dockState == DockState.DockLeftAutoHide dockState == DockState.DockRightAutoHide)
{
    Rectangle rectText2 = rectText;
    rectText2.X = 0;
    rectText2.Y = 0;
    rectText2.Width = rectText.Height;
    rectText2.Height = rectText.Width;
    float originOffsetX = g.Transform.OffsetX;
    float originOffsetY = g.Transform.OffsetY;
    // g.TranslateTransform(rectText.Width, rectText.Y); 2010/08/05 バグ修正
    g.TranslateTransform(rectText.X + rectText.Width, rectText.Y);
    g.RotateTransform(90F);
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText2, StringFormatTabHorizontal);
    g.TranslateTransform(originOffsetX, originOffsetY);
}
else
{
    g.DrawString(content.DockHandler.TabText, TextFont, new SolidBrush(textColor), rectText, StringFormatTabHorizontal);
}

と、いうわけで、無事に表示されるようになりました(^o^)/















<2010/08/05 追記>

ついでにパネルが左右に表示されているとき、Visual Studio 風にアイコンを90度回転するソースもご紹介します。
同じく VS2005AutoHideStrip.cs の 344行目 をコメントアウトして、以下の修正を行ってください。

Bitmap bmp = ((Form)content).Icon.ToBitmap();

if ((dockState == DockState.DockLeftAutoHide) || (dockState == DockState.DockLeft)
    (dockState == DockState.DockRightAutoHide) || (dockState == DockState.DockRight))
{
    bmp.RotateFlip(RotateFlipType.Rotate270FlipX);
}
g.DrawImage(bmp, RtlTransform(rectImage, dockState));
bmp.Dispose();
bmp = null;
// g.DrawIcon(((Form)content).Icon, RtlTransform(rectImage, dockState));

0 件のコメント:

コメントを投稿