パスワードを忘れた? アカウント作成
453139 journal

A7Mの日記: 覚え書き:矩形とその基準位置を指定して文字列を出力(VCL依存) 2

日記 by A7M
主な用途はTDrawGridのセルにデータ(文字列である必要はない)を表示するとき。

TStringGridは大量のデータ処理に向かないと思われるので(そりゃそーだ。全部AnsiStringで管理しているわけだし)、その場合はTDrawGridで代替した方がいいみたい。OnDrawCellも表示部分しか呼ばれないから、10万行くらいあっても問題なし。ま、これくらいの量はstd::vectorががんがってくれるはずでしょ。
富豪的プログラミングここに極まれり!

で、インプレイスエディタを使う場合、OnGetEditTextはインプレイスエディタにセルの値を渡すときに、OnSetEditTextはインプレイスエディタから値を取得するときに呼ばれる。

で、これやるの('A`)マンドクセ
・縦書きフォントやベースラインの考慮
・独自データ表示&編集用のカスタムグリッドコンポーネント→超('A`)マンドクセ

05/20 10:40 追記:
コードはこっちに移動。

そーいえば、マクロ/テンプレートでmin/maxはあるんだけど、平均って無いな。もしかして、おいらが知らないだけ?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by A7M (259) on 2004年05月20日 10時28分 (#552111) ホームページ 日記
    // 文字列基準位置
    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);
    }
typodupeerror

アレゲは一日にしてならず -- アレゲ研究家

読み込み中...