【问题标题】:MFC CEdit passing pParentWndMFC CEdit 传递 pParentWnd
【发布时间】:2012-07-04 23:30:39
【问题描述】:

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

我正在尝试使文本正常工作。在主视图类中我有:

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

这是我看到的:

【问题讨论】:

  • 为什么要创建两个不同的CEdits?在OnInsertText() 中创建了一个,您将其传递给CellType(),另一个在您的“最后绘制单元格时”代码中创建。第二个实际上创建了一个编辑控件,但看起来它存在内存泄漏,因为来自newCEdit* 值只是在块的末尾被丢弃。
  • AAT 是对的。您创建了两个不同的 CEdit 实例。据我记得,您可以使用 GetParent() 函数来获取窗口父级。 msdn.microsoft.com/en-us/library/0x2wyab0(v=vs.80).aspx
  • 是的,谢谢,尝试不同的东西是个错误。

标签: c++ mfc cedit


【解决方案1】:

不要在 OnPaint() 上创建子窗口,这会带来灾难。您需要自己绘制,编辑单个单元格时最多可以重复使用单个CEdit。

我认为您正在尝试制作一个网格,其中每个单元格都是控件(窗口),例如在网格中滚动时一起移动。这总是会产生视觉伪影(抖动运动)并在显示半单元时引起问题。

您将不得不派生自己的单元格类型,他们自己绘制(可能使用 DrawFrameControl() API 来处理更复杂的类型),并且当单元格的内容为正在编辑。大致就是前面提到的 Maunder CGridCtrl 使用的设计。

【讨论】:

  • 谢谢,一开始我不明白你在说什么,但经过一番研究,它是有道理的并且它有效(派生了一个新课程)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2011-09-06
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多