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

Le
ringo973
Bonjour je souhaite obtenir le mme rsultat que la 2e fentre(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 cres 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))) // rservation mmoire
return;
if (!(pWndHeure=(CWnd**)malloc(sizeof(CWnd*)*nb_slider))) //
rservation mmoire
return;
if (!(pString=(CString**)malloc(sizeof(CString*)*nb_slider))) //
rservation mmoire
return;
if (!(heure_coupure=(int*)malloc(4*nb_slider))) // rservation
mmoire
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 diffrencier

(*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);


}
}
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