Windows中不规则窗体的编程实现
2010-07-01 20:43:05 来源:WEB开发网四、作图路径法创建”region”
使用该方法创建”region”的过程如下:
第一步绘制所要创建的窗体形状。
该步骤中使用到CDC类中的一些成员函数如下:BOOL CDC::BeginPath( );
调用该函数后当前设备环境(DC)开始追踪绘图的过程。
int CDC::SetBkMode( int nBkMode );
设置绘图时的背景模式,此应用中nBkMode必须取值为TRANSPARENT 。即设置绘图时背景不发生变化。
BOOL CDC::EndPath( );
调用该函数后当前设备环境(DC)结束追踪绘图的过程。
开始绘图前,先调用BeginPath,然后调用SetBkMode。接下去就可调用CDC的其他绘图函数作图,例如Arc,AngleArc,LineTo,MoveTo,RoundRect,,Textout等等。绘图完毕调用EndPath().
第二步将绘制的结果转成”region”.
此步骤中使用SDK API函数
HRGN PathToRegion( HDC hdc );
Hdc为作图DC的句柄, CDC类中的m_hDC成员变量可做此参数传入。示例,将下面代码加入某个按钮单击事件中,可以将当前窗体变为字符串”hello”的形状
void CTestDlg::OnTest()
{
HRGN wndRgn;
CClientDC dc(this);
CFont mFont;
if (dc.m_hDC!=NULL)
{
VERIFY(mFont.CreateFont(
200, 50, 0, 0, FW_HEAVY, TRUE, FALSE,
0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "宋体"));
//开始记录窗体轮廓路径
dc.BeginPath();
//设置背景为透明模式,这句话是必须有的。
dc.SetBkMode(TRANSPARENT);
CFont * pOldFont;
pOldFont = dc.SelectObject( &mFont );
dc.TextOut(0, 0, "Hello");
//结束记录窗体轮廓路径
dc.SelectObject( pOldFont );
dc.EndPath();
//把所记录的路径转化为窗体轮廓句柄
wndRgn = ::PathToRegion(dc.m_hDC);
//赋予窗体指定的轮廓形状
this->SetWindowRgn(wndRgn, TRUE);
}
}
CClientDC是CDC的派生类,故此该类具有所有CDC类的成员变量和成员函数。
图二 hello形状的窗体效果图
赞助商链接