MFC 不规则窗口 SetWindowRgn

有时候,我们需要使用到不规则窗口,比如一个圆形的对话框,或者一个三角形的对话框,这个时候,我们就可以通过使用SetWindowRgn来设置对话框的形状。

其实,当我们不设置窗口形状的时候,windows默认设置窗口形状为矩形了。

可以再OnInlitDialog中添加下列代码:

CRgn rgn;     //建立一个CRgn
 rgn.CreateEllipticRgn(50,50,200,200); //建立一个圆形区域,区域是以窗口矩形为参考的,窗口矩形左上角是(0,0),包括了框架。
 
 this->SetWindowRgn((HRGN)rgn.m_hObject,TRUE);   //设置窗口形状为刚才生成的形状

 rgn.DeleteObject();    //删除区域对象,要删除,不然内存会泄露,报错。

运行效果图:我是在一个按钮函数中生成的一个对话框,这个对话框背景色被设置为了蓝色。生成的对话框已经没有了边框,只有2个按钮。

这种情况还是在自己需要的地方才使用,如果没有了框架,需要自己去处理鼠标拖动窗口。

当这种没有框架的窗口生成后,我们会发现不能拖动窗口,为了让鼠标能自由拖动窗口,就需要我们在WM_LBUTTONDOWN消息中加上以下代码:

PostMessage(WM_NCLBUTTONDOWN,   HTCAPTION,   MAKELPARAM(point.x,   point.y));  

比如:

void Dialog1::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 PostMessage(WM_NCLBUTTONDOWN,   HTCAPTION,   MAKELPARAM(point.x,   point.y));  
 CDialog::OnLButtonDown(nFlags, point);
}

然后再运行,就发现,在不规则对话框中点击鼠标左键,就可以自由拖动了。如图,能拖动后的:

这种方法的运行,可以用在一些桌面小插件上:比如天气预报,时钟等~

 

 

 

 

你可能感兴趣的:(MFC窗口风格)