[07-04] 用MASM32编写全屏窗口程序
2006-07-03 22:01
375 查看
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 文件名: FullScr.asm
; 作 者:Purple Endurer(purpleendurer@163.com)
; 功 能: 演示程序在窗口模式和全屏模式间切换
; Date log
;-------------------------------------------------
;2006-07-04 对代码作了一些优化
;2006-07-03 利用SetTimer()和GetAsyncKeyState()增加Esc键
; 作为从全屏切换回窗口模式的热键!
; 在全屏模式下,窗口接收不到WM_KEYDOWN消息
;2006-06-30 创建!可在全屏和窗口模式间切换!
; 在一个国外MASM32论坛上,看到有网友讨论如何用
; MASM32编写全屏窗口程序。于是在
; 用VC 6.0写flash播放器——5、全屏播放
; (http://blog.csdn.net/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 MACRO d1, d2
push d2
pop d1
ENDM
;.const
c_ButtonID equ 1
c_TimerID equ 1
.data
g_szWinClsName db "DemoWinClass", 0
g_szAppName db "全屏显示演示程序 by PurpleEndurer", 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_hInstance HINSTANCE ?
g_hwndButton HANDLE ?
g_stOriginPos WINDOWPLACEMENT <>
.code
start:
invoke GetModuleHandle, NULL
mov g_hInstance, eax
invoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
m_m2m wc.cbSize, SIZEOF WNDCLASSEX
m_m2m wc.style, CS_HREDRAW or CS_VREDRAW
m_m2m wc.lpfnWndProc, OFFSET WndProc
m_m2m wc.cbClsExtra, NULL
m_m2m wc.cbWndExtra, NULL
m_m2m wc.hInstance, g_hInstance
m_m2m wc.hbrBackground, COLOR_WINDOW+1
m_m2m wc.lpszMenuName, NULL
m_m2m wc.lpszClassName, OFFSET g_szWinClsName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx, NULL, ADDR g_szWinClsName, ADDR g_szAppName, /
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, /
hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL
.ELSEIF uMsg==WM_CREATE
;创建按钮
invoke CreateWindowEx, NULL, ADDR g_szBtnClsName, ADDR g_szFullScr, /
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,/
25, 25, 560, 50, hWnd, c_ButtonID, g_hInstance, NULL
mov g_hwndButton, eax
.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
.IF lParam!=0
.IF ax==c_ButtonID
shr eax, 16
.IF ax==BN_CLICKED
invoke SwitchMode, hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIF uMsg==WM_TIMER
invoke GetAsyncKeyState, VK_ESCAPE;Esc键
test eax, 08000h
jz @F
invoke SwitchMode, hWnd
@@:
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
SwitchMode proc hWnd: HWND
.if g_bIsFull==TRUE
invoke KillTimer, hWnd, c_TimerID ;清除定时器
invoke SetWinMode, hWnd ;设置为窗口模式
.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailWinMode, ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF
m_m2m g_bIsFull, FALSE
invoke SetWindowText, g_hwndButton, ADDR g_szFullScr ;修改按钮的文本
.else
invoke SetFullScr, hWnd ;设置为全屏模式
.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailFullScrMode, ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF
m_m2m g_bIsFull, TRUE
invoke SetTimer, hWnd, c_TimerID, 100, NULL ;启动定时器,以捕获Esc键
invoke SetWindowText, g_hwndButton, ADDR g_szSetWinMode ;修改按钮的文本
.endif
ret
SwitchMode endp
;////////////////////////////////////////////////////////////////////////////
; 返回值:若失败,eax=0;若成功,eax !=0
;////////////////////////////////////////////////////////////////////////////
SetFullScr PROC hWnd: HWND
LOCAL hDC: HWND
LOCAL dwHorzres, dwVertres: DWORD
invoke GetWindowPlacement, hWnd, ADDR g_stOriginPos
invoke GetWindowLong, hWnd, GWL_STYLE
xor eax, WS_CAPTION ; push edi
; mov edi, WS_CAPTION
; not edi
; and eax, edi
; push edi
invoke SetWindowLong, hWnd, GWL_STYLE, eax;//去掉标题栏
invoke GetDC, hWnd
mov hDC, eax
invoke GetDeviceCaps, hDC, HORZRES
mov dwHorzres, eax
invoke GetDeviceCaps, hDC, VERTRES
mov dwVertres, eax
xor eax, eax
invoke MoveWindow, hWnd, eax, eax, dwHorzres, dwVertres, TRUE
xor eax, eax
invoke SetWindowPos, hWnd, HWND_TOPMOST, eax, eax, dwHorzres, dwVertres, SWP_SHOWWINDOW ;全屏显示
ret
SetFullScr ENDP
;////////////////////////////////////////////////////////////////////////////
; 返回值:若失败,eax=0;若成功,eax !=0
;////////////////////////////////////////////////////////////////////////////
SetWinMode PROC hWnd: HWND
invoke GetWindowLong, hWnd, GWL_STYLE
or eax, WS_CAPTION
invoke SetWindowLong, hWnd, GWL_STYLE, eax ;//恢复标题栏
invoke ShowWindow, hWnd, SW_HIDE
invoke SetWindowPlacement, hWnd, ADDR g_stOriginPos
ret
SetWinMode ENDP
end start
; 文件名: FullScr.asm
; 作 者:Purple Endurer(purpleendurer@163.com)
; 功 能: 演示程序在窗口模式和全屏模式间切换
; Date log
;-------------------------------------------------
;2006-07-04 对代码作了一些优化
;2006-07-03 利用SetTimer()和GetAsyncKeyState()增加Esc键
; 作为从全屏切换回窗口模式的热键!
; 在全屏模式下,窗口接收不到WM_KEYDOWN消息
;2006-06-30 创建!可在全屏和窗口模式间切换!
; 在一个国外MASM32论坛上,看到有网友讨论如何用
; MASM32编写全屏窗口程序。于是在
; 用VC 6.0写flash播放器——5、全屏播放
; (http://blog.csdn.net/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 MACRO d1, d2
push d2
pop d1
ENDM
;.const
c_ButtonID equ 1
c_TimerID equ 1
.data
g_szWinClsName db "DemoWinClass", 0
g_szAppName db "全屏显示演示程序 by PurpleEndurer", 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_hInstance HINSTANCE ?
g_hwndButton HANDLE ?
g_stOriginPos WINDOWPLACEMENT <>
.code
start:
invoke GetModuleHandle, NULL
mov g_hInstance, eax
invoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
m_m2m wc.cbSize, SIZEOF WNDCLASSEX
m_m2m wc.style, CS_HREDRAW or CS_VREDRAW
m_m2m wc.lpfnWndProc, OFFSET WndProc
m_m2m wc.cbClsExtra, NULL
m_m2m wc.cbWndExtra, NULL
m_m2m wc.hInstance, g_hInstance
m_m2m wc.hbrBackground, COLOR_WINDOW+1
m_m2m wc.lpszMenuName, NULL
m_m2m wc.lpszClassName, OFFSET g_szWinClsName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx, NULL, ADDR g_szWinClsName, ADDR g_szAppName, /
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, /
hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL
.ELSEIF uMsg==WM_CREATE
;创建按钮
invoke CreateWindowEx, NULL, ADDR g_szBtnClsName, ADDR g_szFullScr, /
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,/
25, 25, 560, 50, hWnd, c_ButtonID, g_hInstance, NULL
mov g_hwndButton, eax
.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
.IF lParam!=0
.IF ax==c_ButtonID
shr eax, 16
.IF ax==BN_CLICKED
invoke SwitchMode, hWnd
.ENDIF
.ENDIF
.ENDIF
.ELSEIF uMsg==WM_TIMER
invoke GetAsyncKeyState, VK_ESCAPE;Esc键
test eax, 08000h
jz @F
invoke SwitchMode, hWnd
@@:
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
SwitchMode proc hWnd: HWND
.if g_bIsFull==TRUE
invoke KillTimer, hWnd, c_TimerID ;清除定时器
invoke SetWinMode, hWnd ;设置为窗口模式
.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailWinMode, ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF
m_m2m g_bIsFull, FALSE
invoke SetWindowText, g_hwndButton, ADDR g_szFullScr ;修改按钮的文本
.else
invoke SetFullScr, hWnd ;设置为全屏模式
.IF eax==0
invoke MessageBox, hWnd, ADDR g_szFailFullScrMode, ADDR g_szAppName, MB_ICONERROR
ret
.ENDIF
m_m2m g_bIsFull, TRUE
invoke SetTimer, hWnd, c_TimerID, 100, NULL ;启动定时器,以捕获Esc键
invoke SetWindowText, g_hwndButton, ADDR g_szSetWinMode ;修改按钮的文本
.endif
ret
SwitchMode endp
;////////////////////////////////////////////////////////////////////////////
; 返回值:若失败,eax=0;若成功,eax !=0
;////////////////////////////////////////////////////////////////////////////
SetFullScr PROC hWnd: HWND
LOCAL hDC: HWND
LOCAL dwHorzres, dwVertres: DWORD
invoke GetWindowPlacement, hWnd, ADDR g_stOriginPos
invoke GetWindowLong, hWnd, GWL_STYLE
xor eax, WS_CAPTION ; push edi
; mov edi, WS_CAPTION
; not edi
; and eax, edi
; push edi
invoke SetWindowLong, hWnd, GWL_STYLE, eax;//去掉标题栏
invoke GetDC, hWnd
mov hDC, eax
invoke GetDeviceCaps, hDC, HORZRES
mov dwHorzres, eax
invoke GetDeviceCaps, hDC, VERTRES
mov dwVertres, eax
xor eax, eax
invoke MoveWindow, hWnd, eax, eax, dwHorzres, dwVertres, TRUE
xor eax, eax
invoke SetWindowPos, hWnd, HWND_TOPMOST, eax, eax, dwHorzres, dwVertres, SWP_SHOWWINDOW ;全屏显示
ret
SetFullScr ENDP
;////////////////////////////////////////////////////////////////////////////
; 返回值:若失败,eax=0;若成功,eax !=0
;////////////////////////////////////////////////////////////////////////////
SetWinMode PROC hWnd: HWND
invoke GetWindowLong, hWnd, GWL_STYLE
or eax, WS_CAPTION
invoke SetWindowLong, hWnd, GWL_STYLE, eax ;//恢复标题栏
invoke ShowWindow, hWnd, SW_HIDE
invoke SetWindowPlacement, hWnd, ADDR g_stOriginPos
ret
SetWinMode ENDP
end start
相关文章推荐
- 用MASM32编写全屏窗口程序
- MASM32编程演示程序在窗口模式和全屏模式间切换
- 把程序嵌入网页之ATL编写ActiveX[标准窗口+接受参数]
- 如何编写一个能读取Powerbuilder的数据窗口中数据的程序
- C程序编写不显示控制台窗口
- 用VB如何编写无窗口系统热键程序
- Speaker——用MASM32编写的文本朗读程序(7KB)
- 【DirectX11-Tutorial】编写第一个窗口程序creating a window
- 编写一个程序用于控制其他应用程序窗口的隐藏和显示:
- 转载JS编写随机全屏浮动窗口
- MFC对话框程序,去掉边框和标题栏;窗口全屏显示。
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
- C语言编写windows窗口程序
- 把程序嵌入网页之ATL编写ActiveX[标准窗口+接受参数]
- 二Qt Creator编写多窗口程序
- 用Qt Creator编写一个简单的窗口程序
- 用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
- vc 下编写的 Windows窗口小程序 计算机
- Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法
- 二、Qt Creator编写多窗口程序