Par exemple, pour tracer un trait (en BC3 ou 5, c'est pas du C++)
void TraceTraitHoriz(HDC hdcD, short yPos)
{
// Trace un trait horizontal entre les axes gauche et droit de l'écran
// à la position yPos si visible à l'écran
if ((yPos >= haut) && (yPos <= bas))
{
MoveToEx(hdcD, gauche, yPos, NULL);
LineTo(hdcD, droite + 1, yPos); // Line ne trace pas le dernier pixel
}
}
// fin de module TraceTraitHoriz
haut et bas sont les valeurs (en pixel) des bornes que je me suis fixé dans mon cadre "dessin".
Avant l'appel, je fais
HDC hdcD;
int rop;
short StylTrait;
HPEN hPen, hPenOld;
hdcD = GetDC(hWnd);
switch (iStyl) // trait continu, pointillé, ...
{
case 0:
StylTrait = PS_DOT; // POINTILLE
break;
case 1:
StylTrait = PS_SOLID; // PLEIN
break;
case 2:
StylTrait = PS_NULL; // RIEN
}
hPen = CreatePen(StylTrait, 1, CoulTraitCurs);
hPenOld = (HPEN)SelectObject(hdcD, hPen);
rop = SetROP2(hdcD, R2_NOTXORPEN);
et à la fin
SetROP2(hdcD, rop);
SelectObject(hdcD, hPenOld);
DeleteObject(hPen);
ReleaseDC(hWnd, hdcD);
}
Si x,y début et x,y fin sont différents, on peut tracer dans tous les sens
.
Attention si on veut un trait très large : si on change l'épaisseur, les bouts "deviennent" ronds. A la place, faut dessiner un rectangle.
void Trait_Ou_Rect(HDC hdcT, short iEp, short iLeft, short iTop, short iRight, short iBottom, long lCouleur, BOOL Vertic)
{
// Trace un trait si épaisseur unitaire, ou rectangle sinon
if (iEp > 1)
{ // Trace Rectangle car trait d'Ep > 1 bouts arrondis
LOGBRUSH lb;
HBRUSH hbr, hbrOld;
lb.lbStyle = BS_SOLID;
lb.lbColor = lCouleur;
hbr = CreateBrushIndirect(&lb);
hbrOld = (HBRUSH)SelectObject(hdcT, hbr);
Rectangle(hdcT, iLeft, iTop, iRight, iBottom);
SelectObject(hdcT, hbrOld);
DeleteObject(hbr); // détruit hBrush
}
else
{ // trace trait simple
MoveToEx(hdcT, iLeft, iTop, NULL);
if (Vertic == VERTICAL)
LineTo(hdcT, iLeft, iBottom);
else // HORIZONTAL
LineTo(hdcT, iRight, iTop);
}
}
// fin du module Trait_Ou_Rect
Sais pas si ça répond à la question
.