JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c70e7531c5f19b0be6b5ffeed6323359Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit der Message - loop in NICHT MFC Slider

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jörg47
Mini JLI'ler



Anmeldedatum: 07.02.2007
Beiträge: 26

Medaillen: Keine

BeitragVerfasst am: 23.06.2007, 19:30    Titel: Problem mit der Message - loop in NICHT MFC Slider Antworten mit Zitat

Hi Leute,

folgende Situation:
Nicht Mfc Dialog mit Slider resource soll bei NM_CUSTOMDRAW Nachricht auf bestimmte Art gemalt werden.
Ich bin folgendermaßen vorgegangen:

Ich setzte meinen eigenen Message Handler für den Slider an Stelle des alten. Das passiert in INIT_DIALOG:
CPP:
lpfnOldSliderProc = (WNDPROC)SetWindowLong(ghWndSliderSound, GWL_WNDPROC, (LONG) SliderProcHelper);


In meinem Message Handler will ich die NM_CUSTOMDRAW Nachricht
abfangen, und alle anderen an den alten Handler weiterreichen.
CPP:
LRESULT CALLBACK SliderProcHelper( HWND ghWndSliderSound, UINT msg, WPARAM wParam, LPARAM lParam )
{
    return s_pAudioSettingsDialog->NewSliderProc( ghWndSliderSound, msg, wParam, lParam );
}

INT_PTR CDlgAudioSettings::NewSliderProc( HWND ghWndSliderSound, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
   case NM_CUSTOMDRAW:
      return DrawSliderItem((NMHDR*) lParam);
   break;
   default:
      break;
   }
   return CallWindowProc(lpfnOldSliderProc, ghWndSliderSound, msg, wParam, lParam);
}

Das Ganze funktioniert auch insofern, als das Nachrichten in meinem Handler ankommen und korrekt weitergeleitet werden.

An ghWndSliderSound kann ich erkennen, daß es sich um Nachrichten an den Slider handelt. Eine NM_CUSTOMDRAW ist nicht dabei.

In einem MFC Beispiel wird so vorgegengen:
CPP:
BEGIN_MESSAGE_MAP(CMySliderControl, CSliderCtrl)
   //{{AFX_MSG_MAP(CMySliderControl)
      ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
      ON_WM_ERASEBKGND()
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()


Was ist an meiner NON MFC Variante nicht OK? Wo ist der Fehler?

Jörg

edit by AFE-GmdG: CPP-Tags für bessere lesbarkeit hinzugefügt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.06.2007, 08:42    Titel: Antworten mit Zitat

Das hört sich an, als ob NM_CUSTOMDRAW nicht gesendet wird. Eventuell fehlt dem Slider ein Style, damit er NM_CUSTOMDRAW-Messages sendet.
Du kannst mit Spy++ (in deinem Visual Studio-Tools-Verzeichnis) nachschauen, welche Messages alles gesendet werden, welche Styles im Slidier-Fenster aktiv sind usw.
Wenn du das mit der MFC-Variante vergleichst, bemerkst du eventuell den vergessenen Unterschied
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg47
Mini JLI'ler



Anmeldedatum: 07.02.2007
Beiträge: 26

Medaillen: Keine

BeitragVerfasst am: 25.06.2007, 14:09    Titel: Antworten mit Zitat

Hi AFE-GmdG,

schön wärs. Aber anders als z.B. Buttons haben Slider kein OwnerDraw flag. Daran liegt es nicht. Auch nicht an anderen flags, die ich alle überprüft habe.

Es gibt aber einen Unterschied:
Im MFC Beispiel wird der Slider via
CPP:
   //{{AFX_DATA_MAP(CTransparentSliderDemoDlg)
   DDX_Control(pDX, IDC_SLIDER3, m_slider3);
   //}}AFX_DATA_MAP

eingebunden.

ohne diese Zeile geht es in der MFC Variante nicht. Da ich keine AFX_DATA_MAP habe, mache ich soetwas auch nicht.

Die Dokumentation sagt bezüglich DDX_Control auch etwas über subclassing. Was immer das auch sei. Bislang ging ich davon aus, mich darum nicht weiter kümmern zu müssen, da ich keine eigene Sliderklasse abgeleitet habe (Wovon auch? Von msctls_trackbar32 ??? und wozu? Die Slider Funktionalität habe ich ja im Griff).

Es bleibt leider eine offene Frage. Hat jemand eine Idee?

Jörg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg47
Mini JLI'ler



Anmeldedatum: 07.02.2007
Beiträge: 26

Medaillen: Keine

BeitragVerfasst am: 01.07.2007, 14:04    Titel: Antworten mit Zitat

Hi Leute,

für die Interessierten:

Ich habe wohl entschieden zu kompliziert gedacht. Ein Weg das Problem im Parent Message Handler (im Dialog ) zu lösen sieht so aus:

CPP:
   case WM_NOTIFY:
      switch( wParam )
      {
      case  IDC_SLIDER_SOUND :
         {
            DrawSliderItem(wParam, (NMHDR*) lParam);
                   ...   
 
         }
       break;
       }


Eine NM_CUSTOMDRAW wird zunächst nicht gesendet. Aber es wird eine WM_NOTIFY vom Control gesendet. In wParam steckt dann die ID des sendenden Controls. Wenn man das richtige Control gefunden hat, ist lParam mit den richtigen Daten gefüllt. lParam kann jetzt auf (NMHDR*) gecastet werden (später auf (LPNMCUSTOMDRAW)). Damit hat man dann Zugriff auf die wichtigen Daten.

In meinem speziellen Fall kann ich mir jetzt die Weiterleitung an den Slider - Messagehandler sparen, da ich alles im Dialog machen kann.
Ich denke mir aber, daß man auch ein SendMessage() mit NM_CUSTOMDRAW aufrufen kann, bei dem lParam und wParam weitergereicht werden.

Jörg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum