介绍 对话框通常是矩形的。可以采用多种方法使其在形状上非矩形。但是,这些方法中的大多数都很复杂,适合使用皮肤创建具有皮肤或图像形状的对话框的应用程序。如果对话框所需的形状很简单,比如圆角矩形或椭圆,那么可以使用更简单的方法。在这个方法中,创建多个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