问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

不规则窗体是怎样创建的

发布网友 发布时间:2022-04-23 12:46

我来回答

3个回答

热心网友 时间:2023-07-15 01:37

创建不规则窗体经验总汇- -

很多人都很热衷于创建形状奇怪的窗体。而且不断的有热心的家伙们将他们的发现放到我们这里与大家分享。今天我将我所知道的方法总结一下。希望对大家有所帮助。
一般来说,要创建一个不规则的窗体。我们需要使用一个Win32 API: SetwindowRgn。这个API您可以在Api浏览器中找到。这个Api的作用就是将窗体的“剪”成一个指定的形状。下面是这个Api声明于解释:
Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
它有三个参数。
第一个(hWnd)是用来指定被剪切的对象的句柄,比如Picture图形框等, 我们一般就是用窗体的hWnd属性;
第二个(hRgb)指明剪切的形状, 即指定的几何图形特征, 此参数也必须由相应的API 函数提供说明。用那些APi可以创建一个您想要的区域(窗体的形状)。然后这些Api会返回一个数值。这个数值就是这个形状在Windows中的句柄(可以理解为身份证号码)。SetWindowsRgn可以通过这个数值来找到我们创建的那个区域;
第三个(bRedraw)是一个布尔变量, 一般可设置为真(True)。

看来仅仅有SetWindowsRgn还不行。我们还必须创建一个区域。创建区域可以使用如下的一些Api:
CreateRectRgn : 建立矩形区域,其参数分别为矩形的左上角坐标及右下角坐标。但是由于窗体默认就是一个矩形,所我们应该用不到它;

CreateRoundRectRgn:建立圆角矩形区域,其参数分别为左上角及右下角坐标, 还有圆角直径等, 当圆角直径接近或超过矩形的长度时, 将呈现为圆或椭圆形;

CreateEllipticRgn :建立椭圆矩形区域,参数分别椭圆的约束矩形左上角与左下角顶点的坐标;;

所以现在我们就可以创建一下形状比较简单的窗体了。比如下面的代码我们就创建了一个椭圆形的窗体:

Option Explicit
'Win32 Api 的声名
Private Declare Function CreateEllipticRgn Lib "gdi32" Alias "CreateEllipticRgn" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Sub Form_Load()
Dim Result As Long '声明变量用于保存“区域”的句柄
Me.Show
Result = CreateEllipticRgn(0, 0, 300, 200) '创建“区域”并将其句柄保存到变量中
SetWindowRgn Me.Hwnd, Result, True '根据前面创建的区域对窗体进行“剪裁”
End Sub

但是你要说,我想创建的窗体是一个人的形状或者是其他的不规则的形状呀!是的,上面的方法只能创建一些简单的几何图形。创建比较复杂形状的窗体我们仍然需要使用SetWindowRgb这个Api来对窗体进行“剪裁”。但是我们需要用其它的Api来创建复杂的“区域”。一般的,我们会用到下面的Api。这些Api配合使用就会得到复杂形状的区域。从而我们可以使用SetWindowRgb裁出窗体。

CreatePolygonRgn : 用于通过连接各个点来创建一个区域

CombineRgn: 用于对两个区域进行运算。比如合并两个区域或这是将两个区域相减、求交集等等。

下面我们来详细的介绍一下这两个Api:
CreatePolygonRgb

Declare Function CreatePolygonRgn Lib "gdi32" Alias "CreatePolygonRgn" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long

参数一(lpPoint): POINTAPI类型的变量。POINTAPI是一个用于描述点坐标的结构。他有两个成员x与y。您可以在Api浏览器中找到它。在这里我们需要一个数组,并将这个属组的第一个元素作为这里的参数。
参数二(nCount): 区域顶点的个数。比如一个三角形的区域有三个顶点。我们应该根据这个参数来确定上一个参数使用的数组的大小;
参数三(nPolyFillMode): 指定区域的填充模式。我们可以使用两个常量作为参数:ALTERNATE和WINDING。这两个常量可以在Api浏览器中找到。我们在这里可以直接使用1.

CombineRgb
Declare Function CombineRgn Lib "gdi32" Alias "CombineRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long

参数一(hDestRgn): 目标区域的句柄;
参数二(hSrcRgn1): 源区域一的句柄;
参数三(hScrRgn2): 源区域二的句柄。
参数四(nCombineMode): 合并模式。我们可以在Api浏览器中到这些常量作为它的参数:
RGN_AND
Creates the intersection of the two combined regions.
RGN_COPY
Creates a copy of the region identified by hrgnSrc1.
RGN_DIFF
Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.
RGN_OR
Creates the union of two combined regions.
RGN_XOR
Creates the union of two combined regions except for any overlapping areas.

好了,下面我们来创建一个沙漏形的区域。

Option Explicit
'Win32 API的声明
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Type POINTAPI
x As Long
y As Long
End Type

Private Sub Form_Load()
'声明变量
Dim Result As Long
Dim Points(5) As POINTAPI

'更改窗体大小
With Me
.Width = 5000
.Height = 10000
End With

'将区域的顶点坐标存入变量
Points(0).x = 0
Points(0).y = 0
Points(1).x = 300
Points(1).y = 0
Points(2).x = 175
Points(2).y = 300
Points(3).x = 300
Points(3).y = 600
Points(4).x = 0
Points(4).y = 600
Points(5).x = 125
Points(5).y = 300

'创建区域
Result = CreatePolygonRgn(Points(0), 6, 1)

'“裁剪”窗体
SetWindowRgn Me.hwnd, Result, True

End Sub

另外,我们还应该注意一个Win32 Api:DeleteObject。 我们用Api创建了一个区域。虽然不可见,但是它却是一个对象。如果我们不将其删除,它就会存在于系统中消耗系统资源,所以我们不用的时候就应该将它删除掉。这个Api只有一个参数就是指定要删除对象的句柄。

热心网友 时间:2023-07-15 01:37

我就是提问者,下面是接上面的.
invoke CreateWindowEx,NULL,\
offset szClassName,NULL,\
WS_POPUP or WS_SYSMENU,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;消息循环
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.while 1
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax==0

invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp

start:
call _WinMain
invoke ExitProcess,NULL
;********************************************************
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;以上主程序,下面是把窗体变成不规则形状的子程序
; hMole 为资源的可执行文件的模块,即hWnd所属的模快句柄
; hWnd 为窗口句柄,即为要被设置不规则图形的窗口句柄
; IDB_BmpMap 为BMP位图在RC文件中的ID
; szResName为指向RC文件中定义的rgn文件的资源ID的字符指针,如RC文件中定义 RGNName RGN "leifengjie.rgn"
; 则 szResName db "RGNName",0
; szResType 为指向指定类型文件的文件拓展名 若为rgn文件,则为 SzrgnType db "RGN" ,可为其他类型
; 子程序可根据图片的大小调整窗体的大小
; 子程序的返回值为图片的DC句柄,将其传给一个全局变量可用于窗口无效区的刷新

.code
_UnEqualWindow proc hMole:DWORD ,hWnd:DWORD,IDB_BmpMap:DWORD,\
szResName:DWORD,szResType:DWORD

local @hRgninformation
local @hRgndata
local @hRgndataSize
local @stRect:RECT
local @hDcBitMap
local @hbitmap
local @stBmp:BITMAP

invoke FindResource,hMole,szResName,szResType
mov @hRgninformation,eax
invoke LoadResource,hMole,eax
mov @hRgndata,eax
invoke SizeofResource,hMole,@hRgninformation
mov @hRgndataSize,eax
invoke LockResource,@hRgndata
invoke ExtCreateRegion,NULL,@hRgndataSize,eax
invoke SetWindowRgn,hWnd,eax,TRUE

invoke GetObject,IDB_BmpMap,sizeof BITMAP,addr @stBmp
invoke GetWindowRect,hWnd,addr @stRect
invoke MoveWindow,hWnd,@stRect.left,@stRect.top,\ ;该函数改变指定窗口的
@stBmp.bmWidth,@stBmp.bmHeight,FALSE ;位置和尺寸
invoke GetDC,hWnd
push eax
invoke CreateCompatibleDC,eax
mov @hDcBitMap,eax
invoke LoadBitmap,hMole,IDB_BmpMap
mov @hbitmap,eax
invoke SelectObject,@hDcBitMap,eax
pop eax
invoke BitBlt,eax,0,0,@stBmp.bmWidth,@stBmp.bmHeight,@hDcBitMap,0,0,SRCCOPY
invoke DeleteObject,@hbitmap

mov eax,@hDcBitMap
ret
_UnEqualWindow endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;以下是RC文件
#include <resource.h>
#define Bmp1 0x2001
Bmp1 bitmap "Snap1.bmp"
UnEqualWindow RGN "lfj.rgn"

热心网友 时间:2023-07-15 01:38

不知道怎么搞了我也是学过C++,还有数据库什么的。不好意思!
windows下不规则窗体创建的几种方法

所有的 Windows 窗体都位于一个称为“region”中,窗体的大小如果超出“region”的范围,windows 会自动裁剪超出"region"范围那部分的窗体,使其不可见。所以,要创建不规则窗体有两个步骤:第一步就是创建不规则"region".第二步就是将窗体放到创建的“region”中。

C#创建不规则窗体的几种方式

现在,C#创建不规则窗体不是一件难事,下面总结一下:一、自定义窗体,一般为规则的图形,如圆、椭圆等。做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:System.Drawing.Drawing2D.GraphicsPathshape =newSystem.Drawing.Drawing2D.GraphicsPath();shape.AddEllipse(0,0,this.Heigh...

不规则窗体是怎样创建的

一般来说,要创建一个不规则的窗体。我们需要使用一个Win32 API: SetwindowRgn。这个API您可以在Api浏览器中找到。这个Api的作用就是将窗体的“剪”成一个指定的形状。下面是这个Api声明于解释:Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw ...

请问C#中的不规则窗口怎么制作?

1 新建windows应用程序 2 选中新建的窗体,设置其相应属性:(1)。将 FormBorderStyle 属性设置为 None。(2)。将窗体的 BackgroundImage 属性设置为先前创建的位图文件。不必将文件添加到项目系统中;这将在指定该文件作为背景图像时自动完成。(3)。将 TransparencyKey 属性设置为位图文件的背景色,...

在vb中怎样作不规则的窗体,GDI函数都有哪些

'首先我们先创建一个窗体,并将窗体的BorderStyle属性设为0 '然后声明API函数,如下:Private Declare Function SetWindowRgn Lib "USER32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long...

MFC如何向易语言那样创建不规则对话框窗体?随便给个例子。

1、窗体创建成椭圆形;.创建椭圆形壮的对话框程序 建立MFC对话框工程EllipseInterface,在CellipseInterfaceDlg的OnInitDialog()函数的最后一个return之前加入如下代码:CRect Rect;//定义一个矩形类对象 CRgn newRgn;GetClientRect(&amp;Rect);//获取当前窗体区域 newRgn.CreateEllipticRgn(0,0,Rect.Width(),...

Swing增加透明窗体及不规则窗体

支持透明和不规则窗口已经成为 AWT 和 Swing 团队长久以来梦寐以求的功能 尽管本机应用程序在主要操作系统上使用这项功能已经为时已久 但在核心 Java 中还不能使用它 即将发布的 Consumer JRE 正在进行修改 也就是对 Java SE 进行重大更新 Java SE 将为创建不规则 全透明和每个像素透明的顶级窗口提供 API 历史...

C# win form 程序做不规则窗体 bmp背景图片锯齿毛边问题

图片的半透明效果是没办法应用在窗体中的,窗体中有一个O什么的属性设置80%就可以设置了,麻烦的是里面的控件都会半透明,更别提阴影效果了 锯齿的问题,你把图片重做吧,尽量用矢量图处理。

vb2008 不规则形状窗体的问题(避免浪费,再回答追分)

0,LWA_COLORKEY)'c8c9ca是一种很少用的颜色,当你窗体上是这个颜色的时候,就是透明。当然你也可以选择其它颜色 然后你就可以绘制了,透明的时候就用&amp;HC8c9ca这种颜色 SetLayeredWindowAttributes:BOOL SetLayeredWindowAttributes( HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags );

装修窗体外框颜色帮忙看下。谢谢

首先,窗体的FormBorderStyle设置成None,不要控制边框 TransparencyKey和BackColor颜色设置成相同的,这样,窗体就透明了 以此为基础,制作透明不规则窗体,可以在窗体上设圆角背景图片,也可以绘制 还要解决的是无边框窗体的拖动\关闭等事件处理.

创建窗体的数据源不能是 创建窗体的正确方法是 不规则体量创建 创建不规则选区的方法有哪几种 创建不规则选区可使用的工具包括 窗体的创建 创建窗体的方法有哪些 创建窗体的方法 数据库怎么创建子窗体
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
恩施有哪些区 湖北恩施十大景区 有什么事情令你第一反应“丑人多作怪”? 渡尽人间百劫,尝尽人间百味,方能知道、人间值得是什么意思?_百度... 丑人多作怪这句话你坚信吗,我超级坚信 隔空投送怎样设置? 程序调试时DOS窗口显示时间调节 汇编语言程序运行过程 非法出借枪支罪的处罚标准是什么? 小猪佩奇身上纹叫社会人[社会人小猪佩奇什么意思] 斯佳唯婷的斯佳唯婷化妆品品牌 有用过植美村的化妆品吗,感觉怎么样? 护肤品排行榜品牌和产品都有哪些? teane的产品涂抹了会过敏吗? 请问这些化妆品的英文翻译成中文是什么意思? 请问世界上著名的化妆品品牌和所属国家? 一线化妆品品牌有哪些? 薇姿如何辨别真伪 misitine是不是最泰国最好的化妆品 培颜化妆品怎么样,有谁用过ne nowne是什么化妆品牌子 世界十大化妆品品牌是哪十个? 相宜本草化妆品如何ne ? 9289NE化妆品上的是什么意思? 化妆品品牌那么多,哪个好点ne ? 鼠标移到文字上出现图片提示的代码? 手机系统更新后,死机了,怎么解开啊? 对方把我微信拉黑了,我又收到对方发给我微信通知提醒显示方框里图片两字,是怎 借助下面的示意图和文字提示按照地点变化的顺序复述这个漏的故事怎么做? 怎样使在设置超链接后,同时设置屏幕提示文字为“图片” 运行win32程序老弹出一闪而过的黑窗口是什么问题,怎么解决 20分求助win32窗口透明代码 我家的电脑打开始突然弹出一大堆窗口说不是有效的WIN32应用程序 用Win32API怎么事先分割窗口,有现成的函数 用win32API怎么制作游戏窗口 win32窗口程序如何创建子窗口(我说的是独立新窗口,不是控件)不要mfc... 为什么WIN32的窗口和MFC窗口不一样 microsoft win32 win32native类怎么没有 win32项目与win32控制台项目在创建窗口时有什么区别 如果两个需要转换时需要怎么修改吗? 关于win32 sdk 窗口重画的问题 Win32程序子窗口挂菜单为什么不行 不是有效的win32应用程序,该怎么解决 itenus在电脑上安装时弹出窗口说不是有效的win32应用程序怎么解决 高手进,我要详细答案!!! 开压缩文件时,总是弹出“不是有效的win32应用程序”,这如何解决啊? python win32 如何获取同一窗体中的不同控件的值 肉丸子里带鸡蛋怎么做啊 一道肉丸子蒸蛋的经典做法? 蛋黄糯米丸子怎么做 打肉丸子怎么做法