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

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

 

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

 

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

 

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

 

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

 

完整的演示程序可参考:


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


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

 

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

 

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

 

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

;   Author: PurpleEndurer
;   DevEnv: Win XP SP2 + MASM32 v7
;   log
; ----------------------------------------------------
; 2008-09-27 Created!
;
;参考: 用MASM32编写全屏窗口程序
;http://blog.csdn.net/Purpleendurer/archive/2006/07/03/871699.aspx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flatstdcall
option casemap: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

WinMain proto :DWORD,  :DWORD, :DWORD, :DWORD
SetWinToScrRightDown proto
SetFullScrMode proto
SetWinMode proto

;.const
c_isFullMode equ 1b     ;窗口处于全屏模式标志

.data
g_szTimeWinClsName db "TimeWinCls", 0
g_szAppName  db "定时强制休息!", 0

g_dwFlag dd 0

;.data?
g_hHInstance HINSTANCE ?
g_hWndMain   HWND  ?
g_stOriginPos WINDOWPLACEMENT <>        ;用于保存窗口模式时位置

.code
start:
    invoke GetModuleHandle,  NULL
    mov    g_hHInstance, eax
    invoke WinMain,  g_hHInstance, 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

    mov   wc.cbSize, SIZEOF WNDCLASSEX
    mov   wc.style,  CS_HREDRAW or CS_VREDRAW
    mov   wc.lpfnWndProc,  OFFSET WndProc
    mov   wc.cbClsExtra, NULL
    mov   wc.cbWndExtra, NULL
    push  g_hHInstance
    pop   wc.hInstance
    mov   wc.hbrBackground, 25
    mov   wc.lpszMenuName, NULL
    mov   wc.lpszClassName, OFFSET g_szTimeWinClsName
    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_szTimeWinClsName, ADDR g_szAppName/
       , WS_POPUP, 100,100, 500, 200, 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


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

    ;--- 保存窗口当前位置以便恢复
    invoke GetWindowPlacement, g_hWndMain, ADDR g_stOriginPos

    invoke GetDC, g_hWndMain
    mov hDC, eax

    ;--- 取屏幕尺寸
    invoke GetDeviceCaps, hDC, HORZRES
    mov dwHorzres, eax

    invoke GetDeviceCaps, hDC, VERTRES
    mov dwVertres, eax

    invoke ReleaseDC, g_hWndMain, hDC

    ;--- 全屏显示
    xor eaxeax
    invoke SetWindowPos, g_hWndMain, HWND_TOPMOST/
        , eaxeax, dwHorzres, dwVertres, SWP_SHOWWINDOW
    ret
SetFullScrMode ENDP


;/
; 功能: 恢复以g_hWndMain为句柄的窗口显示
; 输入: 无
; 输出: 若失败,eax=0;若成功,eax !=0
;/
SetWinMode PROC ;hWnd: HWND
    invoke SetWindowPlacement, g_hWndMain, ADDR g_stOriginPos
    ret
SetWinMode ENDP

WndProc proc hWnd:HWND,  uMsg:UINT,  wParam:WPARAM,  lParam:LPARAM
    .IF uMsg==WM_DESTROY
        invoke PostQuitMessage, NULL

    .ELSEIF uMsg==WM_CREATE
        mov eax, hWnd
        mov g_hWndMain, eax

    .ELSEIF uMsg==WM_LBUTTONDOWN
        test g_dwFlag, c_isFullMode   ;窗口处于全屏模式吗?
        .if ZERO?
            invoke SetFullScrMode      ; 否则置为全屏
            or g_dwFlag, c_isFullMode  ; 置全屏标志
        .else
            invoke SetWinMode          ;是则返回窗口模式
            and g_dwFlag, not c_isFullMode ;取消全屏标志
        .endif
    .ELSE
        invoke DefWindowProc, hWnd, uMsg, wParam, lParam  
        ret
    .ENDIF

    xor eaxeax
    ret
WndProc endp
end start

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫郢剑侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值