;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;文件名:FullScr.asm
;作者:PurpleEndurer(purpleendurer@163.com)
;功 能:演示程序在窗口模式和全屏模式间切换
;Datelog
;-------------------------------------------------
;2006-07-04对代码作了一些优化
;2006-07-03利用SetTimer()和GetAsyncKeyState()增加Esc键
;作为从全屏切换回窗口模式的热键!
;在全屏模式下,窗口接收不到WM_KEYDOWN消息
;2006-06-30创建!可在全屏和窗口模式间切换!
;在一个国外MASM32论坛上,看到有网友讨论如何用
;MASM32编写全屏窗口程序。于是在
;用VC6.0写flash播放器——5、全屏播放
;(http://blog.youkuaiyun.com/purpleendurer/archive/2005/12/07/545717.aspx)
;的代码基础上改写。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.model flat, stdcall
option casemap: none
include/masm32/ include/windows.inc
include/masm32/ include/user32.inc
include/masm32/ include/gdi32.inc
include/masm32/ include/kernel32.inc
include/masm32/ include/shell32.inc
includelib/masm32/ lib/user32.lib
includelib/masm32/ lib/gdi32.lib
includelib/masm32/ lib/kernel32.lib
includelib/masm32/ lib/shell32.lib
WinMain proto: DWORD,: DWORD,: DWORD,: DWORD
SetFullScr PROTO:HWND
SetWinMode PROTO:HWND
SwitchMode PROTO:HWND
m_m2m MACROd1,d2
pushd2
popd1
ENDM
;.const
c_ButtonID equ1
c_TimerID equ1
.data
g_szWinClsName db "DemoWinClass",0
g_szAppName db "全屏显示演示程序byPurpleEndurer",0
g_szBtnClsName db "button",0
g_szFullScr db "全屏显示!",0
g_szSetWinMode db "窗口显示!按Esc键返回!",0
g_szFailWinMode db "设置为窗口模式失败!",0
g_szFailFullScrMode db "设置为全屏模式失败!",0
g_bIsFull dword FALSE
.data?
g_hInstanceHINSTANCE?
g_hwndButtonHANDLE?
g_stOriginPosWINDOWPLACEMENT<>
.code
start:
invokeGetModuleHandle,NULL
movg_hInstance, eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess, eax
WinMain prochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow: DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND
m_m2mwc.cbSize,SIZEOFWNDCLASSEX
m_m2mwc.style,CS_HREDRAW orCS_VREDRAW
m_m2mwc.lpfnWndProc, OFFSETWndProc
m_m2mwc.cbClsExtra,NULL
m_m2mwc.cbWndExtra,NULL
m_m2mwc.hInstance,g_hInstance
m_m2mwc.hbrBackground,COLOR_WINDOW+1
m_m2mwc.lpszMenuName,NULL
m_m2mwc.lpszClassName, OFFSETg_szWinClsName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon, eax
movwc.hIconSm, eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor, eax
invokeRegisterClassEx, addrwc
INVOKECreateWindowEx,NULL, ADDRg_szWinClsName, ADDRg_szAppName,/
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,/
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,/
hInst,NULL
movhwnd, eax
invokeShowWindow,hwnd,SW_SHOWNORMAL
invokeUpdateWindow,hwnd
.WHILE TRUE
invokeGetMessage, ADDRmsg,NULL,0,0
.BREAK .IF(! eax)
invokeTranslateMessage, ADDRmsg
invokeDispatchMessage, ADDRmsg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc prochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.ELSEIFuMsg==WM_CREATE
;创建按钮
invokeCreateWindowEx,NULL, ADDRg_szBtnClsName, ADDRg_szFullScr,/
WS_CHILD orWS_VISIBLE orBS_DEFPUSHBUTTON,/
25,25,560,50,hWnd,c_ButtonID,g_hInstance,NULL
movg_hwndButton, eax
.ELSEIFuMsg==WM_COMMAND
mov eax,wParam
.IFlParam!=0
.IF ax==c_ButtonID
shr eax,16
.IF ax==BN_CLICKED
invokeSwitchMode,hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_TIMER
invokeGetAsyncKeyState,VK_ESCAPE ;Esc键
test eax,08000h
jz@F
invokeSwitchMode,hWnd
@@:
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
SwitchMode prochWnd:HWND
.ifg_bIsFull== TRUE
invokeKillTimer,hWnd,c_TimerID ;清除定时器
invokeSetWinMode,hWnd ;设置为窗口模式
.IF eax==0
invokeMessageBox,hWnd, ADDRg_szFailWinMode, ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull, FALSE
invokeSetWindowText,g_hwndButton, ADDRg_szFullScr ;修改按钮的文本
.else
invokeSetFullScr,hWnd ;设置为全屏模式
.IF eax==0
invokeMessageBox,hWnd, ADDRg_szFailFullScrMode, ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull, TRUE
invokeSetTimer,hWnd,c_TimerID,100,NULL ;启动定时器,以捕获Esc键
invokeSetWindowText,g_hwndButton, ADDRg_szSetWinMode ;修改按钮的文本
.endif
ret
SwitchMode endp
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetFullScr PROChWnd:HWND
LOCALhDC:HWND
LOCALdwHorzres,dwVertres: DWORD
invokeGetWindowPlacement,hWnd, ADDRg_stOriginPos
invokeGetWindowLong,hWnd,GWL_STYLE
xor eax,WS_CAPTION ;pushedi
;movedi,WS_CAPTION
;notedi
;andeax,edi
;pushedi
invokeSetWindowLong,hWnd,GWL_STYLE, eax ;//去掉标题栏
invokeGetDC,hWnd
movhDC, eax
invokeGetDeviceCaps,hDC,HORZRES
movdwHorzres, eax
invokeGetDeviceCaps,hDC,VERTRES
movdwVertres, eax
xor eax, eax
invokeMoveWindow,hWnd, eax, eax,dwHorzres,dwVertres, TRUE
xor eax, eax
invokeSetWindowPos,hWnd,HWND_TOPMOST, eax, eax,dwHorzres,dwVertres,SWP_SHOWWINDOW ;全屏显示
ret
SetFullScr ENDP
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetWinMode PROChWnd:HWND
invokeGetWindowLong,hWnd,GWL_STYLE
or eax,WS_CAPTION
invokeSetWindowLong,hWnd,GWL_STYLE, eax ;//恢复标题栏
invokeShowWindow,hWnd,SW_HIDE
invokeSetWindowPlacement,hWnd, ADDRg_stOriginPos
ret
SetWinMode ENDP
endstart
;文件名:FullScr.asm
;作者:PurpleEndurer(purpleendurer@163.com)
;功 能:演示程序在窗口模式和全屏模式间切换
;Datelog
;-------------------------------------------------
;2006-07-04对代码作了一些优化
;2006-07-03利用SetTimer()和GetAsyncKeyState()增加Esc键
;作为从全屏切换回窗口模式的热键!
;在全屏模式下,窗口接收不到WM_KEYDOWN消息
;2006-06-30创建!可在全屏和窗口模式间切换!
;在一个国外MASM32论坛上,看到有网友讨论如何用
;MASM32编写全屏窗口程序。于是在
;用VC6.0写flash播放器——5、全屏播放
;(http://blog.youkuaiyun.com/purpleendurer/archive/2005/12/07/545717.aspx)
;的代码基础上改写。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.model flat, stdcall
option casemap: none
include/masm32/ include/windows.inc
include/masm32/ include/user32.inc
include/masm32/ include/gdi32.inc
include/masm32/ include/kernel32.inc
include/masm32/ include/shell32.inc
includelib/masm32/ lib/user32.lib
includelib/masm32/ lib/gdi32.lib
includelib/masm32/ lib/kernel32.lib
includelib/masm32/ lib/shell32.lib
WinMain proto: DWORD,: DWORD,: DWORD,: DWORD
SetFullScr PROTO:HWND
SetWinMode PROTO:HWND
SwitchMode PROTO:HWND
m_m2m MACROd1,d2
pushd2
popd1
ENDM
;.const
c_ButtonID equ1
c_TimerID equ1
.data
g_szWinClsName db "DemoWinClass",0
g_szAppName db "全屏显示演示程序byPurpleEndurer",0
g_szBtnClsName db "button",0
g_szFullScr db "全屏显示!",0
g_szSetWinMode db "窗口显示!按Esc键返回!",0
g_szFailWinMode db "设置为窗口模式失败!",0
g_szFailFullScrMode db "设置为全屏模式失败!",0
g_bIsFull dword FALSE
.data?
g_hInstanceHINSTANCE?
g_hwndButtonHANDLE?
g_stOriginPosWINDOWPLACEMENT<>
.code
start:
invokeGetModuleHandle,NULL
movg_hInstance, eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess, eax
WinMain prochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow: DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND
m_m2mwc.cbSize,SIZEOFWNDCLASSEX
m_m2mwc.style,CS_HREDRAW orCS_VREDRAW
m_m2mwc.lpfnWndProc, OFFSETWndProc
m_m2mwc.cbClsExtra,NULL
m_m2mwc.cbWndExtra,NULL
m_m2mwc.hInstance,g_hInstance
m_m2mwc.hbrBackground,COLOR_WINDOW+1
m_m2mwc.lpszMenuName,NULL
m_m2mwc.lpszClassName, OFFSETg_szWinClsName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon, eax
movwc.hIconSm, eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor, eax
invokeRegisterClassEx, addrwc
INVOKECreateWindowEx,NULL, ADDRg_szWinClsName, ADDRg_szAppName,/
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,/
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,/
hInst,NULL
movhwnd, eax
invokeShowWindow,hwnd,SW_SHOWNORMAL
invokeUpdateWindow,hwnd
.WHILE TRUE
invokeGetMessage, ADDRmsg,NULL,0,0
.BREAK .IF(! eax)
invokeTranslateMessage, ADDRmsg
invokeDispatchMessage, ADDRmsg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc prochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.ELSEIFuMsg==WM_CREATE
;创建按钮
invokeCreateWindowEx,NULL, ADDRg_szBtnClsName, ADDRg_szFullScr,/
WS_CHILD orWS_VISIBLE orBS_DEFPUSHBUTTON,/
25,25,560,50,hWnd,c_ButtonID,g_hInstance,NULL
movg_hwndButton, eax
.ELSEIFuMsg==WM_COMMAND
mov eax,wParam
.IFlParam!=0
.IF ax==c_ButtonID
shr eax,16
.IF ax==BN_CLICKED
invokeSwitchMode,hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_TIMER
invokeGetAsyncKeyState,VK_ESCAPE ;Esc键
test eax,08000h
jz@F
invokeSwitchMode,hWnd
@@:
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
SwitchMode prochWnd:HWND
.ifg_bIsFull== TRUE
invokeKillTimer,hWnd,c_TimerID ;清除定时器
invokeSetWinMode,hWnd ;设置为窗口模式
.IF eax==0
invokeMessageBox,hWnd, ADDRg_szFailWinMode, ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull, FALSE
invokeSetWindowText,g_hwndButton, ADDRg_szFullScr ;修改按钮的文本
.else
invokeSetFullScr,hWnd ;设置为全屏模式
.IF eax==0
invokeMessageBox,hWnd, ADDRg_szFailFullScrMode, ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull, TRUE
invokeSetTimer,hWnd,c_TimerID,100,NULL ;启动定时器,以捕获Esc键
invokeSetWindowText,g_hwndButton, ADDRg_szSetWinMode ;修改按钮的文本
.endif
ret
SwitchMode endp
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetFullScr PROChWnd:HWND
LOCALhDC:HWND
LOCALdwHorzres,dwVertres: DWORD
invokeGetWindowPlacement,hWnd, ADDRg_stOriginPos
invokeGetWindowLong,hWnd,GWL_STYLE
xor eax,WS_CAPTION ;pushedi
;movedi,WS_CAPTION
;notedi
;andeax,edi
;pushedi
invokeSetWindowLong,hWnd,GWL_STYLE, eax ;//去掉标题栏
invokeGetDC,hWnd
movhDC, eax
invokeGetDeviceCaps,hDC,HORZRES
movdwHorzres, eax
invokeGetDeviceCaps,hDC,VERTRES
movdwVertres, eax
xor eax, eax
invokeMoveWindow,hWnd, eax, eax,dwHorzres,dwVertres, TRUE
xor eax, eax
invokeSetWindowPos,hWnd,HWND_TOPMOST, eax, eax,dwHorzres,dwVertres,SWP_SHOWWINDOW ;全屏显示
ret
SetFullScr ENDP
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetWinMode PROChWnd:HWND
invokeGetWindowLong,hWnd,GWL_STYLE
or eax,WS_CAPTION
invokeSetWindowLong,hWnd,GWL_STYLE, eax ;//恢复标题栏
invokeShowWindow,hWnd,SW_HIDE
invokeSetWindowPlacement,hWnd, ADDRg_stOriginPos
ret
SetWinMode ENDP
endstart