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.08.2005, 12:32

CALLBACK - Funktionen

Ich wollte fragen ob man einer CALLBACK funktion irgendwie Variablen bekannt zu machen (ohne Globale Variablen). Wenn man z.B. durch DialogBox ein Dialogfeld in der Nachrichtenschleife erzeugen will muss man ja die Instanz der WinMain Funktion übergeben. Bisher habe ich das nur mit Globalen Variablen gesehen.

2

29.08.2005, 13:13

erklär mal genauer was du mit "variablen bekannt machen" meinst
und vllt. in welchem kontext.
btw DialogBox erwartet keine instanz von WinMain
sondern DialogProc

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

3

29.08.2005, 14:36

parameter?

4

29.08.2005, 17:49

Die wird doch aber automatisch von Windows aufgerufen.

5

29.08.2005, 18:11

@0x00000023

ähm ich hab hier ein bissl beispielcode:

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
#include <windows.h>
#include <string.h>
#include "resource.h"

LPCSTR MainClassName = "Dialogfelder";

// Globale Variable

// 

HINSTANCE hInst;


//Für Auswertung von Check- und Radiobuttons

BOOL bChecked1 = FALSE;
BOOL bChecked2 = FALSE;
BOOL bRadio1   = FALSE;
BOOL bRadio2   = FALSE;
BOOL bRadio3   = FALSE;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
   WNDCLASSEX wc;
   MSG wmsg;
   HWND hWnd;

   wc.cbSize                 = sizeof(WNDCLASSEX);
   wc.style          = 0;
   wc.lpfnWndProc         = WndProc;
   wc.cbClsExtra         = 0;
   wc.cbWndExtra         = 0;
   wc.hInstance         = hInstance;
   wc.hIcon                 = LoadIcon(GetModuleHandle(NULL),
                            MAKEINTRESOURCE(ID_ICON));
   wc.hCursor                 = LoadCursor(NULL, IDC_CROSS);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU);
   wc.lpszClassName = MainClassName;
   wc.hIconSm                 = (HICON)LoadImage(GetModuleHandle(NULL),
                                        MAKEINTRESOURCE(ID_ICON),
                                        IMAGE_ICON, 16, 16, 0);

   if(!RegisterClassEx(&wc))
      {
       MessageBox(NULL, "Windows Registrations Fehler", "Error!",
                  MB_ICONEXCLAMATION | MB_OK)
       return 0;
      }

    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, MainClassName,
                          "Menü Beispiel",
                          WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          400, 300,NULL,NULL,hInstance, NULL);

     ShowWindow (wmsg, iCmdShow);
     UpdateWindow (wmsg);
     
    
    // Globaler Variable wird die Instanz zugeteilt

    //

    hInst=hInstance;

    if(hWnd == NULL)
    {
       if(MessageBox(NULL, "Fehler beim Erstellen des Fensters!",
          "Error!",        MB_ICONEXCLAMATION | MB_OK) == IDOK);
          return 0;
    }

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


LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg,
                          WPARAM wParam, LPARAM lParam )
{
   switch( uMsg )
   {
      case WM_COMMAND :
              switch( LOWORD( wParam ) )
              {
                 //Wurde Menüelement "Radio & Checkbox" gewählt

                 case ID_MENU_RADIO_CHECK  :
                        DialogBox( hInst,   // <-Globale Variable wird hier benötigt

                                        MAKEINTRESOURCE(IDR_DIALOG),
                                       hWnd,
                                       (DLGPROC)CheckRadioProc );

6

29.08.2005, 18:19

wenigstens is deine frage jetzt klar.
nur versteh ich nicht wo dein problem liegt.
du hast ja eh schon x globale variablen
da is eine mehr doch kein stress.
kannst sie ja static machen dann ist sie nicht
mehr so ganz global...^^

Anonymous

unregistriert

7

29.08.2005, 19:03

In C++ würd ich dir vorschlagen ne Klasse dafür zu schreiben und in der wndproc einfach die nachricht weiterzuleiten, so hast du das Problem nicht mehr.

In C wüsst ich nur eine Möglichkeit und damit beschränkst du nur den direkten Zugriff (praktisch fürs debuggen).

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct Globals_
{
   HINSTANCE hInst;
   BOOL bChecked1;
   BOOL bChecked2;
   BOOL bRadio1;
   BOOL bRadio2;
   BOOL bRadio3; 
} Globals;

Globals* GetGlobalPtr()
{
   static Globals globals;
   return &globals;
}

/* Und zugreifen kannst dann auf die Variablen von überall mit
   GetGlobalPtr()->hInst = hInstance;
   GetGlobalPtr()->bRadio1 = FALSE;
   usw.
*/


Aber richtig vermeiden kann man es nicht, man kann es nur etwas verpacken.

8

29.08.2005, 20:37

das is doch total sinnlos. son ... aufwand für eine einzige global

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

29.08.2005, 21:02

Ich glaube er hat etwas ganz anderes nicht verstanden. Mit

Quellcode

1
wc.lpfnWndProc         = WndProc; 


Machst du die Funktion bekannt. Ab da weiss Windows welche es zurückrufen soll.

10

29.08.2005, 21:36

ich denke es geht um folgende zeile:

Zitat

DialogBox( hInst, // <-Globale Variable wird hier benötigt

Werbeanzeige