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

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

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

 

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

 

1、用GetWindowPlacement()获取并保存窗口当前尺寸、位置信息

2、用GetWindowLong()取得用窗口属性,用SetWindowLong()去除窗口标题栏属性WS_CAPTION

3、用GetDeviceCaps()获取屏幕尺寸

4、用SetWindowPos()设置窗口全屏显示

 

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

 

1、用GetWindowLong()取得用窗口属性,用SetWindowLong()为窗口加上标题栏属性WS_CAPTION

2、用SetWindowPlacement()将窗口恢复到全屏前的尺寸、位置

 

完整的演示程序可参考:

用MASM32编写全屏窗口程序

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

 

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

 

(源程序及可执行程序打包下载地址)

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Function: 点击鼠标左键让演示程序在窗口模式和全屏模式间切换
;   Author: PurpleEndurer
;   DevEnv: Win XP SP2 + MASM32 v7
;   log
; ----------------------------------------------------
; 2008-09-27 Created!
;
;参考: 用MASM32编写全屏窗口程序
;javascript:void(0)
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat, stdcall
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 eax, eax
    invoke SetWindowPos, g_hWndMain, HWND_TOPMOST/
        , eax, eax, 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 eax, eax
    ret
WndProc endp
end
相关文章
[07-04] 用MASM32编写全屏窗口程序
[07-04] 用MASM32编写全屏窗口程序
|
4月前
如何切换Hbuild - X编辑器背景色,如何切换Hbuild - X编辑器风格
如何切换Hbuild - X编辑器背景色,如何切换Hbuild - X编辑器风格
759 0
|
6月前
win32编程 -- 模式对话框
win32编程 -- 模式对话框
38 1
|
6月前
win32编程 -- 无模式对话框
win32编程 -- 无模式对话框
35 0
|
C++ 计算机视觉 Python
Qt+C++窗体界面中英文语言切换
这篇博客针对<<Qt+C++窗体界面中英文语言切换>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
170 0
win11取消右键菜单折叠恢复经典传统菜单模式方法解决
win11取消右键菜单折叠恢复经典传统菜单模式方法解决
505 0
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
QT软件开发: 打开的窗口默认处于屏幕中间
QT软件开发: 打开的窗口默认处于屏幕中间
251 0
QT软件开发: 打开的窗口默认处于屏幕中间
|
C#
[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口                            [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口                                              周银辉 现象: 大家可以...
1254 0