创建非矩形对话框的简单方法

介绍 对话框通常是矩形的。可以采用多种方法使其在形状上非矩形。但是,这些方法中的大多数都很复杂,适合使用皮肤创建具有皮肤或图像形状的对话框的应用程序。如果对话框所需的形状很简单,比如圆角矩形或椭圆,那么可以使用更简单的方法。在这个方法中,创建多个CRgn对象,然后组合(区域的联合)来创建一个复合区域。对话框然后给出复合区域的形状。 的代码 所有需要的代码都在对话框的OnInitDialog方法中 步骤1:设置对话框样式 为了改变对话框的形状,在对话框的OnInitDialog中,对话框的标题和边框被删除。隐藏,复制Code

 ...
//  Remove caption and border
SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE)
     & (~(WS_CAPTION | WS_BORDER)));
...

步骤2:创建单独的区域 然后使用对话框的windowHide坐标创建单个的椭圆区域。复制Code

//  Get the rectangle
CRect rect;
GetWindowRect(&rect);
int w = rect.Width();
int h = rect.Height();

CRgn rgn1;
CRgn rgn2;

//  Create the top ellipse
rgn1.CreateEllipticRgn(1, 1, w, h/2 + 30);

//  Create the bottom ellipse
rgn2.CreateEllipticRgn(1, h/2 - 30, w, h);

步骤3:将这些区域合并为一个区域 这些区域被组合成一个单独的区域。这种结合实际上是所有独立区域的结合。复制Code

//  Combine the two ellipses
CombineRgn(rgn1, rgn1, rgn2, RGN_OR);

步骤4:改变对话框的形状到区域 对话框的形状可以使用下面的代码隐藏来更改复制Code

//  Set the window region
SetWindowRgn(static_cast<HRGN>(rgn1.GetSafeHandle()), TRUE);

第五步:清理 CRgn对象需要与区域分离,否则当rgn对象离开scopeHide时,CRgn析构器会关闭HRGN句柄。复制Code

rgn1.Detach();
rgn2.Detach();

历史 初始版本 本文转载于:http://www.diyabc.com/frontweb/news3570.html

原文地址:https://www.cnblogs.com/Dincat/p/13461152.html