首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递pParentWnd的MFC CEdit

传递pParentWnd的MFC CEdit
EN

Stack Overflow用户
提问于 2012-07-04 03:20:39
回答 2查看 622关注 0票数 0

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

我在试着把课文写出来。在主要的View类中,我有:

代码语言:javascript
复制
void CSpreadView::OnInsertText()
{
    CEdit* pEdit = new CEdit;
    CWnd* pParentWnd = this;
    grid.CellType(pEdit, pParentWnd);
    Invalidate();   
    UpdateWindow();
}

我正在传递父窗口,因为如果我在另一个类中,我不知道是否有方法可以找到父窗口。

所以接收它的函数:

代码语言:javascript
复制
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);
    }
}

最后,当绘制单元格时,它会这样做:

代码语言:javascript
复制
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);
    }

问题是:它实际上绘制了方框,但是文本是不可见的。当我输入时,它会闪烁,但当我停止时,它就会消失。有人知道为什么会这样吗?

如您所知,我希望单元格控制其类型并进行绘图,因为用户可以添加/删除行和列。这样我就不需要跟踪之前绘制的文本框了。网格的绘制方式为:

代码语言:javascript
复制
CBrush brush(RGB(color, color, color));
pDC->SelectObject(&brush);
pDC->Rectangle(x1, y1, x2, y2);

这是我所看到的:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-04 23:30:40

不要在OnPaint()上创建子窗口,这将导致灾难。您需要自己绘制,在编辑单个单元格时,最多只能重用单个CEdit。

我认为你正在尝试创建一个网格,其中每个单元格都是控件(窗口),例如,当你在网格中滚动时,它将沿着网格移动。这将总是产生视觉伪影(抖动),并在显示半单元格时导致问题。

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-04 04:09:35

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11317719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档