MFC:浮动工具栏窗口不可见(WS_EX_TOOLWINDOW)

时间:2010-01-05 11:38:53

标签: c++ visual-c++ mfc winapi

在典型的MFC C ++对话框中,我想在对话框上动态创建一个浮动ListBox(或其他标准控件),可能会延伸到对话框的边界 - 所以它不能是一个简单的子项,也不会被剪裁

看着类似的东西,我试图实现它,但窗口永远不会出现。

在我的.h档案中,我有:

CListBox m_ListBox;

然后在我的OnInitDialog方法中(基于Serge的帖子):

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,但它没有帮助。

此外,新控件不能超出对话框的边缘...因为它的使用类似于组合框中的下拉列表,这样会很好。

1 个答案:

答案 0 :(得分: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为你的窗口实现对接\浮动功能。

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);

希望这有帮助,尊重