我对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)
参数是左/右/上/下,而不是左/右/宽/高。
很抱歉。