下の画像に示すように、次の形式を使用して、RSS からのニュースをリストボックスに表示しようとしています。スクリーンショットのアプリケーションは、リストボックスをスタイリングすることによって firemonkey で開発されました。VCL アプリケーションで同じものを表示する必要があります。
このレイアウトの要件は次のとおりです。
- ニュースのタイトルは太字にする必要があります
- 短い説明は一番下に配置し、1 行に収まらない場合は折り返す必要があります (画像に示すように)。font-style はノーマルである必要があります
- ニュース項目ごとに画像があるはずです
これまでの私のコード:
procedure TfrmDatePicker.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
R: TRect;
begin
ListBox1.Canvas.Font.Color := clBlack;
ListBox1.Canvas.Font.Style := [fsBold];
ListBox1.Canvas.Font.Size := 9;
if Odd(Index) then ListBox1.Canvas.Brush.Color := clWhite
else ListBox1.Canvas.Brush.Color := clBtnFace;
ListBox1.Canvas.FillRect (Rect);
ListBox1.Canvas.Pen.Color := clHighlight;
if(odSelected in State) then
begin
ListBox1.Canvas.Font.Color := clHighlightText;
ListBox1.Canvas.Brush.Color := clHighlight;
ListBox1.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
if(odFocused in State) then DrawFocusRect(ListBox1.Canvas.Handle, Rect);
end;
ImageList1.Draw(ListBox1.Canvas, Rect.Left + 2,
Rect.top + (ListBox1.ItemHeight - ImageList1.Height) div 2, Index, true);
ListBox1.Canvas.TextOut(Rect.Left + 70, Rect.Top + 4, 'कान्तिपुर समाचारआजकोपत्रिकामाकेहिछैन');
ListBox1.Canvas.Font.Style := ListBox1.Canvas.Font.Style - [fsBold];
R := Rect;
R.Left := R.Left + 70;
R.Top := R.Top + 32;
R.Height := 30;
DrawText(ListBox1.Canvas.Handle, PChar(ss), Length(ss), R, DT_LEFT or DT_WORDBREAK or DT_NOPREFIX);
ListBox1.Canvas.TextOut(Rect.Right - 80, Rect.top + 4, '5 mins ago');
end;
これが私が得ている出力です:
問題
Unicode テキストの描画が遅すぎて、リストボックスをスクロールしたり、フォームのサイズを変更したりするとちらつきが大きくなります。
ノート
- フォントは@Microsoft NeoGothicに設定されています
- アイテムの高さ = 70; スタイル = ownerdrawfixed
- 最初のスクリーンショットに掲載されている firemonkey アプリケーションで同じ Unicode テキストを描画しても問題ありません。
- 上記のコードは、通常の英語のテキストでは問題なく動作し、ちらつきはまったくありません。この問題は、Unicode テキストにのみ存在します。
更新: DrawTextメソッドのDT_WORDBREAKフラグに 問題があるようです。このフラグを削除すると、ちらつきが表示されますが、テキストの描画が大幅に改善されます。
Unicode テキストのサンプル
तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई झुलायो झुलाओ ह्स्द्जिः स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द तिम्रो त्यो बोलि ले मलाई बोलायो मिठो तिम्रो त्यो मुस्कान मा मलाई स ह्स्ध्फद्ज द्श्जड्स हस फग स्द्फ़ ग स्द्फ्ग फस ग्स्द्फ़ ग्दस्फ्ग द्स्फग्द