Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
ringo973
Bonjour je souhaite obtenir le m=EAme r=E9sultat que la 2e fen=EAtre(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 =E0 adapter leur code au mien car moi
mes sliders sont cr=E9es 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=3D(CSliderCtrl**)malloc(sizeof(CSliderCtrl*)
*nb_slider))) // r=E9servation m=E9moire
return;
if (!(pWndHeure=3D(CWnd**)malloc(sizeof(CWnd*)*nb_slider))) //
r=E9servation m=E9moire
return;
if (!(pString=3D(CString**)malloc(sizeof(CString*)*nb_slider))) //
r=E9servation m=E9moire
return;
if (!(heure_coupure=3D(int*)malloc(4*nb_slider))) // r=E9servation
m=E9moire
return;

heure_min=3D48*60; heure_max=3D0;
for (j=3D0;j<nb_slider;j++)
{
if (nb_slider=3D=3D1)
heure_coupure[j]=3D300+24*60;
else
heure_coupure[j]=3D240+24*60+(120*j)/(nb_slider-1);
if (heure_coupure[j]<heure_min)
heure_min=3Dheure_coupure[j];
if (heure_coupure[j]>heure_max)
heure_max=3Dheure_coupure[j];
}

for (j=3D0;j<nb_slider;j++)
{
RECT rect=3D{20,20,20,20};
pSliderCtrl[j]=3Dnew CSliderCtrl();
pString[j]=3Dnew CString();



DWORD dwStyle =3D 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=E9rencier

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

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


}
}

4 réponses

Avatar
domi
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...)
Avatar
ringo973
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);
}
Avatar
marc
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:
{
//
Avatar
ringo973
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);
}