MFC Grid control…使い方メモ

『MFC Grid Control…使い方を忘れてる』と書いておきながら、一切使い方を書いていなかったので自分用メモ。

わけあってeVC++を使ったので、その手順だけど…他でも同じようなモノだろう。さらに言えば、この手順が正しいとも限らない :arrow:

  • MFC Grid controlソースデモプロジェクトに含まれるソース(こちらの方が良さそうです)を入手する(v2.25)
    自分のプロジェクト内にソースを取り込んでしまう。ちなみにGridCtrl_srcフォルダごとコピーしてガッとソースとヘッダーを取り込んじゃう。あと、GridCtrl_srcの中のExperimental Upgradesフォルダは今回は使ってないので無視。
  • ソース取り込んだら、とりあえずコンパイル
    エラーがなければよいけど…たぶん、『MFC Grid Control…使い方を忘れてる』に書いたところでエラーになるので、1行コメントアウト。
  • リソースエディタでグリッドコントロールを貼りたい場所にカスタムコントロールを貼り付ける
    カスタムコントロールのプロパティを開いてクラスにMFCGridCtrlを設定する。
  • カスタムコントロールを貼ったクラスにメンバー変数を追加する
    こんな感じのモノを追加、CGridCtrl m_Grid;可視性はよしなに。
  • 初期化部分に以下のようなコードを書けばグリッドコントロールが表示されてめでたしめでたし
    この例で『MFC Grid Control…使い方を忘れてる』の画面が表示される。
    m_Grid.EnableDragAndDrop(TRUE);
    m_Grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(0xFF, 0xFF, 0xE0));
 
    m_Grid.SetEditable(TRUE);
    m_Grid.SetRowResize(TRUE);
    m_Grid.SetCallbackFunc(NULL, 0);
    m_Grid.Refresh();
    m_Grid.SetListMode(TRUE);
 
    m_Grid.InsertColumn(_T("連番"));
    m_Grid.InsertColumn(_T("ID"));
    m_Grid.InsertColumn(_T("世代"));
    m_Grid.InsertColumn(_T("ダミー4"));
    m_Grid.InsertColumn(_T("ダミー5"));
    m_Grid.InsertColumn(_T("ダミー6"));
    m_Grid.InsertColumn(_T("ダミー7"));
    m_Grid.SetFixedColumnSelection(FALSE);
    m_Grid.SetFixedRowSelection(TRUE);
    m_Grid.EnableColumnHide();
    m_Grid.AutoSize();
    m_Grid.SetColumnWidth(0, 40);
    m_Grid.SetColumnWidth(1, 150);
    m_Grid.ExpandLastColumn();
    m_Grid.SetCompareFunction(CGridCtrl::pfnCellNumericCompare);
 
    TCHAR buffer[BUFSIZ];
    TCHAR buffer2[BUFSIZ];
    for (int i = 1; i < 30; i++) {
        wsprintf(buffer, _T("%d"), i);
        m_Grid.SetRowCount(i);
        m_Grid.InsertRow(buffer);
        wsprintf(buffer2, _T("日本語テスト(%d)"), i);
        m_Grid.SetItemText(i, 1, buffer2);
        m_Grid.SetItemText(i, 2, buffer);
        m_Grid.SetItemText(i, 3, buffer);
        m_Grid.SetItemText(i, 4, buffer);
        m_Grid.SetItemText(i, 5, buffer);
        m_Grid.SetItemText(i, 6, buffer);
    }
    m_Grid.SetFixedRowCount(1);
    m_Grid.SetFixedColumnCount(2);
 
    m_Grid.ShowWindow(SW_SHOW);

CGridCtrlクラスは機能豊富で、もっと色々なことができます。わたしには、とても使いこなせませんが :|

Be Sociable, Share!

TrackBack URL :

Comments

  1. 1月 26th, 2009 | 4:58 PM

    TIさんからいただいたコメント

    初めまして、いきなりのコメント失礼致します。

    私は、WindowsCE向けのアプリケーションをeVC++で開発している者です。
    今回、画面上にグリッドコントロールを使用したいので、いろいろ調査していたところ、ここのサイトに飛んできました。

    10/24~10/25の記事を参考に、MFCGridControlを組み込んでみました。
    とても参考になり、感謝しています。

    そこでお願いなのですが、グリッド上のセルをコンボボックスに変更したいのですが、うまくいきません。MFCGridControlのサンプルコードを元にコンボボックスに変更するコードを組み込んだのですが、コンパイルは通るものの、コンボが表示されません。
    ご存じでしたら、MFCGridControlでグリッド上のセルをコンボボックスに変更する方法をご教授願えないでしょうか?

  2. 1月 26th, 2009 | 4:59 PM

    TIさん。どうもはじめまして。

    MFCGridControlの使い方をすっかり忘れてまして、でもコンボボックスはセルに貼り付けた記憶があるので辿ってみました ;)

    たぶん、CodeProjectのMFCGridControlからsourceのみのzipをダウンロードされたのではないかと…思うのですが違いますでしょうか?

    であれば、demo projectの方もダウンロードしてみてください。こちらを展開するとNewCellTypesというフォルダが在り、そこにGridCellComboクラスが実装されています。

    これを利用すれば、きっとコンボボックスが貼れるものと思います :)

    もし、デモのソースおよびGridCellComboクラスを見ても実装が分からないようでしたら具体例を示せる可能性はありますので再度書き込んでいただければと思います。

  3. TI
    1月 26th, 2009 | 5:51 PM

    まっきゅさん。親切なご回答ありがとうございます。
    #当該エントリにコメントせずに失礼致しました。

    sourceとdemoを両方ダウンロードして、コンボボックスを使う為には
    NewCellTypesのGridCellComboクラスが必要だってところまでは、解析してました。
    #混乱なんて、とんでもない。とても参考になっています。

    で、demoのソースを参考にセルをコンボボックスに変更する実装を行っているのですが、変更されないというのが現状です。

    何かの処理が足りないのか、WinCEでは不可能なのか、困っているところでした。

    一方的なお願いで恐縮ですが、具体例を示していただけると非常に助かります。

  4. 1月 26th, 2009 | 9:18 PM

    ちゃんとデモを解析されてたんですね。申しわけありません。
    WinCEでコンボを実施したことがないので、試してみました。一応、実現ができましたTIさんのお望みの形かはわかりませんが…。

    エントリ中の世代のカラムにコンボボックスを貼ってみます。

    for (int nCnt = 1; nCnt < 30; nCnt++) {

    m_Grid.SetItemText(nCnt, 1, _T("ID日本語テスト"));

    m_Grid.SetCellType(nCnt, 2, RUNTIME_CLASS(CGridCellCombo));
    m_Grid.SetItemText(nCnt, 2, _T("1世代"));
    CStringArray options;
    options.Add(_T("1世代"));
    options.Add(_T("2世代"));
    CGridCellCombo *pCell = (CGridCellCombo*)m_Grid.GetCell(nCnt, 2);
    pCell->SetOptions(options);
    pCell->SetStyle(CBS_DROPDOWNLIST);

    }

    これで、世代のカラムがコンボボックスになるかと思うのですが…いかがでしょう :?:

  5. TI
    1月 27th, 2009 | 9:27 AM

    まっきゅさん、こんにちは。
    迅速な、ご回答ほんとうに感謝いたします。

    さっそくコードを組み込んでみたところ、みごと実現できました!!!
    これが望んでいた形です。ご尽力に本当に感謝です。

    コンボが表示されなかった原因は、焦りすぎててデモの解析が不十分で、
    m_Grid.SetCellType(nCnt, 2, RUNTIME_CLASS(CGridCellCombo));
    の一文を見逃していた(組み込んでいなかった)という初歩的なものでした。
    申し訳ございません。

    余談ですが、私もジャンプ読んでます。
    今週分は、今回の件で忙しくて、まだ読んでませんが、
    技術系以外のことでも、ちょくちょくコメントさせていただきます。

  6. 1月 27th, 2009 | 9:55 AM

    実現できたようでなによりです :)

    原因は大抵そういうものですよね~わたしも良くやります。

    はぁい。今後ともよろしくお願いしますね。

Leave a reply