Bonjour,


je suis actuellement en train de r�aliser un lecteur multim�dia en C++.
J'utilise pour l'interface graphique les MFC, �paul� par l'�diteur graphique de ressources de visual studio 2005.
Pour la lecture, j'utilise directshow (enfin VMR9 qui est un wrapper mais ca change presque rien).
Mon probl�me est le suivant :
Pour r�aliser l'interface graphique, comme je l'ai dit plus haut j'utilise l'�diteur de ressources. Cette interface est compos�e d'une fen�tre dans laquelle j'ai ajout� une barre de menu en haut (qd on cr�e un projet MFC ds VS2005 ca le met automatiquement), une DialogBar juste en dessous contenant un bouton et le fameux slider, puis enfin d'une zone dans laquelle s'affiche la vid�o. Le slider doit se d�placer lorsque le fichier est en cours de lecture et doit aussi permettre de changer la position de lecture.

Le gros probl�me est que , comme je l'ai cr�e graphiquement avec l'�diteur de ressources, je n'ai pas cr�e le slider � la main en faisant (c'est comme ca que je l'ai vu sur certains tutos) :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
 
CSliderCtrl m_objSeekBar;
Je ne peux pas manipuler le slider directement en faisant :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
 
m_objSeekBar.SetPos(sliderTick);
m_objSeekBar.GetPos();
m_objSeekBar.SetRange(0,100);
...etc...
En effet, en regardant de plus pr�s le code produit par l'�diteur graphique (fichier .rc), ca ressemble � ca :
IDD_DIALOGBAR DIALOGEX 0, 0, 330, 26
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,137,7,133,15 //ici !
PUSHBUTTON "Play",IDC_PLAY,10,7,50,14
PUSHBUTTON "Bouger",IDC_BUTTON1,75,7,50,14
END

Il n'y a donc pas cr�ation d'objet que je peux manipuler.
J'ai essay� de rem�dier � ca en utilisant un code que j'avais trouv� ailleurs et qui est cens� contourner ce probl�me (voir m�thodes OnTimer et OnNMReleasedcaptureSlider1, je met tout pour le contexte):
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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
 
// MainFrm.cpp : implémentation de la classe CMainFrame
//
 
#include "stdafx.h"
#include "Superjoe MPv3.h"
 
#include "MainFrm.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
 
// CMainFrame
 
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_WM_SETFOCUS()
	ON_COMMAND(ID_FICHIER_OPEN, &CMainFrame::OnFichierOpen)
	ON_COMMAND(ID_ACTIONS_PLAY, &CMainFrame::OnActionsPlay)
	ON_BN_CLICKED(IDC_PLAY, &CMainFrame::OnBnClickedPlay)
	ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, &CMainFrame::OnNMReleasedcaptureSlider1)
	ON_BN_CLICKED(IDC_BUTTON1, &CMainFrame::OnBnClickedButton1)
END_MESSAGE_MAP()
 
static UINT indicators[] =
{
	ID_SEPARATOR,           // indicateur de la ligne d'état
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};
 
 
// construction ou destruction*de CMainFrame
 
CMainFrame::CMainFrame()
{
	// TODO : ajoutez ici le code d'une initialisation de membre
}
 
CMainFrame::~CMainFrame()
{
}
 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	// créer une vue de manière qu'elle occupe la zone cliente du frame
	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
	{
		TRACE0("Impossible de créer la fenêtre d'affichage\n");
		return -1;
	}
 
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Impossible de créer la barre d'état\n");
		return -1;      // échec de la création
	}
 
	if (!m_wndDlgBar.Create(this, IDD_DIALOGBAR, 
		CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
	{
		TRACE0("Failed to create dialogbar\n");
		return -1;		// fail to create
	}
	m_graph.SetMediaWindow(m_wndView.GetSafeHwnd());
 
	return 0;
}
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO : changez ici la classe ou les styles Window en modifiant
	//  CREATESTRUCT cs
 
	cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
	cs.lpszClass = AfxRegisterWndClass(0);
	return TRUE;
}
 
 
// diagnostics pour CMainFrame
 
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}
 
void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}
 
#endif //_DEBUG
 
 
// gestionnaires de messages pour CMainFrame
 
void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)
{
	// passe le focus à la fenêtre d'affichage
	m_wndView.SetFocus();
}
 
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	// laisser la priorité à la vue pour cette commande
	if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;
 
	// sinon, la gestion par défaut est utilisée
	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
 
 
 
void CMainFrame::OnFichierOpen()
{
	// TODO : ajoutez ici le code de votre gestionnaire de commande
	CFileDialog fileDlg(TRUE,
						NULL,
						NULL,
						OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
						"All Media Files|*.jpg;*.jpeg;*.gif;*.tga;*.bmp;*.dib;*.avi;*.divx;*.mpg;*.mpeg|Images Files|*.jpg;*.jpeg;*.gif;*.tga;*.bmp;*.dib;*.png|Videos Files|*.avi;*.divx;*.mpg;*.mpeg|All Files|*.*||",
						this);
	if (fileDlg.DoModal() == IDOK) {
		m_graph.SetMediaFile(fileDlg.GetPathName(), 0);
		m_graph.SetLayerZOrder(0, 0);
		m_graph.m_pMediaSeeking->GetDuration(&m_fileDuration);
	}
}
 
void CMainFrame::OnActionsPlay()
{
	// TODO : ajoutez ici le code de votre gestionnaire de commande
	m_graph.PlayGraph();
}
 
void CMainFrame::OnBnClickedPlay()
{
	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
	m_graph.PlayGraph();
}
 
void CMainFrame::OnTimer(UINT nIDEvent)
{  //pour faire bouger le slider en fonction de la position de lecture du fichier
	LONGLONG timeNow;
	m_graph.m_pMediaSeeking->GetCurrentPosition(&timeNow);
	long sliderTick = (long)((timeNow * 100) / m_fileDuration);
	CSliderCtrl *pSlider=static_cast<CSliderCtrl *>(GetDlgItem(IDC_SLIDER1));
	//CWnd* slid=GetDlgItem(IDC_SLIDER1);   ne marche pas non+
	((CSliderCtrl*)slid)->SetRange(0,100);
 
	((CSliderCtrl*)slid)->SetPos(sliderTick);
}
 
 
void CMainFrame::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)  //bouger le slider pour modifier postion de lecture(contraire precedent)
{
	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
	CSliderCtrl *pSlider=static_cast<CSliderCtrl *>(GetDlgItem(IDC_SLIDER1));
 
 
	// CWnd* slid=GetDlgItem(IDC_SLIDER1); ne marche pas non+
	int n= ((CSliderCtrl*)slid)->GetPos();
	m_graph.SetPos(n*10000000);    //surement pas tres correct, c'est juste pour tester pr l'instant
	*pResult = 0;
 
}
 
void CMainFrame::OnBnClickedButton1()
{
	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
	LONGLONG temps = 60*10000000; //60 est le tps en sec, 10000000 pr le mettre en 100eme de nanosec
	m_graph.SetPos(temps);
}
Cependant lorsque je bouge le curseur, avec ou sans lecture d'un fichier, je me retrouve avec une erreur :
Exception non g�r�e � 0x68fcf60a (mfc80d.dll) dans Superjoe MPv3.exe*: 0xC0000005: Violation d'acc�s lors de la lecture de l'emplacement 0x00000020.

Si j'enl�ve le code des m�thodes OnNMReleasedcaptureSlider1 et OnTimer, je peux bouger le slider mais il ne se passe rien (normal^^).

Quelqu'un saurait il donc comment utiliser correctement le slider en le cr�ant uniquement avec l'�diteur de ressources ^^?
D�sol� s'il ya de grosses bourdes dans le code, je n'excelle pas encore en C++ , encore moins sur les MFC ^^
Merci de vos r�ponses !