有熟悉Duilib界面库的吗?

yiyefangzhou24 2020-05-08 06:58:34
win32中导入的界面库,这是主界面
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

CPaintManagerUI::SetInstance(hInstance);
CMainFrameWnd MainWnd;
MainWnd.Create(NULL, _T(""), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
MainWnd.CenterWindow();
MainWnd.ShowModal();
}

主界面中创建了一个非模态对话框
CTestFrame *pCmd = new CTestFrame ();
pTest->Init(&m_PaintManager);
pTest->ShowWindow();


非模态对话框创建的时候无论在pTest->Init()函数中怎样发送setfocuse消息,新创建的非模态对话框始终得不到键盘输入焦点,必须要鼠标点一下对话框,才能在Edit控件中输入,有大佬遇到过类似情况吗?
...全文
296 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
yiyefangzhou24 2020-05-18
  • 打赏
  • 举报
回复
我把所有的非模态全部换成模态了,至少模态没有bug
simple 2020-05-16
  • 打赏
  • 举报
回复
引用 3 楼 yiyefangzhou24 的回复:
[quote=引用 2 楼 simple 的回复:] 我是这样用的,但结果还是没有达到理想的状态;

	else if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
	{
		m_PaintManager.SetFocus(m_pNameEdit, true);
		if (NULL != m_pNameEdit)
		{
			//m_pNameEdit->SetFocus();
			m_pNameEdit->SetSelAll();
		}
	}
我试了,任然没有焦点,光标是设定成功了,键盘输入的消息如果不用鼠标点一下界面,默认是发给父窗口的[/quote] 我现在是窗口弹出来后,焦点在Edit上,键盘输入也在Edit上,但鼠标经过窗口上的其他按钮后,焦点就不见了
  • 打赏
  • 举报
回复
引用 8 楼 yiyefangzhou24 的回复:
根据您讲的,我特意仔细去看了duilib底层源码,是有消息处理函数的,如果没有,也不可能新窗口点击有点击之后能够收到键盘消息

肯定有消息处理函数的,我是说没有消息循环,你加一下消息循环试试。
CPaintManagerUI::MessageLoop();
yiyefangzhou24 2020-05-13
  • 打赏
  • 举报
回复
引用 7 楼 zjq9931 的回复:
[quote=引用 6 楼 yiyefangzhou24 的回复:] create的时候~WS_EX_NOACTIVE试试,我记得之前解决过这里问题,如果不行试试showwindow之后就调用setforegroundwindow
都试过了,无用。新建的窗口感觉上已经在前端了,就是键盘焦点没有。键盘输入消息都发到父窗口了。 mfc不知道存不存在这个问题,非模态对话框创建非模态对话框,焦点在哪?[/quote] 键盘消息到父窗口了?但是没有到子窗口?你不会把子窗口的消息循环给漏了吧?因为如果子窗口没有消息循环就会转到父窗口啊。你可以在父窗口里面转过去,也可以启动子窗口的消息循环啊。[/quote] 根据您讲的,我特意仔细去看了duilib底层源码,是有消息处理函数的,如果没有,也不可能新窗口点击有点击之后能够收到键盘消息
LRESULT CALLBACK CWindowWnd::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    CWindowWnd* pThis = NULL;
    if( uMsg == WM_NCCREATE ) {
        LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
        pThis = static_cast<CWindowWnd*>(lpcs->lpCreateParams);
        pThis->m_hWnd = hWnd;
        ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LPARAM>(pThis));
    } 
    else {
        pThis = reinterpret_cast<CWindowWnd*>(::GetWindowLongPtr(hWnd, GWLP_USERDATA));
        if( uMsg == WM_NCDESTROY && pThis != NULL ) {
            LRESULT lRes = ::CallWindowProc(pThis->m_OldWndProc, hWnd, uMsg, wParam, lParam);
            ::SetWindowLongPtr(pThis->m_hWnd, GWLP_USERDATA, 0L);
            if( pThis->m_bSubclassed ) pThis->Unsubclass();
            pThis->m_hWnd = NULL;
            pThis->OnFinalMessage(hWnd);
            return lRes;
        }
    }
    if( pThis != NULL ) {
        return pThis->HandleMessage(uMsg, wParam, lParam);
    } 
    else {
        return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
}
  • 打赏
  • 举报
回复
引用 6 楼 yiyefangzhou24 的回复:
create的时候~WS_EX_NOACTIVE试试,我记得之前解决过这里问题,如果不行试试showwindow之后就调用setforegroundwindow
都试过了,无用。新建的窗口感觉上已经在前端了,就是键盘焦点没有。键盘输入消息都发到父窗口了。 mfc不知道存不存在这个问题,非模态对话框创建非模态对话框,焦点在哪?[/quote] 键盘消息到父窗口了?但是没有到子窗口?你不会把子窗口的消息循环给漏了吧?因为如果子窗口没有消息循环就会转到父窗口啊。你可以在父窗口里面转过去,也可以启动子窗口的消息循环啊。
yiyefangzhou24 2020-05-11
  • 打赏
  • 举报
回复
引用 5 楼 zjq9931 的回复:
[quote=引用 4 楼 yiyefangzhou24 的回复:] [quote=引用 1 楼 zjq9931 的回复:] showwindow(true)
我跟了duilib showwindow 的代码,默认就是true

void ShowWindow(bool bShow = true, bool bTakeFocus = true);

void CWindowWnd::ShowWindow(bool bShow /*= true*/, bool bTakeFocus /*= false*/)
{
    ASSERT(::IsWindow(m_hWnd));
    if( !::IsWindow(m_hWnd) ) return;
    ::ShowWindow(m_hWnd, bShow ? (bTakeFocus ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE) : SW_HIDE);
}
[/quote] create的时候~WS_EX_NOACTIVE试试,我记得之前解决过这里问题,如果不行试试showwindow之后就调用setforegroundwindow [/quote]都试过了,无用。新建的窗口感觉上已经在前端了,就是键盘焦点没有。键盘输入消息都发到父窗口了。 mfc不知道存不存在这个问题,非模态对话框创建非模态对话框,焦点在哪?
  • 打赏
  • 举报
回复
引用 4 楼 yiyefangzhou24 的回复:
[quote=引用 1 楼 zjq9931 的回复:]
showwindow(true)

我跟了duilib showwindow 的代码,默认就是true

void ShowWindow(bool bShow = true, bool bTakeFocus = true);

void CWindowWnd::ShowWindow(bool bShow /*= true*/, bool bTakeFocus /*= false*/)
{
ASSERT(::IsWindow(m_hWnd));
if( !::IsWindow(m_hWnd) ) return;
::ShowWindow(m_hWnd, bShow ? (bTakeFocus ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE) : SW_HIDE);
}
[/quote]

create的时候~WS_EX_NOACTIVE试试,我记得之前解决过这里问题,如果不行试试showwindow之后就调用setforegroundwindow
yiyefangzhou24 2020-05-11
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
showwindow(true)

我跟了duilib showwindow 的代码,默认就是true

void ShowWindow(bool bShow = true, bool bTakeFocus = true);

void CWindowWnd::ShowWindow(bool bShow /*= true*/, bool bTakeFocus /*= false*/)
{
ASSERT(::IsWindow(m_hWnd));
if( !::IsWindow(m_hWnd) ) return;
::ShowWindow(m_hWnd, bShow ? (bTakeFocus ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE) : SW_HIDE);
}
yiyefangzhou24 2020-05-11
  • 打赏
  • 举报
回复
引用 2 楼 simple 的回复:
我是这样用的,但结果还是没有达到理想的状态;

else if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
{
m_PaintManager.SetFocus(m_pNameEdit, true);
if (NULL != m_pNameEdit)
{
//m_pNameEdit->SetFocus();
m_pNameEdit->SetSelAll();
}
}

我试了,任然没有焦点,光标是设定成功了,键盘输入的消息如果不用鼠标点一下界面,默认是发给父窗口的
simple 2020-05-11
  • 打赏
  • 举报
回复
我是这样用的,但结果还是没有达到理想的状态;

	else if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
	{
		m_PaintManager.SetFocus(m_pNameEdit, true);
		if (NULL != m_pNameEdit)
		{
			//m_pNameEdit->SetFocus();
			m_pNameEdit->SetSelAll();
		}
	}
  • 打赏
  • 举报
回复
showwindow(true)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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