Zum Inhalt springen

Bitmap in einen Button


pit030771

Empfohlene Beiträge

Hi,

ich möchte gerne ein Bitmap in einen Button schieben.

Habe es so versucht aber geht nicht.:confused:


BOOL mMaskDlg::OnInitDialog(void)

{

CBitmap m_Bitmap;

        m_Bitmap.LoadBitmap (IDB_BITMAP1);

        HBITMAP hBitmap = (HBITMAP) m_Bitmap.GetSafeHandle ();


        ((CButton*) m_Button.GetDlgItem(IDC_BUTTON1))->SetBitmap (hBitmap);


CDialog::OnInitDialog();

    SetWindowText(_T(m_StrTitle));   


    return false;


}

Abder das will nicht funzen, wo ist denn mein Fehler?

LG

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • "Geht nicht" ist keine ausreichende Fehlerbeschreibung.
  • m_Bitmap sollte keine lokale Variable sein.
  • Der Name m_Bitmap deutet auf einen Member hin. Womöglich gibt es den sogar, und du verdeckst ihn hier durch die lokale Variable.
  • Den Rückgabewert von LoadBitmap solltest du auch prüfen.
  • GetSafeHandle brauchst du nicht. CBitmap hat einen operator HBITMAP.
  • Der Aufruf von GetDlgItem ist falsch, falls m_Button bereits eine Steuerelementvariable für den Button ist.
  • Der Cast auf CButton* ist unnötig und gefährlich, falls m_Button bereits eine Steuerelementvariable für den Button ist.
  • Du benutzt _T falsch. Dieses Makro kannst du nur mit Literalen benutzen.

Dein Code sieht so aus, als hättest du daran rumgebastelt, bis sich der Compiler nicht mehr beschwert hat. Diese Vorgehensweise bringt nichts. Du musst verstehen, was da passiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein habe nicht rumgebastel, habe den Code so aus einem Buch übernommen und nur meine IDC_, IDB_ und Variable eingesetzt.

m_Button ist eine Variable auf CButton, den ich für mehrer zu erstellende Button vorhalten will, diese habe ich in der dazugehörigen .h Datei deklariert.

Das wurde so in dem Buch beschrieben!

Das mit m_Bitmap versteh ich nicht ganz, erkärst du mir das bitte noch mal genauer.

Danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin es schon wieder. :floet:

Ist es irgendwie möglich das hier so umzustricken das ich das Bitmap aus der Ressouce lade und nicht aus einem File???

Habe schon LR_LOADFROMFILE weggelassen, aber da ist hBitmap unused. :confused:

Wär nett wenn mir jemand helfen würde, ich verzwifele daran.

Danke!!!


HBITMAP hBitmap =
(HBITMAP)LoadImage(
NULL, BmpName ,
IMAGE_BITMAP, 32, 32,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist es irgendwie möglich das hier so umzustricken das ich das Bitmap aus der Ressouce lade und nicht aus einem File???
Lass LR_LOADFROMFILE weg und gib als ersten Parameter nicht NULL an, sondern das Instance-Handle des Moduls, in dem die Ressource liegt. Oder benutzt einfach CBitmap::LoadBitmap, wie in deinem ersten Code.

Habe schon LR_LOADFROMFILE weggelassen, aber da ist hBitmap unused. :confused:
Was meinst du mit "unused"?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Das zeigt er mit dann unten bei den Werten an:(also wenn ich LR_LOADFROMFILE weglasse)

- hBitmap 0x00000000 {unused=??? } HBITMAP__ *

unused CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden int

Wie bekomme ich denn einen handle au dieses Modul??

So wie ich es oben gemacht habe funzt garnicht, und ich habe das so aus einem Buch übernommen. :confused:

Ich habe es auch schon mit der AutoLoad Funktion versucht, zeigt mir auch nix an! Hingegen wieder wenn ich es in einem neuen Test Projekt versuch gehts?

Ich weiß nicht wo da meine denksperre ist!?!?!

Das aus einem Buch zu lernen ist wirklich nicht lustig!:(

Gruß

Pit

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie bekomme ich denn einen handle au dieses Modul??
Welches Modul ist denn "dieses"? Ich weiß ja nicht, in welchem Modul deine Bitmapressource liegt. Im Zweifelsfall nimm AfxGetResourceHandle.

So wie ich es oben gemacht habe funzt garnicht, und ich habe das so aus einem Buch übernommen. :confused:
"funzt garnicht" ist keine ausreichende Fehlerbeschreibung. Wenn das wirklich so in deinem Buch steht, wirf das Buch weg. Hast du meine Anmerkungen mal umgesetzt?

Ich habe es auch schon mit der AutoLoad Funktion versucht, zeigt mir auch nix an!
Ohne Code kann ich dazu nichts sagen.

Hingegen wieder wenn ich es in einem neuen Test Projekt versuch gehts?
Was ist "es"?

Ich weiß nicht wo da meine denksperre ist!?!?!
Nimm's mir nicht übel, aber deine Vorgehensweise erzeugt bei mir den Eindruck, dass du gar nicht denkst, sondern nur rumfrickelst.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nimm's mir nicht übel, aber deine Vorgehensweise erzeugt bei mir den Eindruck, dass du gar nicht denkst, sondern nur rumfrickelst.

Ja klar frickel ich rum konntest du sofort alles? Um zu verstehen muss man doch machen oder nicht? Das schlimme ist, dass ich auch niemenden Fragen kann. Mein Dozent in der Schule kann das auch nicht und ich muss das für mein Praktikum können, weil da mit C++ und der MFC gearbeitet wird. Also was bleibt mir übrig als mir Bücher zu kaufen und mir das aotodidaktisch "beizubiegen".

Schlecht ist nur, dass man nicht wirklich immer versteht warum ist das jetzt so!

:confused: :confused: :confused:

Welches Modul ist denn "dieses"? Ich weiß ja nicht, in welchem Modul deine Bitmapressource liegt. Im Zweifelsfall nimm AfxGetResourceHandle.

Was genau brauchst du da, den Namen des Dialogs?

Wie wendet man AfxGetResourceHandle() richtig an, damit sie zu meinem Code passt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja klar frickel ich rum konntest du sofort alles?
Nein. Ich kann auch jetzt nicht alles. Bei so ziemlich jedem neuen Projekt gibt es eine Menge Dinge, die ich nicht kann. Das hat aber nichts mit der Vorgehensweise zu tun.

Um zu verstehen muss man doch machen oder nicht?
Nein. Frickeln hilft nach meiner Erfahrung nicht beim Verstehen. Frickeln erzeugt unstabilen, redundanten Code, der so gerade eben auf der Entwicklungsmaschine läuft, und du weißt nicht mal, wieso. Man kann sich beim Programmieren die Lösung nicht durch Rumprobieren erarbeiten. Das liegt einerseits daran, dass es oft nicht "die Lösung" gibt, und andererseits daran, dass ein funktionierender Code nicht zwangsläufig gut ist.

Das schlimme ist, dass ich auch niemenden Fragen kann.
Du kannst hier fragen. Aber das bringt nichts, wenn du die Ratschläge nicht umsetzt.

Mein Dozent in der Schule kann das auch nicht und ich muss das für mein Praktikum können, weil da mit C++ und der MFC gearbeitet wird. Also was bleibt mir übrig als mir Bücher zu kaufen und mir das aotodidaktisch "beizubiegen".
Glaub mir, so lernst du es nicht.

Schlecht ist nur, dass man nicht wirklich immer versteht warum ist das jetzt so!
Genau das meine ich. Beim Rumprobieren kommt Code heraus, von dem du nicht weißt, warum er funktioniert. Daher ist das ein grundlegend falscher Ansatz.

Was genau brauchst du da, den Namen des Dialogs?

Wie wendet man AfxGetResourceHandle() richtig an, damit sie zu meinem Code passt?

Bleib doch mal bei deinem ersten Ansatz, setz die Hinweise um, die ich dir gegeben habe, und zeig, was dabei rausgekommen ist.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

erst mal danke für deine Mühe!

Nein. Frickeln hilft nach meiner Erfahrung nicht beim Verstehen. Frickeln erzeugt unstabilen, redundanten Code, der so gerade eben auf der Entwicklungsmaschine läuft, und du weißt nicht mal, wieso. Man kann sich beim Programmieren die Lösung nicht durch Rumprobieren erarbeiten. Das liegt einerseits daran, dass es oft nicht "die Lösung" gibt, und andererseits daran, dass ein funktionierender Code nicht zwangsläufig gut ist.

Es geht ja bei meinen Sachen noch nicht um Projekt oder Logiken, ich will erstmal lernen wie solche Finktionen anwende. Das ist doch eigenlich immer gleich oder nicht, die sind doch vorgegeben, oder? Doof fin ich nur das es für eine Sache mehrer Möglichkeiten gibt. Wenn man da jetzt googelt, dann gibt es tausend Ansätze. Warum? Den zweiten Ansatz mit LoadImage habe ich mir aus dem Internet gesucht, das Funktioniert ja auch und das andere eben nicht.

Du kannst hier fragen. Aber das bringt nichts, wenn du die Ratschläge nicht umsetzt.

Ja das tue ich ja, manchmal verstehe ich eure Ratschläge aber auch nicht. :-(

Glaub mir, so lernst du es nicht.

Ich weiß aber sonst keinen Weg, wenn man mehr will als das in der Schule ist man allein. (Ich will jetzt nicht rumheulen, ist nicht meine Art).

Vieleicht kannst du mir einen Tip geben wie ich es anders machen kann???

Genau das meine ich. Beim Rumprobieren kommt Code heraus, von dem du nicht weißt, warum er funktioniert. Daher ist das ein grundlegend falscher Ansatz.

Sag mir einen anderen Ansatz.

Bleib doch mal bei deinem ersten Ansatz, setz die Hinweise um, die ich dir gegeben habe, und zeig, was dabei rausgekommen ist.

Ich habe es versucht, aber ich krieg es nicht hin mit diesem Ansatz, also habe ich mir einen andern gesucht.

Erkläre mir doch bitte deine Hinweise, vor allem was mit dem ersten meinst. Das m_Bitmap keine lokale Variable sein sollte. Wie benutz ich denn das LoadB itmap ohne Variable?

Das mit dem Cast auf CBitmap versteh ich auch nicht, dass steht so in dem Buch, das man so ein Steuerelement anspricht! Bei anderen Sachen hat das auch immer geklappt.

Darf ich dir mal einen PM schicken?

Gruß

Pit

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es geht ja bei meinen Sachen noch nicht um Projekt oder Logiken, ich will erstmal lernen wie solche Finktionen anwende. Das ist doch eigenlich immer gleich oder nicht, die sind doch vorgegeben, oder?
Nein, eigentlich nicht. Beim Programmieren ist selten etwas "immer gleich". Sonst gäbe es da nicht so viel Arbeit.

Doof fin ich nur das es für eine Sache mehrer Möglichkeiten gibt. Wenn man da jetzt googelt, dann gibt es tausend Ansätze. Warum?
Weil es eben nicht "die" Lösung für jeden Anwendungsfall gibt. Jedes Problem ist anders. Deswegen hilft es auch nicht, Code zu kopieren, den man nicht versteht. Und auswendig Lernen hilft auch nicht. Man muss Lösungsstrategien lernen, nicht Lösungen.

Ja das tue ich ja, manchmal verstehe ich eure Ratschläge aber auch nicht. :-(
Dann frag nach. Wir beißen doch nicht.

Vieleicht kannst du mir einen Tip geben wie ich es anders machen kann???
Versuche, den Sinn hinter dem Code zu verstehen. Code ist immer die Umsetzung der Absicht des Programmierers. Wenn du aus dem Code erkennen kannst, was der Programmierer damit erreichen wollte, dann bist du einen großen Schritt weiter. Das geht aber nur, wenn du weißt, was jede einzelne Anweisung des Codes tut. Dafür gibt es die Dokumentation.

Ich habe es versucht, aber ich krieg es nicht hin mit diesem Ansatz, also habe ich mir einen andern gesucht.
Das ist genau die Vorgehensweise, die dich nicht weiterbringt. Ich versuche mal, das zu veranschaulichen:

Du willst einen Nagel in die Wand schlagen, hältst aber den Nagel falsch herum, und schlägst mit dem Hammer auf die Spitze. Da das offensichtlich nicht funktioniert, nimmst du einen anderen Hammer. Möglicherweise nimmst du irgendwann einen Hammer, der so groß ist, dass er den Nagel auch falsch herum in die Wand schlagen kann. Das beschädigt möglicherweise die Wand, und der Nagel wackelt ziemlich stark, aber dein Bild hängt mehr oder weniger.

Das Ergebnis: Du hast es irgendwie hinbekommen, auch wenn es ziemlich lange gedauert hat. Aber vor allem: Du hast nicht gelernt, dass du auf das stumpfe Ende des Nagels schlagen musst.

Erkläre mir doch bitte deine Hinweise, vor allem was mit dem ersten meinst. Das m_Bitmap keine lokale Variable sein sollte. Wie benutz ich denn das LoadB itmap ohne Variable?
Du sollst es nicht ohne Variable benutzen, nur nicht mit einer lokalen. Denn die "lebt" nur, so lange diese Funktion läuft. Danach wird sie zerstört. Hinzu kommt, dass der Variablenname mit "m_" anfängt. Das macht man bei MFC normalerweise nur bei Membervariablen. Vielleicht gibt es sogar schon eine Membervariable mit demselben Namen. Ist das der Fall?

Das mit dem Cast auf CBitmap versteh ich auch nicht, dass steht so in dem Buch, das man so ein Steuerelement anspricht!
Es ist richtig, dass man den Rückgabewert von GetDlgItem casten muss. Allerdings benutzt du GetDlgItem falsch. Was genau ist denn m_Button?

Bei anderen Sachen hat das auch immer geklappt.
Diese Argumentation musst du dir auch schnellstens abgewöhnen. "Beweis durch Beispiel" nennt man das, und es ist gefährlich, weil es instabilen Code erzeugt.

Darf ich dir mal einen PM schicken?
Natürlich. Wieso nicht?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...