簡體   English   中英

如何在MFC自定義控件中設置控件焦點

[英]How to set control focus inside an MFC custom control

專家!

我正在使用一個繼承CWnd的類,以便使用水平滾動條使內容可見

我要創建的控件如下所示:

在此處輸入圖片說明

但是,我有一些問題,還有一個問題

當按鈕獲得焦點時,它將變為藍色。 如果按下另一個按鈕,則接收到現有焦點的按鈕應處於未聚焦狀態。

在此處輸入圖片說明

該按鈕不會釋放焦點,如第二張圖片所示。

但是,上述問題是在Dialog中而不是在SDI中實現時發生的。

我需要幫助解決這個問題。

自定義控件創建代碼;

m_ScrollWnd.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 1234);

BOOL CScrollWnd::Create(DWORD dwStyle, CRect &rect, CWnd *pParent, UINT nID)
{
    dwStyle |= ((WS_HSCROLL) );

    return CWnd::Create(CScrollWnd::IID, nullptr, dwStyle, rect, pParent, nID);
}


m_Button3.Create(_T("Hello3"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 0, 0), this, 1238);

所謂的“默認按鈕處理”是通過名為IsDialogMessage的函數完成的。

控制它的最簡單方法是使父控件成為一個從CDialog的窗口,或者如果它是一個從CFormView派生的視圖。 MFC將在適當的PreTranslateMessage處理程序中為您處理所有這一切。

如果要自己執行此操作,則可以插入自己的PreTranslateMessage處理程序並使用IsDialogMessage CWnd類還具有一個名為CWnd::PreTranslateInput的預定義實現。

因此,這可能就足夠了:

BOOL CYourParentClass::PreTranslateMessage(MSG* pMsg)
{
    // allow standard processing
    if (__super::PreTranslateMessage(pMsg))
        return TRUE;
    return PreTranslateInput(pMsg);
}

從我的角度來看,使用CFormView / CDialog是更好的方法,因為還解決了其他“有關對話框的問題”。 包括放松,獲得關注和激活...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM