【发布时间】: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(),另一个在您的“最后绘制单元格时”代码中创建。第二个实际上创建了一个编辑控件,但看起来它存在内存泄漏,因为来自new的CEdit*值只是在块的末尾被丢弃。 -
AAT 是对的。您创建了两个不同的 CEdit 实例。据我记得,您可以使用 GetParent() 函数来获取窗口父级。 msdn.microsoft.com/en-us/library/0x2wyab0(v=vs.80).aspx
-
是的,谢谢,尝试不同的东西是个错误。