A7Mの日記: 覚え書き:矩形とその基準位置を指定して文字列を出力(VCL依存) 2
日記 by
A7M
主な用途はTDrawGridのセルにデータ(文字列である必要はない)を表示するとき。
TStringGridは大量のデータ処理に向かないと思われるので(そりゃそーだ。全部AnsiStringで管理しているわけだし)、その場合はTDrawGridで代替した方がいいみたい。OnDrawCellも表示部分しか呼ばれないから、10万行くらいあっても問題なし。ま、これくらいの量はstd::vectorががんがってくれるはずでしょ。
#富豪的プログラミングここに極まれり!
で、インプレイスエディタを使う場合、OnGetEditTextはインプレイスエディタにセルの値を渡すときに、OnSetEditTextはインプレイスエディタから値を取得するときに呼ばれる。
で、これやるの('A`)マンドクセ
・縦書きフォントやベースラインの考慮
・独自データ表示&編集用のカスタムグリッドコンポーネント→超('A`)マンドクセ
05/20 10:40 追記:
コードはこっちに移動。
そーいえば、マクロ/テンプレートでmin/maxはあるんだけど、平均って無いな。もしかして、おいらが知らないだけ?
コード (スコア:1)
enum TextPosition {
TP_LB, // 左下
TP_CB, // 中下
TP_RB, // 右下
TP_LC, // 左中
TP_CC, // 中心
TP_RC, // 右中
TP_LT, // 左上
TP_CT, // 中上
TP_RT // 右上
};
inline int PosY(const TRect& Rect, int FontHeight)
{
return Rect.Top + (Rect.Height() - abs(FontHeight)) / 2;
}
inline template <class T> T Center(T a, T b)
{
return (a + b) / 2;
}
void DrawText(TCanvas* pCanvas, const TRect& Rect, TextPosition Position, const AnsiString& Text)
{
HDC hDC = pCanvas->Handle;
int X, Y;
switch (Position) {
case TP_LB: // 左下
X = Rect.Left;
Y = Rect.Bottom;
SetTextAlign(hDC, TA_LEFT | TA_BOTTOM);
break;
case TP_CB: // 中下
X = Center(Rect.left, Rect.right);
Y = Rect.Bottom;
SetTextAlign(hDC, TA_CENTER | TA_BOTTOM);
break;
case TP_RB: // 右下
X = Rect.Right;
Y = Rect.Bottom;
SetTextAlign(hDC, TA_RIGHT | TA_BOTTOM);
break;
case TP_LC: // 左中
X = Rect.Left;
Y = PosY(Rect, pCanvas->Font->Height);
SetTextAlign(hDC, TA_LEFT | TA_TOP);
break;
case TP_CC: // 中心
X = Center(Rect.left, Rect.right);
Y = PosY(Rect, pCanvas->Font->Height);
SetTextAlign(hDC, TA_CENTER | TA_TOP);
break;
case TP_RC: // 右中
X = Rect.Right;
Y = PosY(Rect, pCanvas->Font->Height);
SetTextAlign(hDC, TA_RIGHT | TA_TOP);
break;
case TP_LT: // 左上
X = Rect.Left;
Y = Rect.Top;
SetTextAlign(hDC, TA_LEFT | TA_TOP);
break;
case TP_CT: // 中上
X = Center(Rect.left, Rect.right);
Y = Rect.Top;
SetTextAlign(hDC, TA_CENTER | TA_TOP);
break;
case TP_RT: // 右上
X = Rect.Right;
Y = Rect.Top;
SetTextAlign(hDC, TA_RIGHT | TA_TOP);
break;
default: // あり得ない
break;
}
pCanvas->TextRect(Rect, X, Y, Text);
}
Re:コード (スコア:1)
switch~caseのdefault:にreturn;をつけるのを忘れていた。orz