近期接到一个任务,将自己写的一个图片编辑器做成 ActiveX,翻了翻代码看到图片编辑器的源程序是基于 SDK 和 GDI+ 的,于是就用 ATL 创建了一个基本样式的 ActiveX 控件,然后在它的 MSG_MAP 中连接相应窗口消息,直接把图片编辑器的主窗口消息过程填了上去:
BEGIN_MSG_MAP(CPicEditCtl)
if (uMsg == WM_CREATE ||
uMsg == WM_COMMAND ||
uMsg == WM_NOTIFY ||
uMsg == WM_DESTROY)
{
bHandled = TRUE;
lResult = UWMWndProc(hWnd, uMsg, wParam, lParam);
if (bHandled)
return TRUE;
}
CHAIN_MSG_MAP(CComControl < CPicEditCtl > )
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
if (uMsg == WM_CREATE ||
uMsg == WM_COMMAND ||
uMsg == WM_NOTIFY ||
uMsg == WM_DESTROY)
{
bHandled = TRUE;
lResult = UWMWndProc(hWnd, uMsg, wParam, lParam);
if (bHandled)
return TRUE;
}
CHAIN_MSG_MAP(CComControl < CPicEditCtl > )
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
由于用到 ImageList_LoadImage(HINSTANCE, ID) 函数,所以在处理 WM_CREATE 的时候,在函数中增加了一行,获取实例句柄:
g_hInst
=
(HINSTANCE)GetWindowLongPtr(hWnd, GWL_HINSTANCE);
运行后测试还能用,但似乎有些资源释放方面的问题……再说吧