不规则窗体是怎样创建的
下面是我写的一段程序,可是没有得到我想要的,我是想把窗体变成不规则的形状,这个形状是由一幅图片决定的,比如一幅图片的有一只猫,那窗体就变成猫的,其他的是透明的.有谁能帮我...
下面是我写的一段程序,可是没有得到我想要的,我是想把窗体变成不规则的形状,这个形状是由一幅图片决定的,比如一幅图片的有一只猫,那窗体就变成猫的,其他的是透明的.有谁能帮我调试一下.整个程序有三个程序,我是用RGNerator做的.
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc
includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib
include UnEqualWindow.asm
;//////////////////////////////////////////////////////////////
.data?
hInstance dd ?
hWinMain dd ?
hDcBack dd ?
Bmp1 equ 2001h
;*************************************************************
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
SzrgnName db "UnEqualWindow",0
SzResType db "RGN",0
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;代码段
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
;********************************************************************
.if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
mov eax,@stPs.rcPaint.right
sub eax,@stPs.rcPaint.left
mov ecx,@stPs.rcPaint.bottom
sub ecx,@stPs.rcPaint.top
invoke BitBlt,@hDc,@stPs.rcPaint.left,@stPs.rcPaint.top,eax,ecx,\
hDcBack,@stPs.rcPaint.left,@stPs.rcPaint.top,SRCCOPY
invoke EndPaint,hWnd,addr @stPs
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.elseif eax==WM_CREATE
invoke _UnEqualWindow,hInstance,hWinMain,Bmp1, addr SzrgnName, addr SzResType
mov hDcBack,eax
.elseif eax == WM_LBUTTONDOWN ;按下左键时移动窗口
invoke UpdateWindow,hWnd ;即时刷新
invoke ReleaseCapture
invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;窗口定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory ,addr @stWndClass,sizeof WNDCLASSEX
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
我是一个汇编的初学者,自学的,有什么错误或是不良的编程习惯请高手们替我指出来,谢谢了!!!!!!!!!!!
很感您的回答,不过你说的那种方法还只是能创建一个由几个点组成的规则形状,而我是想根据一幅图片来创建一个复杂区域. 展开
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc
includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib
include UnEqualWindow.asm
;//////////////////////////////////////////////////////////////
.data?
hInstance dd ?
hWinMain dd ?
hDcBack dd ?
Bmp1 equ 2001h
;*************************************************************
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
SzrgnName db "UnEqualWindow",0
SzResType db "RGN",0
;))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;代码段
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
;********************************************************************
.if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
mov eax,@stPs.rcPaint.right
sub eax,@stPs.rcPaint.left
mov ecx,@stPs.rcPaint.bottom
sub ecx,@stPs.rcPaint.top
invoke BitBlt,@hDc,@stPs.rcPaint.left,@stPs.rcPaint.top,eax,ecx,\
hDcBack,@stPs.rcPaint.left,@stPs.rcPaint.top,SRCCOPY
invoke EndPaint,hWnd,addr @stPs
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.elseif eax==WM_CREATE
invoke _UnEqualWindow,hInstance,hWinMain,Bmp1, addr SzrgnName, addr SzResType
mov hDcBack,eax
.elseif eax == WM_LBUTTONDOWN ;按下左键时移动窗口
invoke UpdateWindow,hWnd ;即时刷新
invoke ReleaseCapture
invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;窗口定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory ,addr @stWndClass,sizeof WNDCLASSEX
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
我是一个汇编的初学者,自学的,有什么错误或是不良的编程习惯请高手们替我指出来,谢谢了!!!!!!!!!!!
很感您的回答,不过你说的那种方法还只是能创建一个由几个点组成的规则形状,而我是想根据一幅图片来创建一个复杂区域. 展开
3个回答
展开全部
创建不规则窗体经验总汇- -
很多人都很热衷于创建形状奇怪的窗体。而且不断的有热心的家伙们将他们的发现放到我们这里与大家分享。今天我将我所知道的方法总结一下。希望对大家有所帮助。
一般来说,要创建一个不规则的窗体。我们需要使用一个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只有一个参数就是指定要删除对象的句柄。
很多人都很热衷于创建形状奇怪的窗体。而且不断的有热心的家伙们将他们的发现放到我们这里与大家分享。今天我将我所知道的方法总结一下。希望对大家有所帮助。
一般来说,要创建一个不规则的窗体。我们需要使用一个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只有一个参数就是指定要删除对象的句柄。
展开全部
我就是提问者,下面是接上面的.
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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;以上主程序,下面是把窗体变成不规则形状的子程序
; hModule 为资源的可执行文件的模块,即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 hModule: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,hModule,szResName,szResType
mov @hRgninformation,eax
invoke LoadResource,hModule,eax
mov @hRgndata,eax
invoke SizeofResource,hModule,@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,hModule,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"
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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;以上主程序,下面是把窗体变成不规则形状的子程序
; hModule 为资源的可执行文件的模块,即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 hModule: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,hModule,szResName,szResType
mov @hRgninformation,eax
invoke LoadResource,hModule,eax
mov @hRgndata,eax
invoke SizeofResource,hModule,@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,hModule,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"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道怎么搞了我也是学过C++,还有数据库什么的。不好意思!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询