原文地址 http://blog.csdn.net/wuzoujing/article/details/4943242
由于自定义控件Custom control需要进行类绑定,只有注册窗口类后才能显示窗口。因此一般定义自定义控件对象后,在构造函数中用AfxRegisterClass注册窗口类,而AfxRegisterClass并不激活WM_CREATE消息,也就是说不能响应到OnCreate函数。那怎么响应OnCreate呢?
替代办法:OnCreate的内容可以用PreSubclassWindow代替。
- COpenGLControl::COpenGLControl()
- {
- RegisterWndClass();
- }
- BOOL COpenGLControl::RegisterWndClass()
- {
- WNDCLASS windowclass;
- HINSTANCE hInst = AfxGetInstanceHandle();
- if (!(::GetClassInfo(hInst, MYWNDCLASS, &windowclass)))
- {
- windowclass.style = CS_DBLCLKS;// | CS_HREDRAW | CS_VREDRAW;
- windowclass.lpfnWndProc = ::DefWindowProc;
- windowclass.cbClsExtra = windowclass.cbWndExtra = 0;
- windowclass.hInstance = hInst;
- windowclass.hIcon = NULL;
- windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
- windowclass.hbrBackground = ::GetSysColorBrush(COLOR_WINDOW);
- windowclass.lpszMenuName = NULL;
- windowclass.lpszClassName = MYWNDCLASS;
- if (!AfxRegisterClass(&windowclass))
- {
- AfxThrowResourceException();
- return FALSE;
- }
- }
- return TRUE;
- }
- void COpenGLControl::PreSubclassWindow()
- {
- CDialog::PreSubclassWindow();
- dc = new CClientDC(this);
- CRect rc;
- GetClientRect(&rc);
- openGLDevice.create(dc->m_hDC);
- ShowWindow(SW_SHOW);
- SetForegroundWindow();
- SetFocus();
- ReSizeGLScene(rc.Width(),rc.Height());
- InitGL();
- }
当然,如果不用自定义控件Custom control,而采用类似第三方控件一样,通过void COpenGLControl::Create(CRect rect, CWnd *parent)再调用CreateEx创建窗口,则会激活WM_CREATE消息。
- void COpenGLControl::Create(CRect rect, CWnd *parent)
- {
- CString className = AfxRegisterWndClass(
- CS_HREDRAW | CS_VREDRAW | CS_OWNDC,
- NULL,
- (HBRUSH)GetStockObject(BLACK_BRUSH),
- NULL);
- CreateEx(
- 0,
- className,
- "OpenGL",
- WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
- rect,
- parent,
- 0);
- }
- int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- dc = new CClientDC(this);
- openGLDevice.create(dc->m_hDC);
- ShowWindow(SW_SHOW);
- SetForegroundWindow();
- SetFocus();
- ReSizeGLScene(lpCreateStruct->cx, lpCreateStruct->cy);
- InitGL();
- return 0;
- }