アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++、Win32APIで作っています。
ウィンドウにいくつかの線を書き、その後ドラッグした範囲(四角い)の線の始めと終わりの点だけを反転させるプログラムを組みたいのですが、どのようにすればよいのでしょうか?
線を書くところまではできるのですが、ドラッグした範囲のみ反転の仕方がわかりません。
よろしくお願いします。

A 回答 (3件)

判定逆でしたね。


if (x>=X1 && x<=X2 && y>=Y1 && y<=Y2)
{
hPen=CreatePen(PS_SOLID,1,反転色値);
SelectObject(hPen);
PolyLine(x,y);
}
else
{
hPen=CreatePen(PS_SOLID,1,標準色値);
SelectObject(hPen);
PolyLine(x,y);
}
DeleteObject(hPen);

とできますが、もし線分上の1点でも拾えば・・・という条件
ならば

for (i=x1,j=(x2-x1)/(y2-y1);i<=x2;i++)
{
if (!(i % j) & i) j++;
if (i>=X1 && i<=X2 && j>=Y1 && j<=Y2)
{
hPen=CreatePen(PS_SOLID,1,反転色値);
SelectObject(hPen);
PolyLine(x,y);
}
else
{
hPen=CreatePen(PS_SOLID,1,標準色値);
SelectObject(hPen);
PolyLine(x,y);
}
DeleteObject(hPen);
}

でした。
    • good
    • 0

#1です。


すみません勘違いでした。

その線分 (x1,y2)-(x2,y2) の始終点座標(x,y)は分かっているものとすれば、
ドラッグ範囲 (X1,Y1)-(X2,Y2) において

if (x>=X1 && x<=X2 && y>=Y1 && y<=Y2)
{
hPen=CreatePen(PS_SOLID,1,標準色値);
SelectObject(hPen);
PolyLine(x,y);
}
else
{
hPen=CreatePen(PS_SOLID,1,反転色値);
SelectObject(hPen);
PolyLine(x,y);
}
DeleteObject(hPen);

とできますが、もし線分上の1点でも拾えば・・・という条件
ならば

for (i=x1,j=(x2-x1)/(y2-y1);i<=x2;i++)
{
if (!(i % j) & i) j++;
if (i>=X1 && i<=X2 && j>=Y1 && j<=Y2)
{
hPen=CreatePen(PS_SOLID,1,標準色値);
SelectObject(hPen);
PolyLine(x,y);
}
else
{
hPen=CreatePen(PS_SOLID,1,反転色値);
SelectObject(hPen);
PolyLine(x,y);
}
DeleteObject(hPen);
}

でしょうか。
    • good
    • 0

線分(X1,Y1)-(X2,Y2) のおいて



CreatePen関数で作成した標準色ペンを適用し
PolyLine関数で、
(X1+1,Y1)-(X2-1,Y1)
(X2,Y1+1)-(X2,Y2-1)
(X2-1,Y2)-(X+1,Y2)
(X1,Y2-1)-(X1,Y1+1)
の順で線画して
次に
CreatePen関数で作成した反転色(標準色 XOR 0xffffffff)ペンを
適用し
PolyLine関数で、
(X1,Y1)
(X2,Y2)
とやればいきますが・・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!