ajout de couleurs pour des curseurs et des traits pour des sliders dynamiques

Le
ringo973
Bonjour je souhaite obtenir le même résultat que la 2e fenêtre(track
1) ici : http://www.codeproject.com/KB/miscctrl/CustomDrawCSliderCtrl.aspx
Je voudrais moi aussi obtenir des traits de couleurs et les curseurs
en couleur mais je n'arrive pas à adapter leur code au mien car moi
mes sliders sont crées dynamiquement, comment puis-je faire alors ?
Merci.

Mon code :


void CDlg_Demo_Slider::OnOK()
{
libere_slider();
CDialog::OnOK();
}


void CDlg_Demo_Slider::affich_slider()
{
CString strTemp;
int j;

if (!(pSliderCtrl=(CSliderCtrl**)malloc(sizeof(CSliderCtrl*)
*nb_slider))) // réservation mémoire
return;
if (!(pWndHeure=(CWnd**)malloc(sizeof(CWnd*)*nb_slider))) //
réservation mémoire
return;
if (!(pString=(CString**)malloc(sizeof(CString*)*nb_slider))) //
réservation mémoire
return;
if (!(heure_coupure=(int*)malloc(4*nb_slider))) // réservation
mémoire
return;

heure_min=48*60; heure_max=0;
for (j=0;j<nb_slider;j++)
{
if (nb_slider==1)
heure_coupure[j]=300+24*60;
else
heure_coupure[j]=240+24*60+(120*j)/(nb_slider-1);
if (heure_coupure[j]<heure_min)
heure_min=heure_coupure[j];
if (heure_coupure[j]>heure_max)
heure_max=heure_coupure[j];
}

for (j=0;j<nb_slider;j++)
{
RECT rect={20,20,20,20};
pSliderCtrl[j]=new CSliderCtrl();
pString[j]=new CString();



DWORD dwStyle = TBS_NOTICKS | WS_CHILD | WS_VISIBLE |
WM_HSCROLL ;

(*pSliderCtrl[j]).Create(dwStyle|TBS_BOTTOM|TBS_HORZ ,rect,
m_parametres,m_OK.GetDlgCtrlID()+(10000+j));

(*pSliderCtrl[j]).SetWindowPos(&m_OK,120,10+(j*20),
175,20,SWP_NOZORDER);
(*pSliderCtrl[j]).SetRange(0,heure_max-heure_min+60); // tranche
horaire
(*pSliderCtrl[j]).SetPos(heure_coupure[j]-heure_min+30); //retrait de
chq slider pour les différencier

(*pString[j]).Format("%02d:%02d",(heure_coupure[j]-24*60)/60,
(heure_coupure[j]-24*60)%60);

pWndHeure[j] = new CWnd;
pWndHeure[j]->Create(_T("STATIC"), *pString[j], WS_CHILD |
WS_VISIBLE ,
CRect(300, 10+j*20, 380, 30+j*20), this, 1234);


}
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
domi
Le #19346161
wrote:
Bonjour je souhaite obtenir le même résultat que la 2e fenêtre(track
1) ici : http://www.codeproject.com/KB/miscctrl/CustomDrawCSliderCtrl.aspx
Je voudrais moi aussi obtenir des traits de couleurs et les curseurs
en couleur mais je n'arrive pas à adapter leur code au mien car moi
mes sliders sont crées dynamiquement, comment puis-je faire alors ?



Ca ne change rien, il faut toujours traiter WM_NOTIFY et NM_CUSTOMDRAW
au niveau du controle parent
Et c'est exemple est plutot môche (il vaut mieux utiliser des bitmaps...)
ringo973
Le #19412451
Merci voici mon code du OnNotify et je ne possède pas de
NM_CUSTOMDRAW, comment utiliseriez vous les bitmaps avec mon code ?
Merci d'avance.

BOOL CDlg_Demo_Slider::OnHelpInfo(HELPINFO* pHelpInfo)
{
return CDialog::OnHelpInfo(pHelpInfo);
}

BOOL CDlg_Demo_Slider::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT*
pResult)
{
NMHDR* pnmh = (NMHDR*)lParam;
*pResult = TRUE;
static bool bReentrant = false;
int nPos ; int j,n;

unsigned int toto = pnmh->code;

if (pnmh->code == TTN_SHOW && !bReentrant)//TB_ENDTRACK
{
bReentrant = true;
char szText[80] = "";
TOOLINFO ti;
memset(&ti, 0, sizeof(ti));
ti.cbSize = sizeof(ti);
::SendMessage(pnmh->hwndFrom, TTM_ENUMTOOLS, 0, (LPARAM)
&ti ); //::SendMessage(pnmh->hwndFrom, TTM_GETTOOLINFO, 0, (LPARAM)
&ti);
ti.hinst = AfxGetInstanceHandle();
ti.lpszText = szText;
nPos = ::SendMessage(ti.hwnd, TBM_GETPOS, 0, 0);

if (nPos+heure_min-30>$*60)
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30-24*60) / 60, (nPos
+heure_min-30-24*60) % 60); //ajout d'espaces pour se décaler du
curseur souris
else
if (nPos+heure_min-30<0)
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30+24*60) / 60, (nPos
+heure_min-30+24*60) % 60); //ajout d'espaces pour se décaler du
curseur souris
else
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30) / 60, (nPos
+heure_min-30) % 60); //ajout d'espaces pour se décaler du curseur
souris
::SendMessage(pnmh->hwndFrom, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
bReentrant = false;

for (j=0;j<nb_slider;j++)
{
n=(*pSliderCtrl[j]).GetPos()+heure_min-30;
if (n!=heure_coupure[j])
dernier_modifie=j;
heure_coupure[j]=n;
}

for (j=0;j<nb_slider;j++)
{
if (heure_coupure[j]>$*60)
(*pString[j]).Format("%02d:%02d",(heure_coupure[j]-24*60)/60,
(heure_coupure[j]-24*60)%60);
else
if (heure_coupure[j]<0)
(*pString[j]).Format("%02d:%02d",(heure_coupure[j]+24*60)/60,
(heure_coupure[j]+24*60)%60);
else
(*pString[j]).Format("%02d:%02d",heure_coupure[j]/60,heure_coupure
[j]%60);

pWndHeure[j]->DestroyWindow();
pWndHeure[j]->Create(_T("STATIC"), *pString[j], WS_CHILD |
WS_VISIBLE ,
CRect(300, 10+j*20, 380, 30+j*20), this, 1234);
}

return TRUE;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
marc
Le #19413201
a écrit :
Merci voici mon code du OnNotify et je ne possède pas de
NM_CUSTOMDRAW,



Il faut le rajouter , il ne va pas se mettre tout seul !
Tout est dans MSDN, il suffit de suivre la doc.

LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh ->code)
{
case NM_CUSTOMDRAW:
{
//
ringo973
Le #19476861
Merci il faut donc que j'arrive à entrer ce bout de code :
void CDlg_Demo_Slider::SetColor(COLORREF cr)
{
m_crThumb = cr;

m_Brush.CreateSolidBrush( cr );
m_Pen.CreatePen( PS_SOLID, 1, RGB(128,128,128) );
}

afx_msg void CDlg_Demo_Slider::OnCustomDraw ( NMHDR * pNotifyStruct,
LRESULT* result )
{
NMCUSTOMDRAW nmcd = *(LPNMCUSTOMDRAW)pNotifyStruct;
if ( nmcd.dwDrawStage == CDDS_PREPAINT )
{
*result = CDRF_NOTIFYITEMDRAW ; return;
}
else if ( nmcd.dwDrawStage == CDDS_ITEMPREPAINT )
{
if ( nmcd.dwItemSpec == TBCD_THUMB )
{
CDC* pDC = CDC::FromHandle( nmcd.hdc );
pDC->SelectObject( m_Brush );
pDC->SelectObject( m_Pen );
pDC->Ellipse( &(nmcd.rc) );
pDC->Detach();
*result = CDRF_SKIPDEFAULT;
}
}
}


dans mon autre bout de code suivant (si j'ai bien compris?) :

BOOL CDlg_Demo_Slider::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT*
pResult)
{
NMHDR* pnmh = (NMHDR*)lParam;
*pResult = TRUE;
static bool bReentrant = false;
int nPos ; int j,n;

unsigned int toto = pnmh->code;

if (pnmh->code == TTN_SHOW && !bReentrant)//TB_ENDTRACK
{
bReentrant = true;
char szText[80] = "";
TOOLINFO ti;
memset(&ti, 0, sizeof(ti));
ti.cbSize = sizeof(ti);
::SendMessage(pnmh->hwndFrom, TTM_ENUMTOOLS, 0, (LPARAM)
&ti ); //::SendMessage(pnmh->hwndFrom, TTM_GETTOOLINFO, 0, (LPARAM)
&ti);
ti.hinst = AfxGetInstanceHandle();
ti.lpszText = szText;
nPos = ::SendMessage(ti.hwnd, TBM_GETPOS, 0, 0);

if (nPos+heure_min-30>$*60)
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30-24*60) / 60, (nPos
+heure_min-30-24*60) % 60);
else
if (nPos+heure_min-30<0)
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30+24*60) / 60, (nPos
+heure_min-30+24*60) % 60);
else
sprintf(szText, "%02d:%02d ", (nPos+heure_min-30) / 60, (nPos
+heure_min-30) % 60);
::SendMessage(pnmh->hwndFrom, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
bReentrant = false;

for (j=0;j<nb_slider;j++)
{
n=(*pSliderCtrl[j]).GetPos()+heure_min-30;
if (n!=heure_coupure[j])
dernier_modifie=j;
heure_coupure[j]=n;
}

for (j=0;j<nb_slider;j++)
{
if (heure_coupure[j]>$*60)
(*pString[j]).Format("%02d:%02d",(heure_coupure[j]-24*60)/60,
(heure_coupure[j]-24*60)%60);
else
if (heure_coupure[j]<0)
(*pString[j]).Format("%02d:%02d",(heure_coupure[j]+24*60)/60,
(heure_coupure[j]+24*60)%60);
else
(*pString[j]).Format("%02d:%02d",heure_coupure[j]/60,heure_coupure
[j]%60);

pWndHeure[j]->DestroyWindow();
pWndHeure[j]->Create(_T("STATIC"), *pString[j], WS_CHILD |
WS_VISIBLE ,
CRect(300, 10+j*20, 380, 30+j*20), this, 1234);
}

return TRUE;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
Publicité
Poster une réponse
Anonyme