WinAPI anfänger bringt fenster nicht zum Erscheinen



  • Erstmal: Du hast ja nur ein Prototyp gemacht. Das heißt, was später damit und besonders darin passiert ist noch offen. Der Prototyp dient dir erstmal nur dazu, dass dein Programm weiß, dass es diese Funktion gibt. In diesem Prototypen gibt man eigentlich immer nur den Typ der Daten ein, der dort ein kommen soll, und spezifiziert diese dann, wenn man die Funktion definiert.

    Dann war das auf (D)Evil bezogen.
    Aufgrund deiner Aussage, tippe ich mal darauf, dass du den cast meinst:

    return static_cast<int>(msg.wParam);
    

    Das ist sowieso Schwachsinn, da der einzige Unterschied zwischen int (was msg.wParam nach dem cast ist) und unsigned int (msg.wParam vor dem cast) der ist, dass int auch negative Zahlen beinhalten kann. Das heißt int hat ca. -1,70141·1038 - 1,70141·1038 den Bereich und unsigned int hat 3,40282·1038 als Wertebereich und ist somit besser geeignet, wenn man mit sehr vielen Daten arbeitet, die nicht in den negativen Wertebereich reingehen.

    Mfg Ominion

    [EDIT]
    Also _T () ist nur ein Makro von TEXT (""). TEXT ("") wandelt einen String in ANSCII um, und wird immermehr als guter Programmierstil angesehen
    [/EDIT]



  • Ominion schrieb:

    [EDIT]
    Also _T () ist nur ein Makro von TEXT (""). TEXT ("") wandelt einen String in ANSCII um, und wird immermehr als guter Programmierstil angesehen
    [/EDIT]

    _T() ist genauso ein Makro wie TEXT(), und es wandelt nicht einen String in "ANSCII" um, sondern sorgt dafür, daß das angegebene Stringliteral je nach Kompilierung als String aus char (ANSI)- oder aus wchar_t (Unicode)-Zeichen angesehen wird.

    Und zu gutem Programmierstil gehört IMHO eher, daß man derartige Strings nicht hartcodiert, sondern in Konfigurationsdateien auslagert, so daß sich die Anwendung mit wenig Aufwand lokalisieren läßt.



  • sag ich ja^^
    war mir irgendwie so in Erinnerung wie ich das gesagt habe...

    Mfg Ominion



  • Ominion, was erzählst du da eigentlich? 😮

    Ominion schrieb:

    In diesem Prototypen gibt man eigentlich immer nur den Typ der Daten ein, der dort ein kommen soll, und spezifiziert diese dann, wenn man die Funktion definiert.

    Unsinn.

    Das heißt int hat ca. -1,70141·1038 - 1,70141·1038 den Bereich und unsigned int hat 3,40282·1038 als Wertebereich

    Unsinn.

    TEXT ("") wandelt einen String in ANSCII um,

    Unsinn.

    und wird immermehr als guter Programmierstil angesehen

    Unsinn.



  • Das heißt int hat ca. -1,70141·1038 - 1,70141·1038 den Bereich und unsigned int hat 3,40282·1038 als Wertebereich und ist somit besser geeignet,

    OMG !! 😮

    Ich glaube, du hast das falsche Tutorial erwischt xD Ne das stimmt so nicht.



  • Das ist kein Unsinn, zumindest die ersten beiden nicht...
    Das erste ist eher der persönliche Programmierstil, deshalb habe ich ja auch nicht gesagt das seins falsch ist, und da Dr_PhilGuth ja auch gesagt hat, dass er seins schöner findet werde ich ihm nicht weiter reinreden. 3. und 4. habe ich ja schon gesagt, ich benutze das Makro nicht, war mir aber sicher, dass das so war wie ich das beschrieben habe, deshalb ➡ sage ich nächstes mal nichts wenn ich es nicht benutze...

    Mfg Ominion

    [EDIT] 😮 was ist daran falsch!? habe das aus mindestens 2 Quellen (also die Zahlen nicht, aber was den Unterschied zwischen unsigned und signed betrifft), wobei eine Quelle das sogar studiert haben will!
    [/EDIT]



  • Ominion schrieb:

    😮 was ist daran falsch!? habe das aus mindestens 2 Quellen (also die Zahlen nicht, aber was den Unterschied zwischen unsigned und signed betrifft),

    Die Zahlen sind falsch. Was du da als Wertebereich für unsigned int angibst, ist wohl eher der größte darstellbare Wert eines 32bit-Fließkommatypen. Und die gibt's nicht unsigned.



  • Ominion schrieb:

    😮 was ist daran falsch!?

    Variablen des Typs int sind auf gebräuchlichen 32-Bit-Systemen 32 Bit breit. Der Wertebereich umfaßt also 232 = 4294967296 verschiedene Zahlen. Bei unsigned int geht der Wertebereich folglich von 0 bis 4294967295, bei unsigned int von -2147483648 bis 2147483647.



  • puhhh...ich dachte schon das die theroie komplett falsch ist...

    Mfg Ominion



  • Gut, mal abgesehen von den Datentypen, was genau ist ANSCII ???
    Ich kenn nur ASCII und ANSI, von einer Mischform hab ich noch nie was gehört...
    Also Is klar, dass man strings lieber außerhalb lagern sollte, allerdings ist mir das für ein einfaches Hello World programm zu umständlich. Als ersatz schreib ich einfach die String- Literale irgendwo oben hin.
    Also wenn ihr sagt, dass _T() oder TEXT() besser ist, werd ich den Rat befolgen, hab nämlich nicht viel Ahnung von der WinAPI, geschweige denn von Programmierstil und Trends...
    Ne allgemeine Frage: Wo kann finde ich denn eigentlich solche "Stilrichtlinien"? Ich hab nämlich nichts dagegen meinen Code einigermaßen korrekt zu gestalten.



  • Hmm sorry ich geb es ja zu. So wie ich den Code gepostet hab, sollte es nicht so sinnig sein das TEXT bzw _T Makro zu nutzen, da die WinMain sich ja nicht anpasst. Sorry. Musst du ändern ^^



  • DrPhil_Guth schrieb:

    Gut, mal abgesehen von den Datentypen, was genau ist ANSCII ???

    Vermutlich aus Halbwissen entstandener Unfug.

    DrPhil_Guth schrieb:

    Also Is klar, dass man strings lieber außerhalb lagern sollte, allerdings ist mir das für ein einfaches Hello World programm zu umständlich. Als ersatz schreib ich einfach die String- Literale irgendwo oben hin.

    Klar, daß man das in einem Programm dieses Umfangs nicht macht. Ich schrieb das nur, weil jemand behauptete, solche Stringliterale im Code seien guter Programmierstil 😉

    DrPhil_Guth schrieb:

    Ne allgemeine Frage: Wo kann finde ich denn eigentlich solche "Stilrichtlinien"?

    Insbesondere durch Erfahrungen, die du während des Lesens und Bewertens diverser Dokumentationen und Bücher und der Quelltexte anderer gewinnst. Es gibt viele gute, aber unterschiedliche Stile, nur über Dinge, die man nicht tun sollte, herscht weitläufige Einigkeit. Deinen eigenen Stil mußt du freilich selbst finden.
    Ein paar grundsätzliche Dinge, auf die du vielleicht achten solltest:
    - vermeide globale Variablen
    - kommentiere unübersichtliche Stellen eindeutig
    - schreibe Funktionen reentrant
    - gestalte dein Programm modular. Lagere Funktionalitäten in eigene Funktionen/Klassen/Module aus
    - schreibe dein Programm, wo immer es sinnvoll sein kann, plattform- und compilerunabhängig
    - wenn du die Wahl zwischen einer einfachen, unschönen und einer komplexeren, aber saubereren, erweiterbareren, abstrakteren Lösung hast, nimm letztere

    Für C++-Programmierer noch ein paar weitere Ratschläge:
    - vermeide Makros
    - verwende die Standard-Library und die STL, wann immer es sinnvoll ist
    - verstehe Zweck und Verwendung von Konzepten wie Polymorphie, generischer Programmierung, Template-Metaprogrammierung etc.
    - entwirf mit diesen Kenntnissen für größere Projekte ein Klassenmodell, das einen erweiterbaren, flexiblen, objektorientierten Lösungsansatz darstellt
    - lies Scott Meyers
    - glaube niemals, C++ ganz verstanden zu haben

    ...



  • audacia schrieb:

    Insbesondere durch Erfahrungen, die du während des Lesens und Bewertens diverser Dokumentationen und Bücher und der Quelltexte anderer gewinnst. Es gibt viele gute, aber unterschiedliche Stile, nur über Dinge, die man nicht tun sollte, herscht weitläufige Einigkeit. Deinen eigenen Stil mußt du freilich selbst finden.
    Ein paar grundsätzliche Dinge, auf die du vielleicht achten solltest:
    - vermeide globale Variablen

    Es lässt sicht oft nicht vermeiden. (1)

    - vermeide Makros

    (2)

    - verwende die Standard-Library und die STL, wann immer es sinnvoll ist

    - <vector> ist ein aufgeblähtes Ungetüm mit redundanter Funktionalität hoch 10.
    Manchmal ist weniger mehr. (3)

    - glaube niemals, C++ ganz verstanden zu haben
    ...

    Uneingeschränkte Zustimmung

    Nachsatz:
    Alle Sprachmittel haben ihre Berechtigung, je nach Aufgabenstellung.
    Das gilt speziell auch für globale Variablen und #defines.
    Es ist nicht klug, sich selbst aus Prinzip den Einsatz von Sprachmitteln zu verbieten. Vielmehr sollte man immer alle Möglichkeiten ausschöpfen, die es gibt. Wer keine #defines haben will, kann auch Java verwenden.
    mfg



  • audacia schrieb:

    DrPhil_Guth schrieb:

    Gut, mal abgesehen von den Datentypen, was genau ist ANSCII ???

    Vermutlich aus Halbwissen entstandener Unfug.

    Tut mir leid, ich bin nur ein Mensch...ich werde mich in Zukunft nicht mehr verschreiben, damit der/die Herr/in mit mir in vollster Weise zufrieden ist 🙄

    Mfg Ominion



  • Danke für eure Antwort Leute! Vielen dank für die Hilfe zum konkreten Problem, das hat mir sehr geholfen. Mittlerweile ist die Verwirrung in der WinAPI- Welt nicht mehr ganz so groß 🙄.
    Auch danke für die Tipps zum allgemeinen Sprachgebrauch, davon werd ich mir ein paar dinge abschauen.

    Thx leute!

    mfg, DrPhil_Guth



  • @Kritiker4:
    Du kannst - wie ich aus Deinem Post schließe - KEIN C++ oder ? 😃



  • Kritiker4 schrieb:

    - vermeide globale Variablen

    Es lässt sicht oft nicht vermeiden. (1)

    Das kommt drauf an. Zumindest mit dem Windows-API läßt es sich praktisch immer vermeiden. Ausnahmefälle wie z.B. Shared Memory in DLLs natürlich außen vor gelassen.

    Alle Sprachmittel haben ihre Berechtigung, je nach Aufgabenstellung.
    Das gilt speziell auch für globale Variablen und #defines.

    Nicht wenige, z.B. die hier genannten, haben ihre wesentliche Berechtigung in der Unterstützung von C.

    Es ist nicht klug, sich selbst aus Prinzip den Einsatz von Sprachmitteln zu verbieten. Vielmehr sollte man immer alle Möglichkeiten ausschöpfen, die es gibt.

    Klar. Aber was meinst du, warum von manchen Dingen gesagt wird, man solle sie nicht mehr verwenden? Weil es bessere Alternativen gibt!

    Wer keine #defines haben will, kann auch Java verwenden.

    Das war hoffentlich nicht ernst gemeint, oder? Sonst ziehe ich deine Fachkompetenz doch etwas in Zweifel.

    Ominion schrieb:

    Tut mir leid, ich bin nur ein Mensch...ich werde mich in Zukunft nicht mehr verschreiben, damit der/die Herr/in mit mir in vollster Weise zufrieden ist 🙄

    Das mit dem Halbwissen bezog sich weniger auf den Schreibfehler. Ich meinte insbesondere diesen Satz, in dem du, deiner Sache offenbar sicher, meiner Vermutung nach aus besagtem Halbwissen erwachsenen Unfug behauptetest:

    Ominion schrieb:

    Also _T () ist nur ein Makro von TEXT (""). TEXT ("") wandelt einen String in ANSCII um, und wird immermehr als guter Programmierstil angesehen



  • Also _T () ist nur ein Makro von TEXT ("")

    Hab jetzt nicht nachgeguckt ob dieser Irrtum schon beseitigt wurde... aber das stimmt so nicht. _T(x) ist ein eigenes Makro in tchar.h und macht von der Funktionalität zwar das selbe wie TEXT(x), ist aber nicht von diesem in irgendeiner Weise abhängig. Hab jetzt nicht nachgeguckt... aber _T(x) müsste höchstens von __T(x) abhängig sein 😉



  • DrPhil_Guth schrieb:

    Danke euch beiden!
    Jetzt Hab ich endlich wenigstens eine Rückgabe, und das fenster lässt sich auch schließen, nur den Prozess muss ich mit Strg - Alt - Entf beenden 🙂

    while (GetMessage(&msg, NULL, 0, 0)) {/*...*/}
    

    AFAIK.



  • Jo, hab ich auch gefunden.
    Hatte nämlich früher nur die Nachrichten für das Hauptfenster abgefangen, was dann natürlich blöd ist, wenn man keins mehr hat 😃 -> Gab dann ne endlosschleife, die dann jeweils 50 % der Prozessoleistung meiner beiden Kerne verbauchte 🙂


Anmelden zum Antworten