Laufzeitfehler mit Win-API

bluescreen
ich hab mir so ein klienes Win-Api tut vorgenommen und bis jetz ging alles gut.
ich hab gedacht das ein eigenes kleines prog. schreib und beim kompelieren geht alles gut.
aber mein Fenster erscheint nicht!!
hier der Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
#define STRICT
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//Name des Programms
const char ProgName[] = "Hallo oder nicht?";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
  //Festlegen von Vriablen und Structuren des Programms
  HWND Handle;
  MSG Nachricht;
  WNDCLASS wKlasse;

  //Die WNDCLASS - Kalsse mit Werten belegen
  wKlasse.style = CS_HREDRAW | CS_VREDRAW;
  wKlasse.lpfnWndProc = WndProc;
  wKlasse.hInstance = hInstance;
  wKlasse.hCursor = LoadCursor(NULL, IDC_ARROW);
  wKlasse.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wKlasse.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  wKlasse.lpszClassName = ProgName;
  wKlasse.lpszMenuName = NULL;
  //Fenster Registrieren
  RegisterClass( &wKlasse);
  //Fenster herstellen
  Handle = CreateWindow(ProgName, "Hallo oder nicht; Das ist hier die Frage!",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  NULL,
  NULL,
  hInstance,
  NULL);
  //Fenster erscheinen lassen
  ShowWindow(Handle, iCmdShow);
  UpdateWindow(Handle);
  while(GetMessage(&Nachricht, NULL, 0, 0))
  {
    TranslateMessage( &Nachricht); //Nachricht übersetzen
    DispatchMessage( &Nachricht);
  }


  return Nachricht.wParam;
}

//Verabrbeitung der Nachrichten
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message)
  {
    case WM_PAINT:
    {
      //Frage...
      int iAntwort = MessageBox(NULL, "Wollen sie begrüßt werden?", "Ich hät ma` ne Frache...",
      MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
      PAINTSTRUCT pMaler;
      HDC hDc;
      const char cJa[] = "Hallo, ich grüße sie!!!";
      const char cNein[] = "Na dann eben nicht!!";
      hDc = BeginPaint(hWnd, &pMaler);
      {
        if(IDOK == iAntwort)
        {
          TextOut(hDc, 50, 50, cJa, sizeof(cJa) - 1);
        }
        if(IDCANCEL == iAntwort)
        {
          TextOut(hDc, 50, 50, cNein, sizeof(cNein) - 1);
        }
      }
      EndPaint(hWnd, &pMaler);
      return 0;
    }
    case WM_DESTROY:
    {
      PostQuitMessage(0);
      return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
}




ich weis nich was da falsch is.
sieht einer von euch den Fehler?
Hanfling
Rücke deinen Code mal anständig ein. Das ist extrem unübersichtlich so.
bluescreen
ich weiß aber ich hab des nur kopiert und der hat der so gemacht...
Chris Hunter
Habs mal eingerückt :-)
Hanfling
UI, da hatte aber einer Langeweile? Heise Foren schon durchgelesen gehabt? Zunge raus

@Bluescreen:
Bei mir funktioniert das mit dem Kopieren... merkwürdig, merkwürdig... Zunge raus

Von deiner WNDCLASS würde ich erstmal cbClsExtra und cbWndExtra auf 0 setzen. Da die Elemente von nem struct nicht direkt zwangsweise 0 sind, sondern zufällige Werte annehmen. Kann sein das dir das den Ärger macht, weil du willst ja nicht zufällig Speicher reserverieren, oder? Augenzwinkern
bluescreen
ja... das kann sein. daran hab ich nicht gedacht.ich dachte die werden automatisch auf 0 gesetzt...
bluescreen
ps: danke führs einrücken...
bluescreen
naja...
man kann nicht sagen das es besser geworden ist...
immerhin kein Laufzeitbug
es erscheint:
code:
1:
2:
3:
4:
5:
6:

| C:Dev-CppJa_oderNein.cpp In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
88| C:Dev-CppJa_oderNein.cpp [Warning] control reaches end of non-void function

ich hzab kein plan was der compilöer meint...
ThiefMaster
Lern bitte erstmal Programmieren, bevor du mit Winapi/DirectX rumspielst.
Die Fehlermeldung heißt dass die Funktion etwas zurückgeben muss aber du kein return hast.
bluescreen
Danke für deine aufmunternten worte... großes Grinsen
aber mein Problem is das ich nich verseh warum:

return DefWindowProc(hWnd, message, wParam, lParam);

ich hab doch einen Rückgabewert. Aber vieleicht hst du Recht ich les mir des tut lieber ersmal noch mal von anfang an durch.
ThiefMaster
Dein return DefWindowProc(hWnd, message, wParam, lParam); ist noch im switch-Block drin statt danach. Alternativ kannst du es in den "default:"-Zweig setzen.

PS: Bei Cases verwendet man keine { und }. Stattdessen schließt man sie mit break; ab.
Chris Hunter
Zitat:
Original von ThiefMaster
PS: Bei Cases verwendet man keine { und }. Stattdessen schließt man sie mit break; ab.


Oh ja den Fehler habe ich am Anfang auch oft gemacht und bin daran verzweifelt. habs eben auch gar nicht bemerkt beim Einrücken.. Schande über mich.. Nun gut war auch Einrücken-only-Arbeit :-D
bluescreen
Mist, das hät mir auch auffallen sollen!!!
bluescreen
ja es hat funkrioniert.
aber einen logischen fehler hat das Programm (gehabt):
in WM_PAINT:
MessageBox() --> Fensterneuzeichnen --> MessageBox() ...

aber er giebt ja den scope operator großes Grinsen