MASM32编程演示程序在窗口模式和全屏模式间切换

本文介绍如何使用MASM32实现一个程序,在窗口模式和全屏模式之间进行切换。通过设置窗口属性和调整窗口位置,可以实现在两种模式间的平滑过渡。文章还提供了演示程序的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们设定的强制休息时间到了,我们需要让强制休息程序窗口在顶层全屏显示,暂时把屏幕挡住,阻止用户操作。

让窗口全屏显示的一般步骤是:

1、用GetWindowPlacement()获取并保存窗口当前尺寸、位置信息
2、用GetWindowLong()取得用窗口属性,用SetWindowLong()去除窗口标题栏属性WS_CAPTION
3、用GetDeviceCaps()获取屏幕尺寸
4、用SetWindowPos()设置窗口全屏显示

还原到窗口模式的一般步骤是:

1、用GetWindowLong()取得用窗口属性,用SetWindowLong()为窗口加上标题栏属性WS_CAPTION
2、用SetWindowPlacement()将窗口恢复到全屏前的尺寸、位置

完整的演示程序可参考:


用MASM32编写全屏窗口程序
http://blog.youkuaiyun.com/Purpleendurer/archive/2006/07/03/871699.aspx


由于我们强制休息程序窗口使用了WS_POPUP风格,没有标题栏,实现起来就更简捷一些。

下面的演示程序允许用户在窗口上点击鼠标左键来进行窗口模式和全屏模式间的切换:

(源程序及可执行程序打包下载地址:http://download.youkuaiyun.com/source/657586

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Function:点击鼠标左键让演示程序在窗口模式和全屏模式间切换

;Author:PurpleEndurer
;DevEnv:WinXPSP2+MASM32v7
;log
;----------------------------------------------------
;2008-09-27Created!
;
;参考:用MASM32编写全屏窗口程序
;http://blog.youkuaiyun.com/Purpleendurer/archive/2006/07/03/871699.aspx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.modelflat,stdcall
optioncasemap:none
include/masm32/include/windows.inc

include/masm32/include/kernel32.inc
includelib/masm32/lib/kernel32.lib

include/masm32/include/user32.inc
includelib/masm32/lib/user32.lib

include/masm32/include/gdi32.inc
includelib/masm32/lib/gdi32.lib

WinMainproto:DWORD,:DWORD,:DWORD,:DWORD
SetWinToScrRightDownproto
SetFullScrModeproto
SetWinModeproto

;.const
c_isFullModeequ1b;窗口处于全屏模式标志

.data
g_szTimeWinClsNamedb"TimeWinCls",0
g_szAppNamedb"定时强制休息!",0

g_dwFlagdd0

;.data?
g_hHInstanceHINSTANCE?
g_hWndMainHWND?
g_stOriginPosWINDOWPLACEMENT<>;用于保存窗口模式时位置

.code
start:
invokeGetModuleHandle,NULL
movg_hHInstance,eax
invokeWinMain,g_hHInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax

WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND

movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAW
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
pushg_hHInstance
popwc.hInstance
movwc.hbrBackground,25
movwc.lpszMenuName,NULL
movwc.lpszClassName,OFFSETg_szTimeWinClsName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon,eax
movwc.hIconSm,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
INVOKECreateWindowEx,NULL,ADDRg_szTimeWinClsName,ADDRg_szAppName/
,WS_POPUP,100,100,500,200,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


;///////////////////////////////////////////
;功能:让以g_hWndMain为句柄的窗口全屏显示
;输入:无
;输出:若失败,eax=0;若成功,eax!=0
;///////////////////////////////////////////
SetFullScrModePROC;hWnd:HWND
LOCALdwHorzres,dwVertres:DWORD
LOCALhDC:HDC

;---保存窗口当前位置以便恢复
invokeGetWindowPlacement,g_hWndMain,ADDRg_stOriginPos

invokeGetDC,g_hWndMain
movhDC,eax

;---取屏幕尺寸
invokeGetDeviceCaps,hDC,HORZRES
movdwHorzres,eax

invokeGetDeviceCaps,hDC,VERTRES
movdwVertres,eax

invokeReleaseDC,g_hWndMain,hDC

;---全屏显示
xoreax,eax
invokeSetWindowPos,g_hWndMain,HWND_TOPMOST/
,eax,eax,dwHorzres,dwVertres,SWP_SHOWWINDOW
ret
SetFullScrModeENDP


;/////////////////////////////////////////
;功能:恢复以g_hWndMain为句柄的窗口显示
;输入:无
;输出:若失败,eax=0;若成功,eax!=0
;/////////////////////////////////////////
SetWinModePROC;hWnd:HWND
invokeSetWindowPlacement,g_hWndMain,ADDRg_stOriginPos
ret
SetWinModeENDP

WndProcprochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL

.ELSEIFuMsg==WM_CREATE
moveax,hWnd
movg_hWndMain,eax

.ELSEIFuMsg==WM_LBUTTONDOWN
testg_dwFlag,c_isFullMode;窗口处于全屏模式吗?
.ifZERO?
invokeSetFullScrMode;否则置为全屏
org_dwFlag,c_isFullMode;置全屏标志
.else
invokeSetWinMode;是则返回窗口模式
andg_dwFlag,notc_isFullMode;取消全屏标志
.endif
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF

xoreax,eax
ret
WndProcendp
endstart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值