MDI + Mauscursor + WinXP Home = Random(Müll)

Für allgemeine Fragen zur Programmierung mit PureBasic.
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

MDI + Mauscursor + WinXP Home = Random(Müll)

Beitrag von DarkDragon »

Hallo,

da man mit dem Standard WinXP Screenshotmaker(Print Taste) keine Mauszeiger mitaufnehmen kann, hab ich kein Bild für euch. Ich werde euch mein Problem so gut wie möglich beschreiben.

Startet ersteinmal dieses Beispielprogram:

Code: Alles auswählen

  If OpenWindow(0,0,0,400,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget,"MDIGadget") 
    If CreateGadgetList(WindowID(0)) And CreateMenu(0, WindowID(0)) 
      MenuTitle("Menu index 0") 
      MenuTitle("MDI windows menu") 
        MenuItem(0, "self created item") 
        MenuItem(1, "self created item") 
        
      MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize) 
        AddGadgetItem(0, -1, "child window") 
        AddGadgetItem(0, -1, "child window") 
      SetGadgetState(0, #PB_MDI_TILEVERTICALLY)
          ; add gadgets here... 
      CloseGadgetList() 
    EndIf 
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
  EndIf
Führt den Mauszeiger auf das erste Fenster(Mitten rein). Dann fahrt langsam über den dünnen vergrößerungs Rand ins anderen Fenster(auch mitten rein). Welchen Cursor habt ihr nun? Wenn der Fehler bei euch auch ist solltet ihr den horizontalen Rahmenvergrößerungscursor haben. Wenn ihr ihn nicht habt, dann ist bei euch ein Normaler Pfeilcursor.

Nun:
Wie kann ich das Problem beheben?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
VoSs2o0o
Beiträge: 25
Registriert: 29.08.2004 16:58
Kontaktdaten:

Beitrag von VoSs2o0o »

Ist ja doll dieses Problem habe ich auch.
Das ist mir aber bei meinen MDI-Projekten nicht aufgefallen. Ergo: Dieses Problem müsste sich auf eine bestimmte Eigenschaft/Formatierung/Befehlsreihenfolge reduzieren lassen.

(WXP Pro SP1)
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ich hab es schon versucht mittels SetCursor_ und SetClassWord, aber nichts von beidem hielf mir.

Vermutlich gibts da einen PB internen Window Callback für die MDIChilds, denn ich hab auch einmal versucht die WndProc selbst zu basteln, und da sind die Fenster irgendwie kaputt gegangen oder so. Ich werds nochmals versuchen. Ich schau auch mal in das C++ MDI Beispiel von Dev-Cpp, vielleicht kann ich dem Mehr entnehmen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Problem ist bekannt und behoben. Mit dem nächsten Update ist es weg.

Timo
Mereep
Beiträge: 72
Registriert: 01.09.2004 18:55
Wohnort: Annaberg-Buchholz

Beitrag von Mereep »

Yeah, siehste freak, wenn es einer bemerkt... ;-)
Print("Hallo Welt")
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Dann hätt ich aber doch auch noch ne Frage: wie kann man den Mauscursor in einem MDI Kind Fenster verändern? Ich brauch da eigentlich eh nen anderen Cursor.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Mereep
Beiträge: 72
Registriert: 01.09.2004 18:55
Wohnort: Annaberg-Buchholz

Beitrag von Mereep »

SetCursor_(LoadCursor_())
Musste aber dann bei jeder Mausbewegung machen!

GreeZ Mereep
Print("Hallo Welt")
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Hmm... davor hab ichs immer mit SetCursor_(#IDC_CROSS) versucht, leichtsinnsfehler :mrgreen: .
Naja, kann mir noch einer sagen, wie man das nur für ein MDIChild macht? Und dann auch nur im inneren?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Mereep
Beiträge: 72
Registriert: 01.09.2004 18:55
Wohnort: Annaberg-Buchholz

Beitrag von Mereep »

Iw meinst du das "nur" für ein MDIChild?
Meinst du, dass der arrow immer dann erscheinen soll, wenn der user über einem solchen Childwindow ist?
Wenn ja:
Du musst die WindowProc deiner Childwindows umleiten(Das handle zu den Childwindows bekommst du, wenn du eines erstellst zurückgegeben).
SetWindowLong_(hwnd,#GWL_WNDPROC,@DeineProcedur())
In der Proc fängst du dann einfach #WM_MOUSEMOVE ab und setzt dann einfach deinen Zeiger so, wie du ihn haben willst mit dem Befehl, den ich dir gepostet hab.
Vergiss aber nicht die Orginalprocedure am Ende deiner Abfragen noch auszuführen.

Wenn du noch fragen hast, dann frag einfach nochmal ;-)

GreeZ Mereep
Print("Hallo Welt")
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

So, das hab ich eigentlich schon beim ersten Post meines Problems probiert, aber irgendwie geht dann alles kaputt. Ich mach eine Normale Callbackprozedur und plötzlich bekomm ich keine Events für das Fenster mehr und es reagiert auch nichtmehr.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten