MFC: плавающее окно панели инструментов не отображается (WS_EX_TOOLWINDOW) - PullRequest
0 голосов
/ 05 января 2010

В типичном диалоге MFC C ++ я хочу динамически создать плавающий ListBox (или другой стандартный элемент управления) над диалогом, который может выходить за границы диалогового окна - поэтому он не может быть простым дочерним элементом или будет обрезан .

Глядя на что-то похожее, что работает, я пытался добиться этого, но при отображении окно никогда не появляется.

В моем файле .h у меня есть:

CListBox m_ListBox;

Тогда в моем методе OnInitDialog (основываясь на посте Сержа):

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 голосов
/ 06 января 2010

Похоже, вы не можете видеть окно, созданное из-за использования 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;
}

Также я полагаю, что вы хотели бы рассмотреть возможность использования панелей управления для реализации закрепления \ плавающей функции для вашего окна.

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

надеюсь, это поможет, с уважением

...