;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;文件名: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
.modelflat,stdcall
optioncasemap: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
WinMainproto:DWORD,:DWORD,:DWORD,:DWORD
SetFullScrPROTO:HWND
SetWinModePROTO:HWND
SwitchModePROTO:HWND
m_m2mMACROd1,d2
pushd2
popd1
ENDM
;.const
c_ButtonIDequ1
c_TimerIDequ1
.data
g_szWinClsNamedb"DemoWinClass",0
g_szAppNamedb"全屏显示演示程序byPurpleEndurer",0
g_szBtnClsNamedb"button",0
g_szFullScrdb"全屏显示!",0
g_szSetWinModedb"窗口显示!按Esc键返回!",0
g_szFailWinModedb"设置为窗口模式失败!",0
g_szFailFullScrModedb"设置为全屏模式失败!",0
g_bIsFulldwordFALSE
.data?
g_hInstanceHINSTANCE?
g_hwndButtonHANDLE?
g_stOriginPosWINDOWPLACEMENT<>
.code
start:
invokeGetModuleHandle,NULL
movg_hInstance,eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax
WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND
m_m2mwc.cbSize,SIZEOFWNDCLASSEX
m_m2mwc.style,CS_HREDRAWorCS_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
.WHILETRUE
invokeGetMessage,ADDRmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,ADDRmsg
invokeDispatchMessage,ADDRmsg
.ENDW
moveax,msg.wParam
ret
WinMainendp
WndProcprochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.ELSEIFuMsg==WM_CREATE
;创建按钮
invokeCreateWindowEx,NULL,ADDRg_szBtnClsName,ADDRg_szFullScr,/
WS_CHILDorWS_VISIBLEorBS_DEFPUSHBUTTON,/
25,25,560,50,hWnd,c_ButtonID,g_hInstance,NULL
movg_hwndButton,eax
.ELSEIFuMsg==WM_COMMAND
moveax,wParam
.IFlParam!=0
.IFax==c_ButtonID
shreax,16
.IFax==BN_CLICKED
invokeSwitchMode,hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_TIMER
invokeGetAsyncKeyState,VK_ESCAPE;Esc键
testeax,08000h
jz@F
invokeSwitchMode,hWnd
@@:
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xoreax,eax
ret
WndProcendp
SwitchModeprochWnd:HWND
.ifg_bIsFull==TRUE
invokeKillTimer,hWnd,c_TimerID;清除定时器
invokeSetWinMode,hWnd;设置为窗口模式
.IFeax==0
invokeMessageBox,hWnd,ADDRg_szFailWinMode,ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull,FALSE
invokeSetWindowText,g_hwndButton,ADDRg_szFullScr;修改按钮的文本
.else
invokeSetFullScr,hWnd;设置为全屏模式
.IFeax==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
SwitchModeendp
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetFullScrPROChWnd:HWND
LOCALhDC:HWND
LOCALdwHorzres,dwVertres:DWORD
invokeGetWindowPlacement,hWnd,ADDRg_stOriginPos
invokeGetWindowLong,hWnd,GWL_STYLE
xoreax,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
xoreax,eax
invokeMoveWindow,hWnd,eax,eax,dwHorzres,dwVertres,TRUE
xoreax,eax
invokeSetWindowPos,hWnd,HWND_TOPMOST,eax,eax,dwHorzres,dwVertres,SWP_SHOWWINDOW;全屏显示
ret
SetFullScrENDP
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetWinModePROChWnd:HWND
invokeGetWindowLong,hWnd,GWL_STYLE
oreax,WS_CAPTION
invokeSetWindowLong,hWnd,GWL_STYLE,eax;//恢复标题栏
invokeShowWindow,hWnd,SW_HIDE
invokeSetWindowPlacement,hWnd,ADDRg_stOriginPos
ret
SetWinModeENDP
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
.modelflat,stdcall
optioncasemap: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
WinMainproto:DWORD,:DWORD,:DWORD,:DWORD
SetFullScrPROTO:HWND
SetWinModePROTO:HWND
SwitchModePROTO:HWND
m_m2mMACROd1,d2
pushd2
popd1
ENDM
;.const
c_ButtonIDequ1
c_TimerIDequ1
.data
g_szWinClsNamedb"DemoWinClass",0
g_szAppNamedb"全屏显示演示程序byPurpleEndurer",0
g_szBtnClsNamedb"button",0
g_szFullScrdb"全屏显示!",0
g_szSetWinModedb"窗口显示!按Esc键返回!",0
g_szFailWinModedb"设置为窗口模式失败!",0
g_szFailFullScrModedb"设置为全屏模式失败!",0
g_bIsFulldwordFALSE
.data?
g_hInstanceHINSTANCE?
g_hwndButtonHANDLE?
g_stOriginPosWINDOWPLACEMENT<>
.code
start:
invokeGetModuleHandle,NULL
movg_hInstance,eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax
WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND
m_m2mwc.cbSize,SIZEOFWNDCLASSEX
m_m2mwc.style,CS_HREDRAWorCS_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
.WHILETRUE
invokeGetMessage,ADDRmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,ADDRmsg
invokeDispatchMessage,ADDRmsg
.ENDW
moveax,msg.wParam
ret
WinMainendp
WndProcprochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.ELSEIFuMsg==WM_CREATE
;创建按钮
invokeCreateWindowEx,NULL,ADDRg_szBtnClsName,ADDRg_szFullScr,/
WS_CHILDorWS_VISIBLEorBS_DEFPUSHBUTTON,/
25,25,560,50,hWnd,c_ButtonID,g_hInstance,NULL
movg_hwndButton,eax
.ELSEIFuMsg==WM_COMMAND
moveax,wParam
.IFlParam!=0
.IFax==c_ButtonID
shreax,16
.IFax==BN_CLICKED
invokeSwitchMode,hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_TIMER
invokeGetAsyncKeyState,VK_ESCAPE;Esc键
testeax,08000h
jz@F
invokeSwitchMode,hWnd
@@:
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xoreax,eax
ret
WndProcendp
SwitchModeprochWnd:HWND
.ifg_bIsFull==TRUE
invokeKillTimer,hWnd,c_TimerID;清除定时器
invokeSetWinMode,hWnd;设置为窗口模式
.IFeax==0
invokeMessageBox,hWnd,ADDRg_szFailWinMode,ADDRg_szAppName,MB_ICONERROR
ret
.ENDIF
m_m2mg_bIsFull,FALSE
invokeSetWindowText,g_hwndButton,ADDRg_szFullScr;修改按钮的文本
.else
invokeSetFullScr,hWnd;设置为全屏模式
.IFeax==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
SwitchModeendp
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetFullScrPROChWnd:HWND
LOCALhDC:HWND
LOCALdwHorzres,dwVertres:DWORD
invokeGetWindowPlacement,hWnd,ADDRg_stOriginPos
invokeGetWindowLong,hWnd,GWL_STYLE
xoreax,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
xoreax,eax
invokeMoveWindow,hWnd,eax,eax,dwHorzres,dwVertres,TRUE
xoreax,eax
invokeSetWindowPos,hWnd,HWND_TOPMOST,eax,eax,dwHorzres,dwVertres,SWP_SHOWWINDOW;全屏显示
ret
SetFullScrENDP
;////////////////////////////////////////////////////////////////////////////
;返回值:若失败,eax=0;若成功,eax!=0
;////////////////////////////////////////////////////////////////////////////
SetWinModePROChWnd:HWND
invokeGetWindowLong,hWnd,GWL_STYLE
oreax,WS_CAPTION
invokeSetWindowLong,hWnd,GWL_STYLE,eax;//恢复标题栏
invokeShowWindow,hWnd,SW_HIDE
invokeSetWindowPlacement,hWnd,ADDRg_stOriginPos
ret
SetWinModeENDP
endstart