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 );
}
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);
可是出不来,帮帮忙,看一眼。。。:)
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的剪裁区域
2.用SelectClipRgn来说明DC的剪裁区域
#6
我没有用过SelectClipRgn ,SelectClipPath ,老兄开个讲座吧!
把我教会了说不定就可以帮忙了,呵呵
把我教会了说不定就可以帮忙了,呵呵
#7
回WhiteWaterBlueSky:
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???
#8
pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);
pDC->SelectClipPath(RGN_COPY);
#9
回quace:
我在EndPath()之后用了这两句,可返回值还是0啊。。。
能不能多写同行代码,我最后一句用的是 pDC->StrokeAndFillPath ();
可WC两个字就是出不来。。。:(
我在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);
并不是所有字体,由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嘛,呵。。。以后还想向你请教呢!!!
我怎么没注意到,是MSDN上写的嘛???
好了,我的分送给你了,不过想跟你再聊几句,如果你还在,请在10分钟内答,我每分钟refrensh一次,10分钟后我就结账了!!!!
还有,能告诉我你的mail嘛,呵。。。以后还想向你请教呢!!!
#12
Thanks!
seaman-zhou@china.com
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);
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 );
}
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);
可是出不来,帮帮忙,看一眼。。。:)
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的剪裁区域
2.用SelectClipRgn来说明DC的剪裁区域
#6
我没有用过SelectClipRgn ,SelectClipPath ,老兄开个讲座吧!
把我教会了说不定就可以帮忙了,呵呵
把我教会了说不定就可以帮忙了,呵呵
#7
回WhiteWaterBlueSky:
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???
我试了一下,可PathToRegion()得到的Handle为NULL
我是在EndPath()之后用的,请问对嘛???
#8
pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);
pDC->SelectClipPath(RGN_COPY);
#9
回quace:
我在EndPath()之后用了这两句,可返回值还是0啊。。。
能不能多写同行代码,我最后一句用的是 pDC->StrokeAndFillPath ();
可WC两个字就是出不来。。。:(
我在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);
并不是所有字体,由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嘛,呵。。。以后还想向你请教呢!!!
我怎么没注意到,是MSDN上写的嘛???
好了,我的分送给你了,不过想跟你再聊几句,如果你还在,请在10分钟内答,我每分钟refrensh一次,10分钟后我就结账了!!!!
还有,能告诉我你的mail嘛,呵。。。以后还想向你请教呢!!!
#12
Thanks!
seaman-zhou@china.com
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);
FillRgn(pDC->m_hDC, hrgn, (HBRUSH)::GetStockObject(WHITE_BRUSH));
最好在TextOut之前设置文本的背景模式
pDC->SetBkMode(TRANSPARENT);