【问题标题】:MFC: Floating toolbar window not visible (WS_EX_TOOLWINDOW)MFC:浮动工具栏窗口不可见 (WS_EX_TOOLWINDOW)
【发布时间】:2010-01-05 11:38:52
【问题描述】:

在典型的 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,但没有帮助。

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

【问题讨论】:

  • 我认为您应该将控件放在工具栏或对话框栏中并创建它。我相信你会在 codeguru.com 上找到一个例子!
  • 这不是您问题的答案,但您不想在调用 AfxRegisterClass 时将 COLOR_WINDOW 转换为 HBRUSH - 请改用 GetSystemColorBrush(COLOR_WINDOW)。

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


【解决方案1】:

由于使用 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);

希望这会有所帮助,问候

【讨论】:

  • 它几乎可以工作。首先,我得到一个小弹出对话框,而不是一个简单的浮动列表框 - 预期用途是作为自动完成的建议框。其次,窗口没有正确地位于对话框的顶部......如果我逐步执行代码,它最初会这样做,但在正常使用情况下它实际上会消失 - 只有文本“一个”可见,其余的不可见。
  • 另外,列表框不能超出对话框的边界,我想要一些可以的东西(比如下拉列表/组合框如何比它所在的对话框更宽/更长)。
  • 我现在有点糊涂了,看起来你想制作一个弹出窗口;网上有关于如何做到这一点的教程,例如functionx.com/visualc/applications/popupwindow.htm。请检查我对原始回复所做的更新是否适合您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多