Mein erstes WinAPI Programm

#2274975
Lesenswert?

Ich versuche gerade mich in die Welt der Programmierung von 
Windowsfenstern ein zu arbeiten. Da habe ich mir ein Tutorial aus dem 
Netz gesucht: http://www.win-api.de/tutorials.php?tutid=2

Ich habe jetzt einfach mal stumpf stupide den C Coode in mein VisualC++ 
Programm kopiert und wollte es einfach mal aus testen.
1
#define STRICT
2
#include <windows.h>
3

4
const char  szWitz[] = "\"Ich steh' schwer auf Umweltschutz\", sagt Peter.\n"
5
                       "\"Ich werfe zum Beispiel alte U-Bahn-Fahrscheine nie weg,\n"
6
                       "sondern benutze sie mehrmals.\"";
7

8
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
9
                    PSTR szCmdLine, int iCmdShow)
10
{
11
   int iAntwort = MessageBox(NULL, szWitz, "Ha, ha, ha, ha...", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
12

13
   if (IDOK == iAntwort)
14
   {
15
      MessageBox(NULL, "Ja, ich finde den Witz auch Ok...",
16
                       "Sie haben auf Ok gedrückt",
17
                       MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
18
     }
19
   else if (IDCANCEL == iAntwort)
20
     {
21
     MessageBox(NULL, "Ja, warum haben sie denn auf Abbrechen gedrückt?\n"
22
                       "Hat ihnen der Witz etwa nicht gefallen?",
23
                       "Sie haben auf Abbrechen gedrückt",
24
                       MB_ICONINFORMATION  | MB_OK | MB_DEFBUTTON1);
25
     }
26

27
   return 0;
28
}

Doch es kommen nur mehere Fehlermeldungen die beziehen sich immer auf 
die geschriebenen Textzeilen die innerhalb der " " stehen.

1  IntelliSense: Das Argument vom Typ ""const char *"" ist mit dem 
Parameter vom Typ ""LPCWSTR"" inkompatibel.  11

kennt sich jemand damit aus?
Gast #2274982
Lesenswert?

Ich glaube, du musst:
1
MessageBox(NULL, T("Ja, ich finde den Witz auch Ok...",
2
                       "Sie haben auf Ok gedrückt"),
3
                       MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);

schreiben, um 16Bit -Texte zu definieren. Also T(...) um die Strings.

Allerdings, möchtest du dir das wirklich antun, mit den WinAPI direkt 
programmieren? Es empfiehlt sich die Verwendung eines Toolkits wie Gtk 
oder Qt, das ist einfacher, und, wenn richtig gemacht, auch auf andere 
Betriebssysteme portabel.
Gast #2274996
Lesenswert?

Mach aus dem "T" ein "Text", dann stimmts. Also so

MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);

> Allerdings, möchtest du dir das wirklich antun, mit den WinAPI direkt
> programmieren?

Na nu lass ihn doch mal. Man lernt was dabei. ;)

> Es empfiehlt sich die Verwendung eines Toolkits wie Gtk
> oder Qt, das ist einfacher,

oder gleich C#, das ist dann noch bequemer ;)

> und, wenn richtig gemacht, auch auf andere
> Betriebssysteme portabel.

für den der das braucht. ;)
Gast #2275002
Lesenswert?

na oh (Gast) schrieb:

> teste doch mal MessageBox(NULL, "hey", "hey",0);

das führt unter VC 2008 zu einem

 error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const 
char [19]' in 'LPCWSTR' nicht möglich

also immer schön die Anweisung

Text("   ")

darum ;)
Gast #2275032
Lesenswert?

> Habt ihr was besseres?

Nix da, bleib dabei, so lernst du wenigstens richtiges Programmieren und 
kein Zusammenfriekeln irgendwelcher Funktionen aus den Libs. Es ist zwar 
brutal und umständlich, aber man lernt dabei fürs Leben;)
Persönliche Seite #2275054
Lesenswert?

> Nix da, bleib dabei, so lernst du wenigstens richtiges Programmieren und
> kein Zusammenfriekeln irgendwelcher Funktionen aus den Libs. Es ist zwar
> brutal und umständlich, aber man lernt dabei fürs Leben;)
Bitte was?! Durch schmerzhaftes verwenden eines verkorksten API's lernt 
man was? Lieber mit einem schöneren API anfangen, damit man sieht wie es 
richtig geht, und später vielleicht ein verkorsktes, um zu sehen, wie es 
nicht geht...

Und wer Angst vor Englisch hat, wird viel Spass beim programmieren 
haben... Fast alles ist in Englisch geschrieben, und wenn du etwas mehr 
machen willst als das Tutorial hergibt, wirst du es auch brauchen...
Gast #2275075
Lesenswert?

Ben S. (theben) schrieb:

> Danke Leute Text("") funktioniert.
> Ich tu mir WinAPI an weil ich kein anderes deutschprachiges tutorial
> gefunden habe.
> Habt ihr was besseres?

Also nur allein mit deutsch geht das nicht, da wirst du gelinde gesagt 
nicht glücklich werden. Das gilt aber nicht nur für die WinAPI. ;)

Lade dir die Programmbeispiele vom Petzold herunter (sind frei dl'bar)
http://www.charlespetzold.com/src/ProgWin5.zip
und schau dir den Beispielcode genau an. Besser noch wäre dazu auch das 
Buch (oder ebook) zur Hand zu haben.

Das msdn ist aber noch immer DIE Informationsquelle schlecht hin.

Ansonsten wirf einen Blick hier rein

http://books.google.com/books?id=ex0vcHp4nTUC&lpg=PP1&hl=de&pg=PP1#v=onepage&q&f=false
Gast #2275320
Lesenswert?

> Lieber mit einem schöneren API anfangen, damit man sieht wie es
> richtig geht, und später vielleicht ein verkorsktes, um zu sehen, wie es
> nicht geht...

unter windows ist das die native API. Alle anderen benutzen diese. Und 
wenn man die kann dann versteht man auch warum in den anderen das ein 
oder andere Problem so gelöst ist wie es gelöst ist.
Persönliche Seite #2275625
Lesenswert?

> unter windows ist das die native API. Alle anderen benutzen diese. Und
> wenn man die kann dann versteht man auch warum in den anderen das ein
> oder andere Problem so gelöst ist wie es gelöst ist.
Stimmt, wenn man das WinAPI so interessant findet...
Was ist schöner:
1
#include <gtkmm.h>
2

3
bool on_close (GdkEventAny*) {
4
  Gtk::Main::quit ();
5
  return true;
6
}
7

8
int main (int argc, char* argv) {
9
  Gtk::Main k (&argc, &argv);
10
  Gtk::Window wnd (GTK_WINDOW_TOPLEVEL);
11
  wnd.set_title ("blubber");
12
  wnd.show ();
13
  k.run (&wnd);
14
}
oder:
1
#include <windows.h>
2

3
const char g_szClassName[] = "myWindowClass";
4

5
// Step 4: the Window Procedure
6
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
7
{
8
    switch(msg)
9
    {
10
        case WM_CLOSE:
11
            DestroyWindow(hwnd);
12
        break;
13
        case WM_DESTROY:
14
            PostQuitMessage(0);
15
        break;
16
        default:
17
            return DefWindowProc(hwnd, msg, wParam, lParam);
18
    }
19
    return 0;
20
}
21

22
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
23
    LPSTR lpCmdLine, int nCmdShow)
24
{
25
    WNDCLASSEX wc;
26
    HWND hwnd;
27
    MSG Msg;
28

29
    //Step 1: Registering the Window Class
30
    wc.cbSize        = sizeof(WNDCLASSEX);
31
    wc.style         = 0;
32
    wc.lpfnWndProc   = WndProc;
33
    wc.cbClsExtra    = 0;
34
    wc.cbWndExtra    = 0;
35
    wc.hInstance     = hInstance;
36
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
37
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
38
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
39
    wc.lpszMenuName  = NULL;
40
    wc.lpszClassName = g_szClassName;
41
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
42

43
    if(!RegisterClassEx(&wc))
44
    {
45
        MessageBox(NULL, "Window Registration Failed!", "Error!",
46
            MB_ICONEXCLAMATION | MB_OK);
47
        return 0;
48
    }
49

50
    // Step 2: Creating the Window
51
    hwnd = CreateWindowEx(
52
        WS_EX_CLIENTEDGE,
53
        g_szClassName,
54
        "The title of my window",
55
        WS_OVERLAPPEDWINDOW,
56
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
57
        NULL, NULL, hInstance, NULL);
58

59
    if(hwnd == NULL)
60
    {
61
        MessageBox(NULL, "Window Creation Failed!", "Error!",
62
            MB_ICONEXCLAMATION | MB_OK);
63
        return 0;
64
    }
65

66
    ShowWindow(hwnd, nCmdShow);
67
    UpdateWindow(hwnd);
68

69
    // Step 3: The Message Loop
70
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
71
    {
72
        TranslateMessage(&Msg);
73
        DispatchMessage(&Msg);
74
    }
75
    return Msg.wParam;
76
}

Was lädt mehr dazu ein, so zu arbeiten?
Persönliche Seite #2278443
Lesenswert?

Nunja, das erste verwendet das GTKmm, erstellt ein Fenster, stellt einen 
Titel ein, und startet dann die GTKmm-Hauptschleife - diese wartet dann 
auf Benutzereingaben. Wenn man das Fenster schließt, wird on_close 
aufgerufen, was die GTKmm-Hauptschleife beendet.

Hier gibt's die Doku:
http://www.gtkmm.org/en/documentation.html
Und da ein Tutorial:
http://developer.gnome.org/gtkmm-tutorial/unstable/index.html

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren