MFC ActiveX控件 里面的CDialog透明有关问题!
MFC ActiveX控件 里面的CDialog透明问题!!!!
查了很久的资料,发现要用windowless的属性,问题是我重载了这个地方没任何反应:
这是我之前求助的帖子http://bbs.****.net/topics/390662044?page=1#post-396277948 100分都散光了,只剩最后的50分了!项目需要真的很捉急!希望各位大神帮帮忙!
目的就是在ActiveX控件里面的某个CDialog窗口做个背景透明的效果就行,底层的CDialog用来播放视频,做背景用。上层透明直接透到底层去!
我自己创建了一个windowless属性的ActiveX控件,发现无法响应任何消息(WM_CREATE),好奇葩的属性,真心不会用!现在项目快做完了,就只差这一个透明的功能,也不想大改!
------解决思路----------------------
MFC ActiveX里面的非模态对话框是没有消息循环的,必须得用Hook才行。在主窗体中增加hook处理
1.添加全局hook变量和回调函数
2.OnCreate函数中初始化hook
3.设置回调函数
4.在OnClose函数中卸载hook
------解决思路----------------------
不用,加上hook后就可以对非模态对话框进行消息响应了
------解决思路----------------------
放到ocx应用程序的cpp中或主窗口中试下
------解决思路----------------------
不是,肯定要放在ActiveX里面呐,放在xxx.cpp或xxxCtrl.cpp里面,我之前的一个项目就是采取这种方式,ActiveX里面的所有非模态对话框都可以响应消息了
------解决思路----------------------
不一定是OnCreate里面。。程序初始化Init时加载hook,exit里面卸载hook
查了很久的资料,发现要用windowless的属性,问题是我重载了这个地方没任何反应:
DWORD CTransRectCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
dwFlags |= windowlessActivate;
return dwFlags;
}
这是我之前求助的帖子http://bbs.****.net/topics/390662044?page=1#post-396277948 100分都散光了,只剩最后的50分了!项目需要真的很捉急!希望各位大神帮帮忙!
目的就是在ActiveX控件里面的某个CDialog窗口做个背景透明的效果就行,底层的CDialog用来播放视频,做背景用。上层透明直接透到底层去!
我自己创建了一个windowless属性的ActiveX控件,发现无法响应任何消息(WM_CREATE),好奇葩的属性,真心不会用!现在项目快做完了,就只差这一个透明的功能,也不想大改!
------解决思路----------------------
MFC ActiveX里面的非模态对话框是没有消息循环的,必须得用Hook才行。在主窗体中增加hook处理
1.添加全局hook变量和回调函数
HHOOK hHook = NULL;//设立一个消息钩子
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
2.OnCreate函数中初始化hook
// Install the WH_GETMESSAGE hook function.
hHook = ::SetWindowsHookEx(
WH_GETMESSAGE,
GetMessageProc,
NULL,
GetCurrentThreadId());
ASSERT (hHook);
3.设置回调函数
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Switch the module state for the correct handle to be used.
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
// If this is a keystrokes message, translate it in controls'
// PreTranslateMessage().
LPMSG lpMsg = (LPMSG) lParam;
if( (nCode >= 0) &&
PM_REMOVE == wParam &&
AfxGetApp()->PreTranslateMessage((LPMSG)lParam))
{
// The value returned from this hookproc is ignored, and it cannot
// be used to tell Windows the message has been handled. To avoid
// further processing, convert the message to WM_NULL before
// returning.
//MessageBox(NULL,_T("Test"),NULL,NULL);//测试
//lpMsg->message = WM_NULL;
//lpMsg->lParam = 0L;
lpMsg->wParam = 0;
}
// Passes the hook information to the next hook procedure in
// the current hook chain.
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
4.在OnClose函数中卸载hook
VERIFY (::UnhookWindowsHookEx (hHook));
------解决思路----------------------
不用,加上hook后就可以对非模态对话框进行消息响应了
------解决思路----------------------
放到ocx应用程序的cpp中或主窗口中试下
------解决思路----------------------
放到ocx应用程序的cpp中或主窗口中试下
不用,加上hook后就可以对非模态对话框进行消息响应了
我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!
我放在调用active的主程序也是一样的,没有进入到控件的on_create中去
------解决思路----------------------
不是,肯定要放在ActiveX里面呐,放在xxx.cpp或xxxCtrl.cpp里面,我之前的一个项目就是采取这种方式,ActiveX里面的所有非模态对话框都可以响应消息了 放到ocx应用程序的cpp中或主窗口中试下
不用,加上hook后就可以对非模态对话框进行消息响应了
我试了好像没用,根本连OnCreate都没进去,就没法激活钩子了!
我放在调用active的主程序也是一样的,没有进入到控件的on_create中去
现在我的activex里面还没有创建任何窗口,activex ctrl的on_create就没办法触发了