社区
Windows SDK/API
帖子详情
如何实现这样窗体
良鹿
2003-07-26 09:25:34
就是一个窗体的四角成椭圆型
...全文
29
4
打赏
收藏
如何实现这样窗体
就是一个窗体的四角成椭圆型
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
FrameSniper
2003-07-26
打赏
举报
回复
呵呵......
xybh97102
2003-07-26
打赏
举报
回复
楼上的很经典
雨后阳光2000
2003-07-26
打赏
举报
回复
用API函数在DELPHI中实现“非典型”窗体
现在的一些共享软件特别是一些多媒体播放器软件为了吸引用户,很注重程序界面的设计。实际上,我们使用API函数也可以实现那些好看又另类的效果。
1.异形窗体
窗体只能是方的吗?不是,还可以有其他形状。这要用到两个Win32 API函数。首先用CreateRoundRectRgn()函数在窗体内界定一个椭圆形区域。这里所指的区域(region)是一个特殊的API对象,我们可以在区域内部进行填充和剪裁等操作,从而定义窗体的外部特征。然后调用SetWindowRgn()函数绘制,更进一步还可以再用CombineRgn()函数来合并多个区域,例如在Delphi的单元文件中加入以下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
FRegion1:THandle;
FRegion2:THandle;
begin
FRegion1:=CreateRoundRectRgn(20,20,200,200,300,300);//界定一个椭圆区域
FRegion2:=CreateRectRgn(170,170,400,400);//界定一个矩形区域
CombineRgn(FRegion1,FRegion1,FRegion2,RGN_OR);//将两个区域连接起来
SetwindowRgn(handle,FRegion1,True);//对连接后的区域进行绘制
end;
程序段中的CreateRoundRectRgn()函数用来创建一个圆角矩形区域,它的原型为:
HRGN CreateRoundRectRgn(
int nLeftRect, // 左上角的X坐标
int nTopRect, // 左上角的Y坐标
int nRightRect, // 右下角的X坐标
int nBottomRect, // 右下角的Y坐标
int nWidthEllipse, //圆角所在椭圆的宽
int nHeightEllipse // 圆角所在椭圆的高
);
其他图形如多边形、椭圆形等都有对应的API函数,它们的原型如下:
HRGN CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateEllipticRgnIndirect( CONST RECT *lprc)
HRGN CreatePolygonRgn(CONST POINT *lppt,int cPoints, int fnPolyFillMode)
HRGN CreatepolypolygonRgn(CONST POINT *lppt,CONST INT *lpPolyCounts,int nCount,int fnPolyFillMode)
HRGN CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect)
HRGN CreateRectRgnIndirect(CONST RECT *lprc)
以上函数的参数很好理解,用来说明图形内置矩形的坐标或指向该矩形。重点来看一下另外两个函数:
函数原型:SetWindowRgn(
HWND hWnd, //当前窗体的句柄
HRGN hRgn, //当前区域的句柄
BOOL bRedraw, //重绘标志
)
函数功能:该函数把已创建的区域的句柄作为参数传递给当前窗体的句柄,并在该区域范围内绘制窗体;
函数原型:CombineRgn(
HRGN hrgnDest, // 连接目的区域的句柄
HRGN hrgnSrc1, // 第一个连接源区域的句柄
HRGN hrgnSrc2, // 第二个连接源区域的句柄
int fnCombineMode // 连接模式
)
函数功能:该函数将两个区域合并为一个新的区域,其中连接模式可取以下值:
参数值 作用
RGN_AND 由区域1与区域2的共有部分即交集创建新的区域
RGN_COPY 创建区域1的副本作为新的区域
RGN_DIFF 连接属于区域1但不属于区域2的部分为新的区域
RGN_OR 连接区域1和区域2的所有部分即并集
RGN_XOR。 连接区域1和区域2的所有部分即并去掉共有部分
2.空心窗体
这种窗体的特点是好端端的一个窗体,中间被挖了一部分。例如在Delphi的单元文件中加入以下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
FRegion3:THandle;
begin
Canvas.Font.Name:='华文行楷';//设置字体
Canvas.Font.Size:=100;//设置字号
BeginPath(Canvas.Handle); //得到vanvas上绘制的轮廓
TextOut(form1.Canvas.Handle,0,20,'程序春秋',8);//将“程序春秋”四个字所占区域抠掉
EndPath(Canvas.Handle);
FRegion3:=PathToRegion(Canvas.Handle);//将以上区域赋给窗体
SetwindowRgn(Handle,FRegion3,True);//开始绘制
end;
这里主要用到了三个API函数:
函数原型:BOOL BeginPath(HDC hdc //设备环境的句柄)
函数功能:开始接收当前设备环境的路径轨迹;
函数原型:BOOL EndPath(HDC hdc //设备环境的句柄)
函数功能:停止接收并将已接收的路径轨迹赋给当前设备环境的句柄
函数原型 BOOL TextOut(
HDC hdc, // handle of device context
int nXStart, // 起始位置的X坐标
int nYStart, // 起始位置的Y坐标
LPCTSTR lpString, // 字符串地址
int cbString //字符串所包含字符数(注意一个汉字占两个字符)
)
函数功能:在指定位置绘制给定字符串。
ffwin
2003-07-26
打赏
举报
回复
找控件
Winform中如何
实现
子
窗体
刷新父
窗体
本文介绍了在Winform应用中,如何通过委托和事件来
实现
子
窗体
关闭或操作后刷新父
窗体
显示。详细步骤包括定义子
窗体
中的委托和事件,以及父
窗体
的刷新方法,并展示了在按钮事件中调用这些方法的代码片段,整个过程简洁易懂。
Winform&C# 关于嵌套
窗体
的
实现
博客介绍了点击某功能在指定位置展示指定窗口的
实现
。先给出效果图,接着阐述具体
实现
过程,包括预先准备作为父
窗体
的panel控件,准备要展示的
窗体
并调用关闭和打开
窗体
的方法,最后创建
窗体
对象,按顺序调用方法
实现
功能。
MFC无边框的
窗体
实现
用鼠标拖动
窗体
边缘
实现
窗体
大小变化
本文介绍了如何在MFC无边框
窗体
中通过鼠标拖动
窗体
边缘
实现
大小变化。主要涉及两个步骤:一是
实现
WM_NCHITTEST消息,模拟四条边框;二是
实现
WM_NCLBUTTONDOWN,发送
窗体
拖曳大小改变的消息。此外,还讨论了如何在程序中控制拖动时是否显示窗口内容,而不依赖于操作系统的设置。
C WinForm 子
窗体
调用父
窗体
函数
实现
窗体
切换
该博客介绍了在C# WinForm应用程序中,子
窗体
调用父
窗体
函数
实现
窗体
切换的方法。通过在父
窗体
嵌入Panel控件,在其中载入子
窗体
,点击子
窗体
按钮可清除当前内容并载入新
窗体
。还给出
实现
步骤、使用说明和注意事项。
WPF
实现
类似MDI子
窗体
的功能
本文介绍了在WPF中
实现
类似MDI子
窗体
的功能。此前用UserControl作为“MDI子
窗体
”,现发现Extended WPF Toolkit里的ChildWindow可作子
窗体
。还给出
实现
步骤,包括下载开源免费的Community Edition,新建工程添加引用,在主
窗体
添加引用,用WindowContainer作子
窗体
容器等。
Windows SDK/API
1,184
社区成员
22,326
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章