programm stürzt ab...
-
ich versuche das erste mal eine windowsanwendung zu schreiben...
versucht habe ich ein icon auf ein button zu setzen,
im oninitdlg habe ich das eingefügt:((CButton*)GetDlgItem(IDCANCEL))->SetIcon(::AfxGetApp()->LoadIcon(IDR_MAINFRAME));
um das standart-icon idr_mainframe auf den button idcancel zu setzen. wenn ich dann noch in der recourcenansicht icon auf true setze stürzt das programm mit einer speicherzugriffsverletzung ab????
bitte helft mir!
-
Hmm, ich kann dir eins sagen. Und zwar das es nicht an
((CButton*)GetDlgItem(IDCANCEL))->SetIcon(::AfxGetApp()->LoadIcon(IDR_MAINFRAME));
liegt...
Es muss an was anderes liegen. Hast du schonmal versucht ohne den Code das Programm auszuführen ... ?
Gruß
:: NoName ::
-
Hi,
((CButton*)GetDlgItem(IDCANCEL))->SetIcon(::AfxGetApp()->LoadIcon(IDR_MAINFRAME));
Dieser Code bringt euch noch mal um!
Du castest einfach ein CWnd* in ein CButton. Wer sagt das das auch in Ordnung ist?
Wenn Du es folgendermassen machst, merkst Du, das kein CButton vorhanden ist.
CWnd* pWnd = GetDlgItem(IDCANCEL); ASSERT(pWnd); CButton* pButton = DYNAMIC_DOWNCAST(CButton, pWnd); ASSERT(pButton);
oder wenigstens
CButton* pButton = DYNAMIC_DOWNCAST(CButton, GetDlgItem(IDCANCEL)); ASSERT(pButton);
Fazit=> funktioniert so nicht.
Lege eine Membervariable für den Button an, damit es funktioniert.
Gruss
EB
-
Hab den Code
((CButton*)GetDlgItem(IDCANCEL))->SetIcon(::AfxGetApp()->LoadIcon(IDR_MAINFRAME));
eben getestet und er funktioniert. Ohne Probleme etc. ...
Gruß
:: NoName ::
-
Hi,
nun, wenn es funktioniert, hast du eben Glück.
Und in diesem Fall funktioniert es, da SetIcon(HICON) eine Nachricht an
CWnd sendet.MFC-Quelltext:
_AFXWIN_INLINE HICON CButton::SetIcon(HICON hIcon) { ASSERT(::IsWindow(m_hWnd)); return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); }
Trotzdem kann man sich darauf nicht verlassen
Wenn keine Kontrolvariable angelegt wird oder das Fenster nach CButton gesubclasst
(denglisch) wird, ist das CWnd Object von GetDlgItem definitiv kein
CButton Objekt, was die Typüberprüfung beweist.CButton* pButton = DYNAMIC_DOWNCAST(CButton, GetDlgItem(IDCANCEL)); ASSERT(pButton);
Ich habe mal ein Beispiel gemacht.
Angenommen ich habe eine super Klasse
von CButton abgeleitet:
class CExButton : public CButton { DECLARE_DYNAMIC(CExButton) public: CString GetCaption() const { return m_strCaption; } void SetCaption(const CString& strCaption) { m_strCaption = strCaption; } private: CString m_strCaption; }; IMPLEMENT_DYNAMIC(CExButton, CButton)
Ich kann ja jetzt auch nicht davon ausgehen, das alle Button's in meinem
Dialog durch Zauberhand zu CExButton werden, oder?Oder doch, denn dann mach ich doch einfach in OnInitDialog folgendes:
((CExButton*)GetDlgItem(IDCANCEL))->SetCaption("SuperButton");
Ob das wohl klappt? Wird schon gutgehen
Gruss
EB
-
bitte nicht schlage, aber angenommen ich leg ne variable für den button nahmens mv_close an wie müsste dann der code-schnipsel für das icon aussehen???
-
Einfach ((CButton*)GetDlgItem(IDCANCEL)) gegen die Membervariable ersetzen und den Pointer mit einem '.' ersetzen ...
m_MemberVar.SetIcon(...)
Gruß
:: NoName ::
-
wunderbar nur ein problem gibt es noch zu bewältigen, der button sieht jetzt recht win98 mäßig aus, ist möglich ihn wieder schön ... mir fällt jetzt kein wort dazu ein... aussehen zu lassen?
-
mfc-noob schrieb:
wunderbar nur ein problem gibt es noch zu bewältigen, der button sieht jetzt recht win98 mäßig aus, ist möglich ihn wieder schön ... mir fällt jetzt kein wort dazu ein... aussehen zu lassen?
Hmm, warum "wieder" ... ?
Möchtest du ihn im Windows-XP Style haben ?
Dann musst du mal bei Codeproject.com vorbeischauen...Gruß
:: NoName ::
-
...und diese merkwürdige button demo ziehen...nene
ich möcht lieber wissen wie man die buttons mit icon so schön glossy macht... vieleicht liegts aber auch nur an den icon die den gesamten button besdecken???
wie macht ihrs denn?
-
gui-schreiben ist schwerer als algos...hoffentlich nicht mehr lange
-
besorg dir doch einfach eine Klasse von Codeproject die dir gefällt. Die meisten haben ja schon eine Funktion zum einbinden von Icons...
Gruß
:: NoName ::
-
:: NoName :: schrieb:
Einfach ((CButton*)GetDlgItem(IDCANCEL)) gegen die Membervariable ersetzen und den Pointer mit einem '.' ersetzen ...
m_MemberVar.SetIcon(...)
Gruß
:: NoName ::ich hab das jetzt so gemacht
CButton Button //Member
Button.GetDlgItem(IDC_BUTTON1)->SetIcon(....
meintest du das so?
-
MSS-Software schrieb:
ich hab das jetzt so gemacht
C/C++ Code:
CButton Button //MemberC/C++ Code:
Button.GetDlgItem(IDC_BUTTON1)->SetIcon(....meintest du das so?
Nee...
m_MemberVar.SetIcon(...)
m_MemberVar ist eine Membervariable vom Typ CButton, also der Button auf dem du dein Icon gesetzt haben willst. Du musst also vorher eine Membervariable von deinem Button erstellen...
Ich hab das hier schonmal mit Bitmaps beschrieben :
http://www.c-plusplus.net/forum/viewtopic-var-t-is-76967-and-highlight-is-icon.htmlGruß
:: NoName ::