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控制元件中輸入,有大佬遇到過類似情況嗎?
uj5u.com熱心網友回復:
showwindow(true)uj5u.com熱心網友回復:
我是這樣用的,但結果還是沒有達到理想的狀態;
else if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
{
m_PaintManager.SetFocus(m_pNameEdit, true);
if (NULL != m_pNameEdit)
{
//m_pNameEdit->SetFocus();
m_pNameEdit->SetSelAll();
}
}
uj5u.com熱心網友回復:
我試了,任然沒有焦點,游標是設定成功了,鍵盤輸入的訊息如果不用滑鼠點一下界面,默認是發給父視窗的
uj5u.com熱心網友回復:
我跟了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);
}
uj5u.com熱心網友回復:
create的時候~WS_EX_NOACTIVE試試,我記得之前解決過這里問題,如果不行試試showwindow之后就呼叫setforegroundwindow
uj5u.com熱心網友回復:
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);
}
create的時候~WS_EX_NOACTIVE試試,我記得之前解決過這里問題,如果不行試試showwindow之后就呼叫setforegroundwindow
mfc不知道存不存在這個問題,非模態對話框創建非模態對話框,焦點在哪?
uj5u.com熱心網友回復:
create的時候~WS_EX_NOACTIVE試試,我記得之前解決過這里問題,如果不行試試showwindow之后就呼叫setforegroundwindow
mfc不知道存不存在這個問題,非模態對話框創建非模態對話框,焦點在哪?
鍵盤訊息到父視窗了?但是沒有到子視窗?你不會把子視窗的訊息回圈給漏了吧?因為如果子視窗沒有訊息回圈就會轉到父視窗啊。你可以在父視窗里面轉過去,也可以啟動子視窗的訊息回圈啊。
uj5u.com熱心網友回復:
都試過了,無用。新建的視窗感覺上已經在前端了,就是鍵盤焦點沒有。鍵盤輸入訊息都發到父視窗了。
create的時候~WS_EX_NOACTIVE試試,我記得之前解決過這里問題,如果不行試試showwindow之后就呼叫setforegroundwindow
mfc不知道存不存在這個問題,非模態對話框創建非模態對話框,焦點在哪?
鍵盤訊息到父視窗了?但是沒有到子視窗?你不會把子視窗的訊息回圈給漏了吧?因為如果子視窗沒有訊息回圈就會轉到父視窗啊。你可以在父視窗里面轉過去,也可以啟動子視窗的訊息回圈啊。
根據您講的,我特意仔細去看了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);
}
}
uj5u.com熱心網友回復:
根據您講的,我特意仔細去看了duilib底層原始碼,是有訊息處理函式的,如果沒有,也不可能新視窗點擊有點擊之后能夠收到鍵盤訊息
肯定有訊息處理函式的,我是說沒有訊息回圈,你加一下訊息回圈試試。
CPaintManagerUI::MessageLoop();
uj5u.com熱心網友回復:
我是這樣用的,但結果還是沒有達到理想的狀態;
else if (msg.sType == DUI_MSGTYPE_WINDOWINIT)
{
m_PaintManager.SetFocus(m_pNameEdit, true);
if (NULL != m_pNameEdit)
{
//m_pNameEdit->SetFocus();
m_pNameEdit->SetSelAll();
}
}
我試了,任然沒有焦點,游標是設定成功了,鍵盤輸入的訊息如果不用滑鼠點一下界面,默認是發給父視窗的
我現在是視窗彈出來后,焦點在Edit上,鍵盤輸入也在Edit上,但滑鼠經過視窗上的其他按鈕后,焦點就不見了
uj5u.com熱心網友回復:
我把所有的非模態全部換成模態了,至少模態沒有bug轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61556.html
標籤:C++ 語言
下一篇:求大佬找一下錯誤 輸出不了
