2012-02-12 7 views
3

私はGoogleカレンダー、iCalendar、Outlookのカレンダーなどと同様のスケジュールアプリケーションを作成しています。イベントは長方形で表され、特に1週間全体を表示している場合は非常に小さくなります。ワードを切り捨てることができるようにしながら、長方形でワードラップする

私の挑戦は、矩形内のテキストを使用して、クリックする前にイベントの「意味のある要約」をユーザに与えることです。テキストは非常にコンパクトでなければなりません。そのためには、それほど一般的ではない方法で行を折り返したいと思っていますが、.NETがそれをネイティブに処理できると思われます。

単一の単語が長方形よりも広い場合は、その単語の先頭のみが表示されます。しかし、次の単語が部分的に矩形の外に落ちるならば、スペースが発生すると折り返しが発生するはずです。すべてのスペースが次の行に折り返されるわけではありません。なぜなら、2つ以上の単語がうまくいく行に収まる場合です。

答えはStringFormat、StringTrimming、およびFormatFlagsの機能にあると思われますが、目標を達成するための適切な組み合わせが見つかりませんでした。例えば

我々が持っている場合...

Chuck Norris 
Dentist Appointment 

により、それはなるかもしれない限られたスペースへ...

Chuc 
Norr 
Denti 
Appo 

私はそれになる必要はありません:

Chuc 
k 
Norr 
is 
Dent 
ist 
Appo 
intme 
nt 

この例のように、チャックノリスが誰であるかを知っていれば、文字 "k"と "is"の存在は助けになりませんユーザーはその名前を認識します。実際に、これらの文字の存在は、垂直スペースも限られているため、「歯医者の予定」を見えなくする可能性があります。

私はすでに通常の方法でラップする矩形内にテキストを描画する方法を知っており、矩形の外にあるテキストを描画しないようにする方法も知っています。私が知っていないのは、スペース(またはキャリッジリターン)に遭遇したときに折り返す方法と、1つの単語が長方形よりも広い場合に中間単語を折り返さないようにする方法です。そこに助けがありますか?

+0

私はまだ答えが驚いています。実際に私は必要な結果を得る方法を持っていますが、必要以上にコード集約的であり、CPUサイクルを奪うと確信しています。つまり、文字列全体をループし、テキスト部分の幅を繰り返し確認し、スペースの一部をCRLFに置き換えて、折り返しせずにテキストをレンダリングすることができます。誰も答えないなら、私がやることですが、私が必要とするものを行う能力が.netにすでに存在することが疑わしいときは無駄に見えます。 – PaulOTron2000

答えて

1

手動以外の方法はありません。

私の知る限り、あなたが望むように動作する標準コントロールはありません。そこから次のステップは自分で実装するか、既に持っている他の人を見つけることです。

つまり、コメントで説明した方法よりも少し改善を加えることができます。うまくいけば、あなたが描かれますかを制御することができるよう

  • 「ミニマリスト」は
  • (ここでanother clear examplea more advanced oneだ)ラベル
  • Override the Paint eventから継承するカスタムコントロールを作成するには、「ビット場しのぎ」からそれを移動することができます空白が発生する場所でのみ文字列の幅を計算します。余分な文字をキャンバスから外して空白なしで分割しない場合は気にしません。
  • キャッシュ最終文字列情報のみリサイズ/無効が発生した場合に再計算やカスタムコントロールを使用して、テキストの変更(あなたが適切なイベントを監視する必要があります)

、あなたは根本的Textを変更しないでくださいあなたがそれを読んでみたいと思っていたならば、あなたがそれを置くのと同じ方法でしょう。これは、同じコンバージョンをあなたが出現させたいと思っている場所で覚えておく必要はないという点で、あなたのコントロール。

ほとんどの場合、他の要件がない限り、ほとんどの場合、ラベルを継承するコントロールから継承すると、あまりコード/処理が過度ではありません。

まだお持ちでない場合は、とにかくスケジュールオブジェクトを表現するカスタムオブジェクトがほしいかもしれません。読みやすく、保守し、コード化しやすく、アプリケーション全体に標準的な外観を提供します。

あなたがこのすべてを既に知っていれば謝ります多くのSOの質問/回答がありますが、それはあなたのレベルの経験を評価するのが難しいです。

3

TextFormatFlags.WordBreakフラグでTextRenderer.DrawTextメソッドを使用してみてください:

Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Panel1.Paint 
    Dim sb As New StringBuilder 
    sb.AppendLine("Chuck Norris") 
    sb.AppendLine("Dentist Appointment") 

    e.Graphics.Clear(Color.White) 
    TextRenderer.DrawText(e.Graphics, sb.ToString, Panel1.Font, _ 
         Panel1.ClientRectangle, Color.Black, Color.Empty, _ 
         TextFormatFlags.WordBreak) 
End Sub 

あなたはまたTextFormatFlags.WordEllipsisを追加することができます「...」の末尾に追加する:パネルのペイントイベントを使用して

例長方形の端で切り取られている単語:

TextRenderer.DrawText(e.Graphics, sb.ToString, Panel1.Font, _ 
         Panel1.ClientRectangle, Color.Black, Color.Empty, _ 
         TextFormatFlags.WordBreak Or TextFormatFlags.WordEllipsis) 
+2

+1私よりもずっと優雅です。 – Basic

+0

@ PaulOTron2000 DrawTextはDrawStringで多くの問題を修正しました。 [.NETでのテキストの描画]については、この回答を参照してください。(0120-18756) – LarsTech

+0

私はこれを試しましたが、うまくいきましたが、2つの問題があります。 1つは、CRLFに遭遇したときに余分な空白行が追加されることです。 2つ目は、ClearTypeテキストを使用できるのでDrawTextではなくDrawStringを使用する方が好きです。 (わからないのであれば、微妙な赤と青の色を使って読みやすさを向上させる素晴らしい技術です。スクリーンショットを撮ってズームインしなければ目に見えませんが、今使っている可能性があります) – PaulOTron2000

関連する問題