2010-01-05 6 views
0

Dans une boîte de dialogue MFC C++ standard, je souhaite créer dynamiquement un contrôle ListBox flottant (ou un autre contrôle standard) dans la boîte de dialogue, en dépassant les limites de la boîte de dialogue. être un enfant simple ou il sera coupé.MFC: fenêtre de la barre d'outils flottante non visible (WS_EX_TOOLWINDOW)

En regardant quelque chose de similaire qui fonctionne, j'ai essayé de l'atteindre mais la fenêtre n'apparaît jamais quand elle est affichée.

Dans mon fichier .H je:

CListBox m_ListBox; 

Ensuite, dans ma méthode OnInitDialog (basée sur le poste de 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; 
} 

Le problème est la zone de liste est rendue sous d'autres contrôles dans le dialogue. J'ai essayé d'appeler BringWindowToTop mais ça n'aide pas.

De plus, le nouveau contrôle ne peut pas s'étendre au-delà du bord de la boîte de dialogue ... puisqu'il est utilisé de la même manière que la liste déroulante dans une combo-box, ce serait bien.

+0

Je pense que vous devriez mettre le contrôle dans une barre d'outils ou une barre de dialogue et créez-le. Je suis sûr que vous trouverez un exemple sur codeguru.com! – dwo

+1

Ce n'est pas une réponse à votre question, mais vous ne voulez pas convertir le fichier COLOR_WINDOW en HBRUSH dans l'appel de AfxRegisterClass - utilisez plutôt GetSystemColorBrush (COLOR_WINDOW). –

Répondre

0

Il semble que vous ne puissiez pas voir la fenêtre créée en raison de l'utilisation de GetDesktopWindow pour définir son parent. Vérifiez si les modifications suivantes de votre code fonctionneraient bien pour vous, cela devrait créer une listbox avec 3 éléments et vous devriez être capable de le fermer ou de le déplacer dans la boîte de dialogue.

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

Aussi je crois que vous voulez envisager d'utiliser control bars pour mettre en œuvre docking \ flottante functinality pour votre fenêtre.

update0 fenêtre pop-up avec listbox

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

alors chaque fois que vous voulez afficher cette fenêtre faire:

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

espérons que cette aide, ce qui est

+0

Cela fonctionne presque. Tout d'abord, j'obtiens une petite boîte de dialogue contextuelle plutôt qu'une simple boîte de liste flottante - l'utilisation prévue est une boîte à suggestions auto-complète. Deuxièmement, la fenêtre ne se place pas correctement au début de la boîte de dialogue ... dans un premier temps si je passe par le code, elle disparaît pratiquement dans l'utilisation normale - seul le texte «un» est visible, le reste est invisible. –

+0

En outre, la liste ne peut pas s'étendre au-delà des limites de la boîte de dialogue, je veux quelque chose qui peut (comme une liste déroulante/combobox peut être plus large/plus long que le dialogue sur lequel il est). –

+0

Je suis un peu confus maintenant, on dirait que vous voulez faire une fenêtre popup; il existe des tutoriels sur le Web sur la façon dont vous pouvez le faire, par ex. http://www.functionx.com/visualc/applications/popupwindow.htm. Veuillez vérifier si la mise à jour que j'ai faite pour ma réponse originale fonctionnerait pour vous –

Questions connexes