做MFC分割窗口时,其中含有视类CxxVew窗口,含有General Class (自定义的类CMyXX),在CMyXX中使用GetDC时:
CDC* pDC = GetDC();
出现标题中的问题,因为自己没有指定此设备上下文环境是哪个窗口的(没有获取某个窗口的句柄),即编译器不知道在哪个窗口对象中获取DC,且自定义的类又不是从CWnd类派生,所以程序会默认调用Windows Api中的GetDC函数:
WINUSERAPI
HDC
WINAPI
GetDC( HWND hWnd );
Windows Api函数原型中形参必须是某个窗口的句柄,不能为空,所以会出现标题中的错误,那么如何将视类窗口的指针传递给自定义的类中去使用呢?
解决方案:
在自定义的类MyXX.h 头文件声明一个CWnd* 指针变量p_WndView,再声明一个函数:void SetWindowWnd(CWnd* pWnd),在cpp文件中实现这个函数:
void CMyXX::SetWindowWnd(CWnd* pWnd)
{
p_WndView = pWnd;
}
在CxxView的头文件中包含MyXX.h这个头文件,且声明一个public的CMyXX的对象变量m_xx,然后在CxxVew.cpp中就可以使用m_xx.SetWindowWnd(this)来传递这个视图窗口的指针到CMyXX中的p_WndView变量中,在MyXX.cpp中就可以在图像显示的函数中使用:
CDC* pDC = p_WndView->GetDC();
获取视类窗口的设备上下文指针,进而获取句柄,接下来的操作就简单了