jokey2
Erfahrenes Mitglied
Hallo Gemeinde
ich würde gerne einen Dialog völlig dynamisch, also ohne Template aus den Resourcen erzeugen. Es soll eine Message-Box werden, bei der man die Anzahl und die Texte der Buttons selber frei festlegen kann. Leider kriege ich das einfach nicht hin!
Bisher habe ich das so probiert:
Ich habe eine Klase von CWnd abgeleitet, die Im Konstruktor u.A. Informationen über die anzuzeigenden Buttons bekommt. Diese Klasse hat dann eine Funktion 'ShowMessageBox' in der das Fenster erzeugt und angezeigt werden soll:
Aus irgendeinem Grund haut das allerdings so nicht hin. Ist vielleicht auch nicht die beste Lösung, das mit einem CWnd zu machen. Ich hab's acuh mit einer von CDialog abgeleiteten Klasse versucht, aber da habe ich dann eben das Problem mit dem Template.
Was ich erreichen möchte ist, daß ich eine modale MessageBox anzeige, die mehr kann als die Standard-Windows-Messagebox. Außerdem wüßte ich prinzipiell gerne, ob es möglich ist, einen Dialog völlig Dynamisch, also ohne Template, zu erzeugen.
Kann mir evtl. der Eine oder Andere ein paar Tips geben, wie ich so etwas machen könnte? Ich wäre wie immer sehr dankbar.
P.S.: Es kann sein, daß die Berechnung der Größen und Positionen noch nicht stimmt, aber das ist erstmal zweitrangig. Darum werde ich mich kümmern, wenn ich den Dialog bzw. das Fenster angezeigt bekomme.
ich würde gerne einen Dialog völlig dynamisch, also ohne Template aus den Resourcen erzeugen. Es soll eine Message-Box werden, bei der man die Anzahl und die Texte der Buttons selber frei festlegen kann. Leider kriege ich das einfach nicht hin!
Bisher habe ich das so probiert:
Ich habe eine Klase von CWnd abgeleitet, die Im Konstruktor u.A. Informationen über die anzuzeigenden Buttons bekommt. Diese Klasse hat dann eine Funktion 'ShowMessageBox' in der das Fenster erzeugt und angezeigt werden soll:
Code:
int CExtMessageBox::ShowMessageBox()
{
if(((m_iType & MB_EXTTYPEMASK) == MB_DYNAMIC) ||
((m_iType & MB_EXTTYPEMASK) == MB_YES_ALL_NO_ALL) ||
((m_iType & MB_EXTTYPEMASK) == MB_YES_ALL_NO_ALL_CANCEL))
{
CreateMessageBox();
ShowWindow(SW_SHOW);
EnableWindow();
return RunModalLoop();
}
else
return AfxMessageBox(m_cstrMessage, m_iType);
}
int CExtMessageBox::ShowMessageBox(LPCTSTR lpszText, UINT iType, LPCTSTR lpszButtonText)
{
m_cstrMessage = lpszText;
m_iType = iType;
InitButtonTextList(lpszButtonText);
return ShowMessageBox();
}
void CExtMessageBox::CreateMessageBox()
{
//Titelzeile erzeugen
CString cstrTitle;
CWinApp *pParentApp = AfxGetApp();
if(pParentApp)
cstrTitle = pParentApp->m_pszAppName;
else
{
TCHAR szAppName[_MAX_PATH];
DWORD dwLen = GetModuleFileName(NULL, szAppName, _MAX_PATH);
if (dwLen == _MAX_PATH)
szAppName[_MAX_PATH - 1] = '\0';
cstrTitle = szAppName;
}
//Fenster erzeugen
if(m_pParent == NULL)
m_pParent = AfxGetApp()->GetMainWnd();
if(!CreateEx(WS_EX_CONTROLPARENT | WS_EX_DLGMODALFRAME | WS_EX_TOPMOST,
NULL,
cstrTitle,
WS_CAPTION | WS_CHILD,
EMB_MIN_SIZE_WND_RECT,
m_pParent,
EXT_MESSAGE_BOX_WND_ID,
NULL))
{
AfxMessageBox("Error creating message box window!", MB_OK | MB_ICONEXCLAMATION);
AfxThrowUserException();
return;
}
//CStatic mit Text erzeugen
CSize sizeStatic = GetDC()->GetOutputTextExtent(m_cstrMessage);
CRect rectStatic(CPoint(EMB_STATIC_LEFT, EMB_STATIC_TOP), sizeStatic);
if(!m_staticText.Create(m_cstrMessage, WS_CHILD | WS_VISIBLE | SS_CENTER, rectStatic, this))
{
AfxMessageBox("Error creating message box child window!", MB_OK | MB_ICONEXCLAMATION);
DestroyWindow();
AfxThrowUserException();
return;
}
//Buttons erzeugen
POSITION pos = m_listButtonText.GetHeadPosition();
int iButtonID = ID_BUTTON_MIN;
while(pos != NULL)
{
CString cstrText(m_listButtonText.GetNext(pos));
CButton* pButton = new CButton();
ASSERT(pButton != NULL);
if(!pButton->Create(cstrText, WS_CHILD | WS_VISIBLE | WS_TABSTOP, EMB_SIZE_BUTTON_RECT, this, iButtonID))
{
AfxMessageBox("Error creating message box button!", MB_OK | MB_ICONEXCLAMATION);
DeleteButtons();
m_staticText.DestroyWindow();
DestroyWindow();
AfxThrowUserException();
return;
}
m_listDynButtons.AddTail(pButton);
}
//Fenstergröße und -position errechnen und setzen
//Länge der Button-Zeile
int iButtonLineWidth = (EMB_BUTTON_WIDTH * (int)m_listDynButtons.GetCount()) + (EMB_BUTTON_DIST * ((int)m_listDynButtons.GetCount() - 1));
int iWindowWidth = rectStatic.Width() + (2 * EMB_STATIC_LEFT);
int iButtonLeft;
if((iButtonLineWidth + (2 * EMB_BUTTON_LEFT)) > iWindowWidth)
{
iButtonLeft = EMB_BUTTON_LEFT;
iWindowWidth = iButtonLineWidth + (2 * EMB_BUTTON_LEFT);
//Textposition neu setzen
rectStatic.left = (iWindowWidth / 2) - (rectStatic.Width() / 2);
m_staticText.MoveWindow(rectStatic, FALSE);
}
else
iButtonLeft = (iWindowWidth / 2) - (iButtonLineWidth / 2);
//Text anzeigen
m_staticText.ShowWindow(SW_SHOW);
//Buttonpositionen setzen und Buttons anzeigen
POSITION posButton = m_listDynButtons.GetHeadPosition();
while(pos != NULL)
{
CButton *pButton = m_listDynButtons.GetNext(pos);
pButton->MoveWindow(iButtonLeft, rectStatic.bottom + EMB_VERT_DIST, EMB_BUTTON_WIDTH, EMB_BUTTON_HEIGHT, FALSE);
pButton->ShowWindow(SW_SHOW);
pButton->EnableWindow();
iButtonLeft += EMB_BUTTON_WIDTH + EMB_BUTTON_DIST;
}
}
Aus irgendeinem Grund haut das allerdings so nicht hin. Ist vielleicht auch nicht die beste Lösung, das mit einem CWnd zu machen. Ich hab's acuh mit einer von CDialog abgeleiteten Klasse versucht, aber da habe ich dann eben das Problem mit dem Template.
Was ich erreichen möchte ist, daß ich eine modale MessageBox anzeige, die mehr kann als die Standard-Windows-Messagebox. Außerdem wüßte ich prinzipiell gerne, ob es möglich ist, einen Dialog völlig Dynamisch, also ohne Template, zu erzeugen.
Kann mir evtl. der Eine oder Andere ein paar Tips geben, wie ich so etwas machen könnte? Ich wäre wie immer sehr dankbar.
P.S.: Es kann sein, daß die Berechnung der Größen und Positionen noch nicht stimmt, aber das ist erstmal zweitrangig. Darum werde ich mich kümmern, wenn ich den Dialog bzw. das Fenster angezeigt bekomme.