很困惑的问题,Dll中的MDI子窗口获取按键事件的问题!!(300高分求解!!!)(300分)

  • 主题发起人 主题发起人 dylb
  • 开始时间 开始时间
D

dylb

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟将MDI子窗口封装在Dll中供主窗口调用,一切都正常,但有个要命的问题:
在MDI子窗口中无法对Tab键进行响应。小弟查询过以前的类似帖子,但是没有找到
一个比较满意的解决办法。千万别告诉我用什么钩子技术或者拦截windows消息来
处理,那样我感觉很复杂。请各位兄弟帮忙,分不够还可以再开帖子加!!!!
不胜感激!!!
 
以前有类似的贴子,我记不得了,但他在这个地方上传了例子
http://61.132.118.185:8080/dispdocnew.php?t=&id=3696
 
to:梦菲斯

你给出的例子我已经下载并试过,可惜Dll中封装的是个模式窗口,模式窗口当然可以
获得焦点,请老兄帮我找个MDi子窗口的例子!感谢了!
 
下面是c++ builder的例子,将retrun键更改为tab键即可。 原理是一样的, 你也可以有本论坛搜索TranslateMessage找到答案。

在formshow中增加如下代码:
SaveMessageHandler = Application->OnMessage;
Application->OnMessage = MyMessageHandler;


void __fastcall TMainForm::MyMessageHandler(tagMSG &Msg, bool &Handled)
{
if((HaveWebFrmActive())
&& ((Msg.message >= WM_KEYFIRST) && (Msg.message <= WM_KEYLAST))
&& ((Msg.wParam == VK_RETURN)
|| (Msg.wParam == VK_BACK)
|| (Msg.wParam == VK_LEFT)
|| (Msg.wParam == VK_RIGHT)))
{
Handled = true;
TranslateMessage(&Msg);
DispatchMessage(&Msg);

if((Msg.wParam == VK_RETURN))
{
if(MDIChildCount>0)
{
if(comIE->Focused())
{
Handled = false;
}
else
{
DWORD dwRet;
Handled = false;
SendMessageTimeout(((TFrmWeb*)MDIChildren[0])->CppWebBrowser->Handle,Msg.message,Msg.wParam,Msg.lParam,SMTO_ABORTIFHUNG ,1000,&dwRet);
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
else //如果没有WEB窗体,
{
Handled = false;
}
}
else
{
Handled = true;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
else
Handled = false;
}

bool TMainForm::HaveWebFrmActive()
{
if(Screen->ActiveForm != NULL)
if(Screen->ActiveForm->Handle == MainForm->Handle)
return true;
else
for(int i = 0; i < MDIChildCount; i++)
{
if(MDIChildren->Handle == Screen->ActiveForm->Handle)
return true;
}
return false;
}
 
把Runtime Packages 勾上
 
http://61.132.118.185:8080/dispdocnew.php?t=&id=2749
 
小笨笨的例子已经下载运行通过,符合我的要求。
源代码正在研究中,真的很感谢大家!
分数大家分吧,小笨苯当然要多点,各位没有意见吧!
 
后退
顶部