Forum: PC-Programmierung Mein erstes WinAPI Programm


von Ben S. (theben)


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?

von Der Weise (Gast)


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.

von na oh (Gast)


Lesenswert?

Ben S. schrieb:
> Abbrechen gedrückt?\n"

da fehlt das Komma

von na oh (Gast)


Lesenswert?

teste doch mal MessageBox(NULL, "hey", "hey",0);
oder MessageBoxA(Null.....

von agp (Gast)


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. ;)

von agp (Gast)


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 ;)

von na oh (Gast)


Lesenswert?

a oke. man koennte dann aber auch (LPCWSTR) "hey"   schreiben oder 
LPCWSTR("hey")

von na oh (Gast)


Lesenswert?

typisch winapi. einfach alles irgendwie zurecht-casten . lol

von na oh (Gast)


Lesenswert?

schön ist dann auch

char blau[500];
int i=0;
for(; i < 1000; i++)
{
sprintf(blau, "%i",i);
MessageBox(NULL, Text("Gruenschnabel"), Text(blau),0);
};

von Ben S. (theben)


Lesenswert?

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

von Alex (Gast)


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;)

von Niklas G. (erlkoenig) Benutzerseite


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...

von agp (Gast)


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

von agp (Gast)


Lesenswert?

ACHTUNG: Englisch! ;)

http://www.winprog.org/tutorial/

von na oh (Gast)


Lesenswert?


von Uwe (Gast)


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.

von Niklas G. (erlkoenig) Benutzerseite


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?

von Ben S. (theben)


Lesenswert?

Ja das erste sieht ja ganz schön aus. Wenn mir jetzt nur noch einer 
erklären kann was da steht? (Tutorial?)

von Niklas G. (erlkoenig) Benutzerseite


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

von Ben S. (theben)


Lesenswert?

mir ist heute das Buch Visual C++ 2010 über den Weg gelaufen. Darin wird 
Windows Forms erklärt was haltet ihr davon?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.