用Beginpath,EndPath,SelectClipPath,我为什么不能画出想要的图形?

时间:2021-07-02 20:24:00
我有如下代码:
CDC *pDC= GetDC();
pDC->BeginPath ();
pDC->TextOut ( 100, 100, "WWWWWWW" );
pDC->EndPath ();

for ( int i =0; i < 50; i ++ )
{
pDC->MoveTo ( 100+3*i, 100 );
pDC->LineTo ( 100+3*i, 200 );
}
/**/
ReleaseDC(pDC);
为什么我设定的path没有效果??

16 个解决方案

#1


唉。。。怎么没人回答啊??

#2


在OnPaint或者OnDraw中:
    CClientDC  dc(this);
    dc.TextOut ( 100, 100, "WWWWWWW" );
    for ( int i =0; i < 50; i ++ )
    {
        dc.MoveTo ( 100+3*i, 100 );
        dc.LineTo ( 100+3*i, 200 );
    }

#3


我是想让我画的线,只出现在WWWWW字符串出现的path内,大和尚你怎么把它们俩个重叠画出来了???请问怎么能画出我要的效果??

#4


大家怎么都不进来啊?不会跟我说,都没用过吧。。。。天啊。。。大家猜一下,看我错在哪儿了也行啊。。。别都不说话啊。。。
CDC *pDC= GetDC();
CRgn rgn;
BOOL i = rgn.CreateRectRgn(50, 50, 200, 200);
/**/
int iResult = 0;
iResult = pDC->BeginPath ();
pDC->TextOut ( 100, 100, "WC" );
iResult = pDC->EndPath ();

iResult = pDC->SelectClipRgn ( NULL );
iResult = pDC->SelectClipPath (RGN_AND);
iResult = pDC->StrokeAndFillPath ();

rgn.DeleteObject ();
ReleaseDC(pDC);

可是出不来,帮帮忙,看一眼。。。:)

#5


1.用PathToRegion把DC中的路径转换成区域
2.用SelectClipRgn来说明DC的剪裁区域

#6


我没有用过SelectClipRgn ,SelectClipPath ,老兄开个讲座吧!
把我教会了说不定就可以帮忙了,呵呵

#7


回WhiteWaterBlueSky:
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???

#8


pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);

#9


回quace:
我在EndPath()之后用了这两句,可返回值还是0啊。。。
能不能多写同行代码,我最后一句用的是 pDC->StrokeAndFillPath ();
可WC两个字就是出不来。。。:(

#10


忘记了重要的一点!!!

并不是所有字体,由TextOut函数输出都能形成路径,
通常像宋体、楷体_GB2312等TrueType类型的字体才可以,

有一个简单的判断方法,当你打开字体选择对话框时,只有字体
前有T符号标记的,才是TrueType字体,当然在CFontDialog中可以
指定只显示TrueType字体!

所以以下代码经测试通过!

CDC* pDC = GetDC();
    
LOGFONT lf;
memset (&lf, 0, sizeof(lf));
strcpy (lf.lfFaceName, "楷体_GB2312");
lf.lfCharSet = GB2312_CHARSET;
lf.lfHeight = -MulDiv(64, ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72); 
HFONT hfont = ::CreateFontIndirect(&lf);
if (hfont == NULL)
{
AfxMessageBox ("CreateFontIndirect Failed!");
return;
}

HFONT holdfont = (HFONT) ::SelectObject(pDC->m_hDC, hfont);

pDC->BeginPath ();
pDC->TextOut ( 100, 100, "ABC" );
pDC->EndPath ();

HRGN hrgn = ::PathToRegion(pDC->m_hDC);
if (hrgn == NULL)
{
AfxMessageBox ("PathToRegion Failed!");
return;
}

::SelectClipRgn(pDC->m_hDC, hrgn);

::SelectObject(pDC->m_hDC, holdfont);

for ( int i =0; i < 50; i ++ )
{
       pDC->MoveTo ( 100+3*i, 100 );
       pDC->LineTo ( 100+3*i, 200 );
}

ReleaseDC(pDC);

#11


呵。。谢谢,谢谢。。。。WhiteWaterBlueSky,你说得对,可你是怎么想到的??
我怎么没注意到,是MSDN上写的嘛???
好了,我的分送给你了,不过想跟你再聊几句,如果你还在,请在10分钟内答,我每分钟refrensh一次,10分钟后我就结账了!!!!

还有,能告诉我你的mail嘛,呵。。。以后还想向你请教呢!!!

#12


Thanks!

seaman-zhou@china.com

#13


It should be spoken by me, it is very nice to meet you!!!

#14


呵。。。为什么我将最后画线的语句改成Fillpath()就不行了啊???

#15


呵。。。看来不在了,好吧!!我再看一会儿!!!

#16


这里要用
FillRgn(pDC->m_hDC, hrgn, (HBRUSH)::GetStockObject(WHITE_BRUSH));

最好在TextOut之前设置文本的背景模式
pDC->SetBkMode(TRANSPARENT);

#1


唉。。。怎么没人回答啊??

#2


在OnPaint或者OnDraw中:
    CClientDC  dc(this);
    dc.TextOut ( 100, 100, "WWWWWWW" );
    for ( int i =0; i < 50; i ++ )
    {
        dc.MoveTo ( 100+3*i, 100 );
        dc.LineTo ( 100+3*i, 200 );
    }

#3


我是想让我画的线,只出现在WWWWW字符串出现的path内,大和尚你怎么把它们俩个重叠画出来了???请问怎么能画出我要的效果??

#4


大家怎么都不进来啊?不会跟我说,都没用过吧。。。。天啊。。。大家猜一下,看我错在哪儿了也行啊。。。别都不说话啊。。。
CDC *pDC= GetDC();
CRgn rgn;
BOOL i = rgn.CreateRectRgn(50, 50, 200, 200);
/**/
int iResult = 0;
iResult = pDC->BeginPath ();
pDC->TextOut ( 100, 100, "WC" );
iResult = pDC->EndPath ();

iResult = pDC->SelectClipRgn ( NULL );
iResult = pDC->SelectClipPath (RGN_AND);
iResult = pDC->StrokeAndFillPath ();

rgn.DeleteObject ();
ReleaseDC(pDC);

可是出不来,帮帮忙,看一眼。。。:)

#5


1.用PathToRegion把DC中的路径转换成区域
2.用SelectClipRgn来说明DC的剪裁区域

#6


我没有用过SelectClipRgn ,SelectClipPath ,老兄开个讲座吧!
把我教会了说不定就可以帮忙了,呵呵

#7


回WhiteWaterBlueSky:
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???

#8


pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);

#9


回quace:
我在EndPath()之后用了这两句,可返回值还是0啊。。。
能不能多写同行代码,我最后一句用的是 pDC->StrokeAndFillPath ();
可WC两个字就是出不来。。。:(

#10


忘记了重要的一点!!!

并不是所有字体,由TextOut函数输出都能形成路径,
通常像宋体、楷体_GB2312等TrueType类型的字体才可以,

有一个简单的判断方法,当你打开字体选择对话框时,只有字体
前有T符号标记的,才是TrueType字体,当然在CFontDialog中可以
指定只显示TrueType字体!

所以以下代码经测试通过!

CDC* pDC = GetDC();
    
LOGFONT lf;
memset (&lf, 0, sizeof(lf));
strcpy (lf.lfFaceName, "楷体_GB2312");
lf.lfCharSet = GB2312_CHARSET;
lf.lfHeight = -MulDiv(64, ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72); 
HFONT hfont = ::CreateFontIndirect(&lf);
if (hfont == NULL)
{
AfxMessageBox ("CreateFontIndirect Failed!");
return;
}

HFONT holdfont = (HFONT) ::SelectObject(pDC->m_hDC, hfont);

pDC->BeginPath ();
pDC->TextOut ( 100, 100, "ABC" );
pDC->EndPath ();

HRGN hrgn = ::PathToRegion(pDC->m_hDC);
if (hrgn == NULL)
{
AfxMessageBox ("PathToRegion Failed!");
return;
}

::SelectClipRgn(pDC->m_hDC, hrgn);

::SelectObject(pDC->m_hDC, holdfont);

for ( int i =0; i < 50; i ++ )
{
       pDC->MoveTo ( 100+3*i, 100 );
       pDC->LineTo ( 100+3*i, 200 );
}

ReleaseDC(pDC);

#11


呵。。谢谢,谢谢。。。。WhiteWaterBlueSky,你说得对,可你是怎么想到的??
我怎么没注意到,是MSDN上写的嘛???
好了,我的分送给你了,不过想跟你再聊几句,如果你还在,请在10分钟内答,我每分钟refrensh一次,10分钟后我就结账了!!!!

还有,能告诉我你的mail嘛,呵。。。以后还想向你请教呢!!!

#12


Thanks!

seaman-zhou@china.com

#13


It should be spoken by me, it is very nice to meet you!!!

#14


呵。。。为什么我将最后画线的语句改成Fillpath()就不行了啊???

#15


呵。。。看来不在了,好吧!!我再看一会儿!!!

#16


这里要用
FillRgn(pDC->m_hDC, hrgn, (HBRUSH)::GetStockObject(WHITE_BRUSH));

最好在TextOut之前设置文本的背景模式
pDC->SetBkMode(TRANSPARENT);