2010-01-05 80 views
0

在一個典型的MFC C++對話框,我要動態創建對話框上的浮動列表框(或其他標準控制),可以延伸超過對話框的邊界 - 所以它不能成爲一個簡單的孩子或將被剪裁。MFC:浮動工具欄窗口中不可見(WS_EX_TOOLWINDOW)

尋找類似的一些作品,我試圖去實現它,但是所示,當從未出現的窗口。

在我.h文件中我有:

然後在我的OnInitDialog方法(基於塞爾的帖子)
CListBox m_ListBox; 

BOOL CYourDlg::OnInitDialog() 
{ 
CDialog::OnInitDialog(); 

m_ListBox.CreateEx(WS_EX_STATICEDGE | WS_EX_TOOLWINDOW, _T("LISTBOX"), NULL, 
    WS_CHILD | WS_CAPTION | LBS_STANDARD | WS_HSCROLL | WS_SYSMENU | WS_VISIBLE, 
    CRect(50, 100, 200, 200), this, 1); 

m_ListBox.AddString(L"one"); 
m_ListBox.AddString(L"two"); 
m_ListBox.AddString(L"three"); 

return true; 
} 

的問題是列表框呈現其他控件下方在對話框中。我試圖調用BringWindowToTop,但它沒有幫助。

此外,新的控制不能超出該對話框的邊緣......因爲它正在使用類似下拉列表的組合框,這將是很好的。

+0

我覺得你應該把控制在工具欄或對話框裏面創建。我相信你會在codeguru.com上找到一個例子! – dwo 2010-01-05 21:11:37

+1

這不是一個回答你的問題,但你不希望將COLOR_WINDOW轉換爲一個HBRUSH在調用AfxRegisterClass - 使用GetSystemColorBrush(COLOR_WINDOW)來代替。 – 2010-01-07 01:02:37

回答

0

它看起來就像你不能看到窗口創建由於使用GetDesktopWindow設置其父。檢查下面的代碼更改是否可以正常工作,它應該創建一個包含3個項目的列表框,並且您應該能夠關閉它以便在對話框中移動它。

BOOL CYourDlg::OnInitDialog() 
{ 
CDialog::OnInitDialog(); 

m_ListBox.CreateEx(WS_EX_STATICEDGE | WS_EX_TOOLWINDOW, _T("LISTBOX"), NULL, 
    WS_CHILD | WS_CAPTION | LBS_STANDARD | WS_HSCROLL | WS_SYSMENU | WS_VISIBLE, 
    CRect(50, 100, 200, 200), this, 1); 

m_ListBox.AddString(L"one"); 
m_ListBox.AddString(L"two"); 
m_ListBox.AddString(L"three"); 

return true; 
} 

此外,我相信你會考慮使用control bars實現對接\浮動functinality爲你的窗口。與列表框

update0彈出窗口

class CPopUpTest : public CFrameWnd 
{ 
private: 
    CListBox* m_ListBox; 
public: 
    CPopUpTest(); 
protected: 
    DECLARE_MESSAGE_MAP() 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
}; 

CPopUpTest::CPopUpTest() 
{ 
    m_ListBox = NULL; 
    Create(NULL, L"Pop up listbox test", WS_POPUPWINDOW | WS_CAPTION | WS_SIZEBOX, 
     CRect(400, 280, 580, 520), NULL, NULL, WS_EX_TOOLWINDOW); 

    CRect rect; 
    GetClientRect(&rect); 

    m_ListBox = new CListBox(); 
    m_ListBox->Create(WS_CHILD | WS_VISIBLE | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | LBS_SORT | WS_VSCROLL, rect, this, 1); 

    m_ListBox->AddString(L"one"); 
    m_ListBox->AddString(L"two"); 
    m_ListBox->AddString(L"three"); 
    m_ListBox->AddString(L"four"); 
} 

BEGIN_MESSAGE_MAP(CPopUpTest, CFrameWnd) 
    //{{AFX_MSG_MAP(CMainFrame) 
    ON_WM_SIZE() 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

void CPopUpTest::OnSize(UINT nType, int cx, int cy) 
{ 
    CFrameWnd::OnSize(nType, cx, cy); 
    if (m_ListBox!=NULL) m_ListBox->MoveWindow(0, 0, cx, cy); 
} 

那麼每當你想要顯示此窗口中完成:

CPopUpTest* popUpList = new CPopUpTest(); 
popUpList->ShowWindow(SW_NORMAL); 
popUpList->BringToTop(SW_NORMAL); 

希望這會有所幫助,至於

+0

它幾乎可以工作。首先,我得到一個彈出式對話框,而不是簡單的列表框浮動 - 預期的用途是作爲一個自動完成的建議框。其次,這個窗口並不是恰當地放在對話框的頂部......最初它是在我逐步瀏覽代碼時完成的,但在正常使用情況下,它幾乎消失了 - 只有文本「one」可見,其餘部分不可見。 – 2010-01-07 11:40:54

+0

另外,列表框不能超出對話框的界限,我想要的東西,可以(像一個下拉列表/組合框怎麼可以比它的上對話框更寬/更長)。 – 2010-01-07 12:09:10

+0

我現在有點困惑,看起來你想製作一個彈出窗口;網上有關於如何做到這一點的教程,例如http://www.functionx.com/visualc/applications/popupwindow.htm。請檢查我對原始回覆所做的更新是否適合您 – 2010-01-07 15:25:22