无法创建同一类的几个窗口,为什么?

时间:2012-03-23 07:16:52

标签: c++ mfc

我对MFC很陌生,所以这个问题可能非常愚蠢,但我似乎无法自己找到答案,所以就这样了。

我有一个从CWnd派生的自定义窗口控件。当我在对话框中只使用该控件的一个实例时,一切都很好。现在我尝试创建这样的几个实例:

for (int i = 0; i < 10; i++)
{
    control[i] = new CMyControl;
    control[i]->CreateEx(exStyle, name, "", style, CRect(i * 10, 0, 10, 10), 
                         this, IDC_FIRST + i, 0);
}

创建顺利,CreateEx()返回TRUE,但就消息处理而言,只有第一个实例接收任何内容,其余实例接收WM_CREATE然后静默,而不是单个WM_PAINT。

我在这里做错了什么?

编辑:整件事情看起来像这样:

class CMyControl : public CWnd
{
public: 
    CMyControl()
    {
        m_ClassName = AfxRegisterWndClass(
                    CS_VREDRAW | CS_HREDRAW,
                    ::LoadCursor(NULL, IDC_ARROW),
                    (HBRUSH) ::GetStockObject(WHITE_BRUSH),
                    ::LoadIcon(NULL, IDI_APPLICATION));
    } 

    LPCTSTR GetClassName() const {return m_ClassName;}

protected:    

    afx_msg int OnCreate(LPCREATESTRUCT) {return 0;}
    afx_msg void OnPaint() {}

DECLARE_MESSAGE_MAP()

private:   
    LPCTSTR m_ClassName;
};

BEGIN_MESSAGE_MAP(CMyControl, CWnd)
    ON_WM_CREATE()
    ON_WM_PAINT()    
END_MESSAGE_MAP()

//then, in my main dialog's OnInitDialog,

BOOL CMyDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    CMyControl* controls[10];

    for (unsigned int i = 0; i < 10; i++)
    {
        controls[i] = new CMyControl;
        controls[i]->CreateEx(WS_EX_CLIENTEDGE, controls[i]->GetClassName(), L"", 
        WS_CHILD | WS_VISIBLE, CRect(i*10, 0, 10, 10), this, 1006 + i, 0);
    }
    return TRUE;
}

这里没有解除分配代码,但原理是相同的。

编辑2:好的,想通了。原因是我是一个愚蠢的人:

CRect(i * 10, 0, 10, 10)

参数是左/右/上/下,而不是左/右/宽/高。

很抱歉。

0 个答案:

没有答案