MFC中怎样让隐藏的窗口不获得焦点?

leewei2621 2010-12-23 04:49:39
MFC中,通过DoModal创建窗口时,当调用API函数CreateDlgIndirect之后,把窗口隐藏,但是窗口仍会获取当前焦点,有没有什么设置不让隐藏后的窗口获取焦点?
以下把DoModal()和MyRunModalLoop()重载了一下,但是还是没有成功,高手帮忙阿~~(红色部分是修改部分的代码):

INT_PTR CDlgSsGetImg::DoModal(BOOL m_bshow)
{
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||m_lpDialogTemplate != NULL);
// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;

HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);
// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
return -1;
HWND hWndParent = PreModal();
AfxUnhookWindowCreate();
BOOL bEnableParent = FALSE;
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
TRY
{
AfxHookWindowCreate(this);
TCHAR szTitle[500];
TCHAR szHandle[20];
::GetWindowText(GetForegroundWindow()->GetSafeHwnd(),szTitle,500);
wsprintf(szHandle, _T("%#lx"), GetForegroundWindow()->GetSafeHwnd());
g_clsLog.WriteLog(TRUE, theApp.m_szLogPath, __FILE__, __LINE__, _T("DoModal1"), _T("%s,%s"), szHandle, szTitle);

if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst))
{
::GetWindowText(GetForegroundWindow()->GetSafeHwnd(),szTitle,500);
wsprintf(szHandle, _T("%#lx"), GetForegroundWindow()->GetSafeHwnd());
g_clsLog.WriteLog(TRUE, theApp.m_szLogPath, __FILE__, __LINE__, _T("DoModal2"), _T("%s,%s"), szHandle, szTitle);
if (m_nFlags & WF_CONTINUEMODAL)
{
// enter modal loop
DWORD dwFlags = MLF_SHOWONIDLE;
if (GetStyle() & DS_NOIDLEMSG)
dwFlags |= MLF_NOIDLEMSG;
//VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
VERIFY(MyRunModalLoop(hid,dwFlags) == m_nModalResult);
}
if (m_hWnd != NULL)
SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
DestroyWindow();
PostModal();
// unlock/free resources as necessary
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
UnlockResource(hDialogTemplate);
if (m_lpszTemplateName != NULL)
FreeResource(hDialogTemplate);
return m_nModalResult;
}

int CDlgSsGetImg::MyRunModalLoop(BOOL hid,DWORD dwFlags)
{
ASSERT(::IsWindow(m_hWnd)); // window must be created
ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
HWND hWndParent = ::GetParent(m_hWnd);
m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
MSG *pMsg = AfxGetCurrentMessage();
for (;;)
{
ASSERT(ContinueModal());
while (bIdle &&
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
{
ASSERT(ContinueModal());
if (bShowIdle)
{
//ShowWindow(SW_SHOWNORMAL);
if (hid)
{
ShowWindow(SW_SHOWNORMAL);
}
else
{
ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
}

UpdateWindow();
bShowIdle = FALSE;
}
if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
{
::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
}
if ((dwFlags & MLF_NOKICKIDLE) ||
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
{
bIdle = FALSE;
}
}
do
{
ASSERT(ContinueModal());
if (!AfxPumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
//ShowWindow(SW_SHOWNORMAL);
if (hid)
{
ShowWindow(SW_SHOWNORMAL);
}
else
{
ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
}
UpdateWindow();
bShowIdle = FALSE;
}
if (!ContinueModal())
goto ExitModal;
if (AfxIsIdleMessage(pMsg))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
}
ExitModal:
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
return m_nModalResult;
}
...全文
552 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-01-20
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
zjfhgdx 2010-12-24
  • 打赏
  • 举报
回复
当这个隐藏的窗口得到焦点后再把焦点交给别的窗口不就可以了?
重载OnSetFocus,判断自己有没有隐藏,如果隐藏了那么xxx.setfocus()
allenhiman 2010-12-24
  • 打赏
  • 举报
回复
啊 那是个消息响应函数啊 mfc窗口在激活状态有变化时都会发一个 WM_ACTIVE 消息给窗口。你重载这个消息映射函数 做相应的逻辑处理
leewei2621 2010-12-24
  • 打赏
  • 举报
回复
谢谢楼上的回答奥~~
你的意思是DoModal和MyRunModalLoop都不用重载了吗,只重载onactive?
onactive的源码在哪里,没有找到阿?
allenhiman 2010-12-23
  • 打赏
  • 举报
回复
重载onactive 一旦被激活 立即变为不激活 是一种策略
记得在OnInitDialog里 return FALSE 好像可以 你试试看

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧