在典型的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,但它没有帮助。
此外,新控件不能超出对话框的边缘...因为它的使用类似于组合框中的下拉列表,这样会很好。
答案 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);
希望这有帮助,尊重