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

29.04.2008, 16:21

Dialogbox

Hi Leute,
Ich habe mit einem Beispielprogramm aus dem Buch Windowsprogrammierung ein wenig herum experimentiert, und wollte nun eine Dialogbox einfügen. Das klappt auch! Aber wenn ich den Dialog beende, wird das Fenster auch mit beendet! :( Und ich bekomme folgene Warnungen, die ich nicht verstehe:

Quellcode

1
2
3
C:\Dokumente und Einstellungen\Artelt\Desktop\Sonstiges von André\188Petzold\Chap12\ClipText\ClipText.c(109) : warning C4047: '=' : Anzahl der Dereferenzierungen bei 'int ' und 'struct HINSTANCE__ *' unterschiedlich
C:\Dokumente und Einstellungen\Artelt\Desktop\Sonstiges von André\188Petzold\Chap12\ClipText\ClipText.c(198) : warning C4047: 'function' : Anzahl der Dereferenzierungen bei 'struct HINSTANCE__ *' und 'int ' unterschiedlich
C:\Dokumente und Einstellungen\Artelt\Desktop\Sonstiges von André\188Petzold\Chap12\ClipText\ClipText.c(198) : warning C4024: 'DialogBoxParamW' : Unterschiedliche Typen fuer formalen und uebergebenen Parameter 1

Ich glaube, dass es an der Nachrichtenfunktion für den Dialog liegen könnte, hier der Code:

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
BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{
 switch(message) 
 {
 case WM_INITDIALOG: 
      return TRUE; 

 case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     {
     case IDC_BUTTON1: 
         EndDialog(hDlg, 0); 
         return TRUE;
     } 
     break;

 case WM_DESTROY: 
     EndDialog(hDlg, 0); 
     return TRUE;
 }
 return FALSE;
}

Ich hoffe jemand kann mir helfen und bedanke mich schon mal für die Hilfe im voraus.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

29.04.2008, 17:06

Die Warnungen haben nichts mit dem Problem zu tun. Die kommen schon zur Kompilierzeit. Doppelklick mal auf die Einträge, dann kommst du direkt zum problematischen Code.
@D13_Dreinig

3

30.04.2008, 16:27

Dann komme ich zu folgenen Stellen:

C-/C++-Quelltext

1
          hInstance = ((LPCREATESTRUCT) lParam)->hInstance;

C-/C++-Quelltext

1
           DialogBox(hInstance, MAKEINTRESOURCE(Dialog), hwnd, DialogProc);

Und ich verstehe ja eben die Warnungen nicht! :(

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

30.04.2008, 16:44

Klick doppelt auf die Ausgabe und poste die entsprechende Zeilen mal.
@D13_Dreinig

5

30.04.2008, 16:47

Hast u irgendwie hInstance nicht als HINSTANCE erstellst sondern als int? :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

6

01.05.2008, 11:32

Das da oben waren die Stellen! Die Warnungen konnte ich beseitigen! Hatte

C-/C++-Quelltext

1
 static hInstance; 
geschrieben. Habe dieses jetzt in

C-/C++-Quelltext

1
 static HINSTANCE hInstance; 
geändert. Aber das Problem mit dem Dialog bleibt bestehen. Soll ich mal den ganzen Code posten :?:

7

01.05.2008, 12:15

Ja wie ich gesagt hab hast du hInstance vom Typ int und nicht vom Typ HINSTANCE erzeugt gehabt.

Poste den ganzen Code ... das static sieht an der Stelle merkwürdig aus!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

02.05.2008, 12:30

Hier der Code:

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*-----------------------------------------
   CLIPTEXT.C - Text in der Zwischenablage
                 (c) Charles Petzold, 1998
  -----------------------------------------*/

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 
BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{
 switch(message) 
 {
 case WM_INITDIALOG: 
      return TRUE; 

 case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     {
     case IDC_BUTTON1: 
         EndDialog(hDlg, 0); 
         return TRUE;
     } 
     break;

 case WM_DESTROY: 
     EndDialog(hDlg, 0); 
     return TRUE;
 }
 return FALSE;
}

#ifdef UNICODE

#define CF_TCHAR CF_UNICODETEXT
TCHAR szDefaultText[] = TEXT ("Standardtext - Unicode-Version") ;
TCHAR szCaption[]     = TEXT ("Text in der Zwischenablage - Unicode-Version") ;
#else

#define CF_TCHAR CF_TEXT
TCHAR szDefaultText[] = TEXT ("Standardtext - ANSI-Version") ;
TCHAR szCaption[]     = TEXT ("Text in der Zwischenablage - ANSI-Version") ;

#endif

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("ClipText") ;
     HACCEL       hAccel ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
     
     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 (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = szAppName ;
     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 ;
     }
     
     hwnd = CreateWindow (szAppName, szCaption,
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     hAccel = LoadAccelerators (hInstance, szAppName) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          if (!TranslateAccelerator (hwnd, hAccel, &msg))
          {
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
          }
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static PTSTR pText ;
     BOOL         bEnable ;
     HGLOBAL      hGlobal ;
     HDC          hdc ;
     PTSTR        pGlobal ; 
     static HINSTANCE hInstance;
     PAINTSTRUCT  ps ;
     RECT         rect ;
     
     switch (message)
     {
     case WM_CREATE: 
          hInstance = ((LPCREATESTRUCT) lParam)->hInstance; 
          SendMessage (hwnd, WM_COMMAND, IDM_EDIT_RESET, 0) ;
          return 0 ;

    case WM_INITMENUPOPUP:
          EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE,
               IsClipboardFormatAvailable (CF_TCHAR) ? MF_ENABLED : MF_GRAYED) ;

          bEnable = pText ? MF_ENABLED : MF_GRAYED ;

          EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT,   bEnable) ;
          EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY,  bEnable) ;
          EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR, bEnable) ;
          break ;
          
     case WM_COMMAND:
          switch (LOWORD (wParam))
          { 
          case IDM_EDIT_PASTE:
               OpenClipboard (hwnd) ;

               if (hGlobal = GetClipboardData (CF_TCHAR))
               {
                    pGlobal = GlobalLock (hGlobal) ;
                    if (pText)
                    {
                         free (pText) ;
                         pText = NULL ;
                    }
                    pText = malloc (GlobalSize (hGlobal)) ;
                    lstrcpy (pText, pGlobal) ;
                    InvalidateRect (hwnd, NULL, TRUE) ;
               }
               CloseClipboard () ;
               return 0 ;

          case IDM_EDIT_CUT:
          case IDM_EDIT_COPY:
               if (!pText)
                    return 0 ;

               hGlobal = GlobalAlloc (GHND | GMEM_SHARE, (lstrlen (pText) + 1) * sizeof (TCHAR)) ;
               pGlobal = GlobalLock (hGlobal) ;
               lstrcpy (pGlobal, pText) ;
               GlobalUnlock (hGlobal) ;

               OpenClipboard (hwnd) ;
               EmptyClipboard () ;
               SetClipboardData (CF_TCHAR, hGlobal) ;
               CloseClipboard () ;

               if (LOWORD (wParam) == IDM_EDIT_COPY)
                    return 0 ;        
                                             // weiter mit IDM_EDIT_CUT

          case IDM_EDIT_CLEAR:
               if (pText)
               {
                    free (pText) ;
                    pText = NULL ;
               }
               InvalidateRect (hwnd, NULL, TRUE) ;
               return 0 ;

          case IDM_EDIT_RESET:
               if (pText)
               {
                    free (pText) ;
                    pText = NULL ;
               }
               pText = malloc ((lstrlen (szDefaultText) + 1) * sizeof (TCHAR)) ;
               lstrcpy (pText, szDefaultText) ;
               InvalidateRect (hwnd, NULL, TRUE) ;
               return 0 ;
          }
          break ;

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

          GetClientRect (hwnd, &rect) ;
          
          if (pText != NULL)
               DrawText (hdc, pText, -1, &rect, DT_EXPANDTABS | DT_WORDBREAK) ;

          EndPaint (hwnd, &ps) ;
          return 0 ; 

          
          case WM_KEYDOWN: 
           DialogBox(hInstance, MAKEINTRESOURCE(Dialog), hwnd, DialogProc);

     case WM_DESTROY:
          if (pText)
               free (pText) ;

          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

9

02.05.2008, 14:04

Hier ist der Fehler:

C-/C++-Quelltext

1
2
3
4
case WM_KEYDOWN: 
           DialogBox(hInstance, MAKEINTRESOURCE(Dialog), hwnd, DialogProc); 

case WM_DESTROY:

Da nach DialogBox kein break oder return steht wir auch noch der case-Zweig für WM_DESTORY ausgeführt, indem das Programm mit PostQuitMessage beendet wird.
Signaturen werden überbewertet

10

03.05.2008, 11:19

Danke! Funktioniert, aber eine Frabe habe ich noch: Nach dem Aufruf von der Dialogbox habe ich break; und ein anderes mal return 0; gesetzt, beides funktioniert, müsste aber das Programm sich nicht nach return 0; beenden?

Werbeanzeige