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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

23.06.2006, 18:22

[WinAPI] So einige Fragen ...

Langsam staut sich das hier auf ... Da poste ich lieber einmal ^^

1) Warum springt mein Popupmenü recht merkwürdig hin und her? Die X Position ist korrekt, aber die Y Position verhält sich ... komisch ebend ^^ Sie ist scheinbar abhängig von der X Position. Je weiter der Cursor links ist desto höher die X Position.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
        case WM_RBUTTONUP:
            Point.x = LOWORD(lParam);
            Point.y = HIWORD(lParam);

            ClientToScreen(hWndMain_, &Point);

            TrackPopupMenu(hMenuTemp, TPM_RIGHTBUTTON, Point.x, Point.y, 0, hWndMain_, NULL);

            return (0);
Edit: *Hust* Ihr habt nix gesehen ^^ Hat sich erledigt ^^

2) Ich arbeite mit "Windowsprogrammierung" (5. Auflage) von Petzold. Später wird da (soweit ich das bisher überblicke) verdammt viel mit Ressourcen gearbeitet. Bisher wurde mir immer gesagt das sei nicht grad das wahre, aber naja. Mein Problem liegt eher darin das ich keinen (bzw nur den vom VS6) Ressourcen Editor habe. Gibts da Freewaretools oder so? Ansonsten fahr ich eben doch das Upgrade aufs Visual Studio 8 Standard.

3) Gut, eine etwas komplexere Frage. Ich find dazu nichts weil mir wohl einige Fachwörter fehlen, vllt kann mir ja wer ein paar Stichpunkte geben.
Einige Programme haben ein Design das mich entfernt an Frames erinnert (in HTML). Also verschiebbare Bereiche die jeweils eine Art eigenes Fenster darstellen. Wie stell ich das an wenn ich solche haben möchte? Vllt kann mir ja wer ein paar Stichpunkte zum Googlen bzw für die MSDN geben. Oder behandelt Petzold das doch? Dann bitte bescheidsagen und ich wühl nochmal durch ^^

Edit:
4) Ah, mir ist doch noch was eingefallen. Ich würde die Windowsnachrichtenprozedur gernbe zum Teil meiner Fensterklasse machen. Nur wie? Diese einfach zu einer Funktion der Klasse zu machen klappt nicht.

C-/C++-Quelltext

1
wndclass_.lpfnWndProc = Window::WndProc;

C-/C++-Quelltext

1
2
3
.\src\Window.cpp(22) : error C3867: 'Window::WndProc': function call missing argument list; use '&Window::WndProc' to create a pointer to member
.\src\Window.cpp(22) : error C2440: '=' : cannot convert from 'LRESULT (__stdcall Window::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
        There is no context in which this conversion is possible

2

23.06.2006, 21:50

3) Splitter ... www.catch22.net findest de nen sample
4) google mal danach... das ist schon oft besprochen worden... aber evt. hat nix da auch nen schönen vorschlag...
2) Ja... hatten wir auch schonmal... such auch danach mal....
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

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

24.06.2006, 08:17

zu 4) Du kannst zwar mit der richtigen Syntax einen Zeiger auf eine Member-Methode erzeugen, aber die wirst du nicht als WinMain registrieren können, weil Windows nicht weiss, welche this Zeiger zu benutzen ist.

Der this Zeiger wird für jede Methode einer Klasse automatisch als "Argument" übergeben (auch wenn man das nirgends selbst so hinschreiben muss).

Vermutlich würde es gehen, wenn sie static ist, weil sie dann keinen this Zeiger braucht. Aber wie man das vernünftigerweise machen sollte, kann ich aber aus dem Stand auch nicht sagen :(

Für diejenigen, die es interessiert, so kann man einen Zeiger auf eine Klassen-Methode erzeugen.

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
class Class
{
public:

  void foo (int);
  void bar (int);

  static void fun (int);
};

typedef void (Class::*_ClassFunPtr) (int); // Typ fuer den Methodenzeiger

typedef void (*_StaticIntFun) (int);

int main ()
{
  Class c1;
  Class c2;
  Class* c3 = c2;

  _ClassFunPtr fun_ptr1 = &Class::foo; // Methode foo im Zeiger merken


  // und in verschiedenen Objekten aufrufen.

  (c1.*fun_ptr1) (1);  // sieht lustig aus, ist aber richtig ;)

  (c3->*fun_ptr1) (1);

  fun_ptr1 = &Class::bar; // Andere Methode merken


  // und in verschiedenen Objekten aufrufen.

  (c1.*fun_ptr1) (1);
  (c3->*fun_ptr1) (1);

  // statische Methode braucht kein Objekt

  _StaticIntFun fun_ptr2 = &Class::fun;
  (*fun_ptr2) (1);

  return 0;
}


Methoden-Zeiger sind aber kein einfaches Thema und es gibt fast immer einen Weg, wie man sie vermeiden kann. Wenn man allerdings tiefer in die C++ Template Bibliothek einsteigt, wird man um sie nicht wirklich rumkommen, weil die Algorithmen dort starken gebrauch von ihnen machen.

Wichtig ist dabei niemals zu vergessen, dass eine Klassen-Methode niemals ohne Objekt der entsprechenden Klasse aufgerufen werden kann. Ausnahmen sind "static" Methode, die keinen this Zeiger haben.

MfG
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige