0

非常に単純なスプレッドシート タイプのアプリケーションを作成しています。セルを描画するグリッドがあり、ユーザーはセルの種類 (テキスト、チェック ボックス、ラジオ ボタン) を指定できます。

私はテキストを解決しようとしています。メインの View クラスには次のものがあります。

void CSpreadView::OnInsertText()
{
    CEdit* pEdit = new CEdit;
    CWnd* pParentWnd = this;
    grid.CellType(pEdit, pParentWnd);
    Invalidate();   
    UpdateWindow();
}

別のクラスにいる場合、親ウィンドウを見つける方法があるかどうかわからないため、親ウィンドウを渡します。

したがって、それを受け取る関数:

void Grid::CellType(CEdit* pEdit, CWnd* pParentWnd)
{
    for (int a=0; a<(int) cells.size(); a++)
    {
        if(cells[a]->selected)
            cells[a]->Type(pEdit, pParentWnd);
    }
}

最後に、セルが描画されると、次のようになります。

if(type=="text")
    {
        CEdit* pEdit = new CEdit;
        pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, CRect(x1+10, y1+10, x2-10, y2-10), pParentWnd, 1);
    }

問題: 実際にはボックスを描画しますが、テキストは見えません。入力すると点滅しますが、停止すると消えます。なぜこれが起こっているのか誰にも分かりますか?

ご存知のように、ユーザーは行と列を追加/削除できるため、セルのタイプを制御して描画を行いたいと思います。つまり、以前に描画されたテキスト ボックスを追跡する必要はありません。グリッドは次のように描画されます。

CBrush brush(RGB(color, color, color));
pDC->SelectObject(&brush);
pDC->Rectangle(x1, y1, x2, y2);

これは私が見るものです: ここに画像の説明を入力

4

2 に答える 2

0

これが宿題である場合は、車輪を再発明する価値があると思います. OTOH、codeproject.com の Chris Maunder のような適切なグリッドが既に存在します。

セルを描画するたびに CEdit コントロールを作成すると、問題が発生します。基本的に、編集しているセルに対して編集セルを 1 つだけ持つ必要があり、おそらく他のセルは必要ありません。(エディット コントロールの) 親ウィンドウで、子エディット コントロールをペイントまたは消去しないように、そのスタイルを WS_CLIPCHILDREN で作成または設定することができます。少なくとも、スタイル フラグを設定すると効果があるかどうかを確認できます。

于 2012-07-03T20:09:35.147 に答える
0

OnPaint() で子ウィンドウを作成しないでください。災害が発生する可能性があります。独自の描画を行う必要があります。単一のセルを編集するときに、最大で単一の CEdit を再利用できます。

各セルがコントロール(ウィンドウ)であるグリッドを作成しようとしていると思います。たとえば、グリッドをスクロールすると移動します。これにより、常に視覚的なアーティファクト (ぎくしゃくした動き) が発生し、ハーフセルを表示するときに問題が発生します。

独自のセル型を派生させる必要があります。セル型は独自の描画を行い (より複雑な型には DrawFrameControl() API を使用する可能性があります)、セルのコンテンツが編集されているときに子ウィンドウをポップアップする可能性があります。これは、前述の Maunder CGridCtrl で使用されている設計とほぼ同じです。

于 2012-07-04T15:30:39.940 に答える