nicht mehr als 253 buttons ?

mein compiler sagt nur error :
------ Erstellen gestartet: Projekt: ManyButtons, Konfiguration: Debug Win32 ------

Kompilieren...
StdAfx.cpp
WINVER not defined. Defaulting to 0x0501 (Windows XP and Windows .NET Server)
Kompilieren...
ManyButtonsDlg.cpp
c:\Dokumente und Einstellungen\zwiers\Desktop\Neuer Ordner\ManyButtons\ManyButtonsDlg.cpp(60) : error C2440: 'static_cast': 'void (__thiscall CManyButtonsDlg::* )(UINT,NMHDR *,LRESULT *)' kann nicht in 'void (__thiscall CCmdTarget::* )(UINT)' konvertiert werden
Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein
ManyButtons.cpp
c:\Dokumente und Einstellungen\zwiers\Desktop\Neuer Ordner\ManyButtons\ManyButtons.cpp(52) : warning C4996: 'CWinApp::Enable3dControls' wurde als veraltet deklariert
c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxwin.h(4369): Siehe Deklaration von 'CWinApp::Enable3dControls'
Code wird generiert...

Das Build-Protokoll wurde unter "file://c:\Dokumente und Einstellungen\Desktop\Neuer Ordner\ManyButtons\Debug\BuildLog.htm" gespeichert.
ManyButtons - 1 Fehler, 1 Warnung(en)


---------------------- Fertig ----------------------

Erstellen: 0 erfolgreich, 1 fehlgeschlagen, 0 übersprungen
 
Sorry, Mein Fehler (unter VC6 hat's komischerweise klaglos funktioniert :-) ):

Ändere den Prototypen der OnButtonClicked() -Methode ab, dass er so ausschaut:
Code:
afx_msg void OnButtonClicked(UINT id);
und werfe die überflüssigen Parameter auch aus der Implementierung dieser Methode raus. Dann sollte es funktionieren.

Gruß
MCoder
 
hey Danke das funktioniert :) aber wie mache ich das denn jetzt mit :
Code:
e1.SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME2)); //e1 is der button...
 
Einfach den Style BS_ICON bei Create() ergänzen und dann wie gehabt:
Code:
pButton->Create( strCaption,
                 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON,
                 rectButton,
                 this,
                 uiButtonID++ );

pButton->SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME2));

Die Buttons stecken jetzt alle in der CObList drinnen. Um einen bestimmten Button anzusprechen, kannst du ihn mit
Code:
CButton *pButton = (CButton *)m_obList.GetAt(FIRST_BUTTON_ID + nOffset);
ansprechen. nOffset ist einfach der Index, den ich zur ID des ersten Buttons (siehe Create) hinzugefügt habe, in meinem Beispiel also ein Wert zwischen 0 und 624.
Wie du auf Events (Klicken) reagieren kannst, steckt in dem Beispiel auch drin (in OnButtonClicked). Du bekommst dort als Parameter die ID des Buttons geliefert, mit der du den Button identifizieren kannst.

Gruß
MCoder
 
Moin,
folgendes problem ich möchte wenn ich einen button drücke das sich das Icon wechselt, das icon wechseln bekomm ich ja mit :
Code:
pButton->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON2));
Nur das Problem ist wie spreche ich in der fkt jetzt den button an ?

Code:
void CManyButtonsDlg::OnButtonClicked(UINT id)
{
    CString strMsg;
    strMsg.Format(_T("Button %d clicked"), (id - FIRST_BUTTON_ID) + 1);
    //AfxMessageBox(strMsg);
	AfxMessageBox("Du hast mich gedrückt ;)");
}

[edit]
CButton *pButton = (CButton *)m_obList.GetAt(FIRST_BUTTON_ID + nOffset);
damit soll das gehn aber der compiler sagt mir dann folgendes :
error C2664: 'CObject *&CObList::GetAt(POSITION) ': Konvertierung des Parameters 1 von 'UINT' in 'POSITION' nicht möglich
wie wandel ich also UINT ind POSITION...
 
Zuletzt bearbeitet:
Oh ja, GetAt() braucht ja bei dieser Klasse einen POSITION Parameter. Dann sollte es so gehen (diesmal getestet :-) ):
Code:
CButton *pButton = (CButton *)m_obList.GetAt(m_obList.FindIndex(id - FIRST_BUTTON_ID));
 
POSITION test;
test = m_obList.GetHeadPosition()

hatte das so probiert, der nachteil das ich nur den button 0 ansprechen konnte .
Gibt es da auch ne mäglichkeit das mit GetHeadPosition auzuprobieren ?
 
GetHeadPosition() liefert dir (wie der Name schon sagt) immer nur den obersten oder ersten Eintrag der Liste und das ist hier der Button 0. Da du den Button nur über seine ID identifizieren kannst, kannst du die von mir gepostete Zeile mit GetAt() verwenden.
 
Zurück