Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.07.2008, 16:26

MDI-Programm funktioniert nicht!

Hi Leute,
nachdem ich nun endlich das Buch Windowsprogrammierung durchgelesen habe, wollte ich mich mal an einem MDI-Programm versuchen. Allerdings sieht das Fenster genau so aus wie ohne MDI, obwohl ich den MDI Teil impletiert habe. Worann könnte das liegen? Soll ich mal den Code posten?
Vielen dank schon mal für Hilfe im voraus.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

2

05.07.2008, 17:37

Ich bin leider noch nicht dazu gekommen mir eine Kristallkugel zu besorgen :(

Zitat von »"Hobby Programmierer"«

Soll ich mal den Code posten?

Das wäre doch mal eine gute Idee.
Signaturen werden überbewertet

3

05.07.2008, 17:50

C-/C++-Quelltext

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// MyWindows 

#include <windows.h>
#define IDM_FIRSTCHILD 1
// Nachrichtenfunktion

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);  
LRESULT CALLBACK Proc(HWND, UINT, WPARAM, LPARAM);

TCHAR szname[6] = TEXT("CHILD"); 
HINSTANCE hInst; 
// hauptprogramm

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("MyWindows") ;
     HWND         hwnd;
     MSG          msg ;
     WNDCLASS     wndclass ;

     hInst = hInstance;
     
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0;
     wndclass.cbWndExtra    = 0;
     wndclass.hInstance     = hInstance;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (COLOR_APPWORKSPACE + 1);
     wndclass.lpszMenuName  = NULL;
     wndclass.lpszClassName = szAppName;
     
     if (!RegisterClass (&wndclass))
     {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 

          MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     } 

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = Proc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = sizeof(HANDLE);
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL;
     wndclass.lpszClassName = szname; 

     RegisterClass(&wndclass);
     
     // Fenster erzeugen

     hwnd = CreateWindow (szAppName, TEXT ("MyWindows"),
                          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
     

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}
// Nachrichtenfunktion

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{    
     // Vaiabeln 

     PAINTSTRUCT ps; 
     HDC hdc; 
     HWND hwndchild = NULL; 
     HWND hwndclient = NULL; 
     CLIENTCREATESTRUCT cl; 
     MDICREATESTRUCT mdi;
     
     switch (message)
     {
     case WM_CREATE: 
         cl.hWindowMenu = NULL; 
         cl.idFirstChild = IDM_FIRSTCHILD; 
         hwndclient = CreateWindow(TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 1, hInst, (PSTR) &cl);

         mdi.szClass = szname; 
         mdi.szTitle = TEXT("MDI"); 
         mdi.hOwner = hInst; 
         mdi.cx = CW_USEDEFAULT; 
         mdi.cy = CW_USEDEFAULT; 
         mdi.x = CW_USEDEFAULT; 
         mdi.y = CW_USEDEFAULT; 
         mdi.style = 0; 
         mdi.lParam = 0; 

         hwndchild = (HWND) SendMessage(hwndclient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT) &mdi);
          return 0 ;

     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ; 
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY: 
          SendMessage(hwndclient, WM_MDIDESTROY, (WPARAM) hwndchild, 0);
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefFrameProc (hwnd, hwndclient, message, wParam, lParam) ;
}  

LRESULT CALLBACK Proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
 // Variablen 

 HDC hdc; 
 PAINTSTRUCT ps;

 switch(message) 
 { 
 case WM_PAINT: 
     hdc = BeginPaint(hwnd, &ps); 
     TextOut(hdc, 100, 200, TEXT("Hallo"), 6);
     EndPaint(hwnd, &ps);
     break;
 }

 return DefMDIChildProc(hwnd, message, wParam, lParam);
}

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

4

05.07.2008, 21:38

Du musst die Fensterhandles in der Nachrichtenfunktion als static deklarieren. Dann klappt's.
Also:

C-/C++-Quelltext

1
2
static HWND hwndchild = NULL;
static HWND hwndclient = NULL;


cu
Signaturen werden überbewertet

5

06.07.2008, 11:54

Super, funktioniert jetzt! :) Danke!

Werbeanzeige