传递pParentWnd的MFC CEdit

时间:2012-07-03 19:20:39

标签: c++ mfc cedit

我正在创建一个非常简单的电子表格类型应用程序。它有一个绘制单元格的网格,用户可以指定单元格类型(文本,复选框,单选按钮)。

我正试图让文字解决。在主视图类中,我有:

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);

这就是我所看到的: enter image description here

2 个答案:

答案 0 :(得分:0)

我想如果这是一个家庭作业问题,那么值得重新发明轮子。 OTOH,像codeproject.com上的Chris Maunder那样已经有了不错的网格。

如果您每次绘制单元格时都在创建CEdit控件,那么您将遇到问题。您基本上只想为您正在编辑的单元格创建一个编辑单元格,而可能没有其他单元格。在(编辑控件的)父窗口中,您可能希望使用或设置其样式以具有WS_CLIPCHILDREN,以便它不会在子编辑控件上绘制或擦除。您至少可以查看设置样式标志是否有效。

答案 1 :(得分:0)

不要在OnPaint()上创建受灾害限制的子窗口。你需要做自己的绘图,当编辑单个单元格时,你最多可以重复使用一个CEdit。

我认为你正试图制作一个网格,其中每个单元格都是控制(窗口),例如在网格中滚动时移动。这将始终产生视觉伪像(抖动),并在显示半个单元格时引起问题。

您将不得不派生自己的单元格类型,他们自己绘制图形(可能使用DrawFrameControl()API用于更复杂的类型),并且当单元格的内容为时,可能会弹出子窗口正在编辑。这大致是前面提到的Maunder CGridCtrl使用的设计。