⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 propertysheet.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
ColorDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
SizeDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
pshproc proto :DWORD,:DWORD,:DWORD
.const
IDR_MENU                    equ 101
IDR_DIALOG_SIZE        equ 102
IDR_DIALOG_COLOR    equ 103
IDC_RED                       equ 1000
IDC_GREEN                   equ 1001
IDC_BLUE                      equ 1002
IDC_SPIN                      equ 1003
IDC_EDIT                      equ 1004
IDM_SHEET                   equ 40001
IDM_EXIT                      equ 40002
.data
ClassName       db "SheetClass",0
TitleName       db "选项卡",0
SheetColor      db " 颜色",0
SheetSize        db " 大小",0
TestText         db "长天秋水共一色",0
FontName        db "楷体",0
Color              dd 0
FontSize          dd 20


.data?
hInstance	    HINSTANCE ?
pspcolor        PROPSHEETPAGE   <>
pspsize          PROPSHEETPAGE   <> 
psh               PROPSHEETHEADER <>
hupdown       HWND   ?
happly           HWND   ?
hmainwnd     HWND   ?
SelectCard      dd ?,?
hF                  HFONT  ?
hOldF            HFONT  ?
.code
start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax
        invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        mov   eax, hInstance
        mov   wc.hInstance,eax
        invoke GetStockObject,WHITE_BRUSH 
        mov   wc.hbrBackground,eax
        mov   wc.lpszMenuName,IDR_MENU
        mov   wc.lpszClassName,OFFSET ClassName
        invoke LoadIcon,NULL,IDI_ASTERISK
        mov   wc.hIcon,eax
        mov   wc.hIconSm,0
        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax
        invoke RegisterClassEx, addr wc
        invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
                              addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
                              NULL,NULL,hInst,NULL
        mov   hmainwnd,eax
        invoke ShowWindow,hmainwnd,CmdShow
        invoke UpdateWindow,hmainwnd
        .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
        local hdc:HDC
        local ps:PAINTSTRUCT
        .if uMsg==WM_DESTROY
             invoke DeleteObject,hF
             invoke PostQuitMessage,NULL
        .elseif uMsg==WM_PAINT
             invoke BeginPaint,hWnd,addr ps
             mov   hdc,eax
             invoke SetTextColor,hdc,Color
             invoke CreateFont,FontSize,10,0,0,300,0,TRUE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,\
                    CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,addr FontName
             mov hF,eax
             invoke SelectObject,hdc,hF
             mov hOldF,eax
             invoke TextOut,hdc,50,30,addr TestText,sizeof TestText-1
             invoke SelectObject,hdc,hOldF
             invoke ReleaseDC,hWnd,hdc  
             invoke EndPaint  ,hWnd,addr ps
        .elseif uMsg==WM_COMMAND          
            .if !lParam
             mov eax,wParam
             .if ax==IDM_SHEET
                mov pspcolor.dwSize,sizeof PROPSHEETPAGE
                mov pspcolor.dwFlags,PSP_USETITLE 
                mov pspcolor.pfnDlgProc ,offset ColorDlgProc 
                mov pspcolor.pszTemplate ,IDR_DIALOG_COLOR
                push hInstance
                pop  pspcolor.hInstance 
                mov pspcolor.pszTitle ,offset SheetColor
                invoke CreatePropertySheetPage,addr pspcolor
                mov SelectCard ,eax
                invoke MemCopy ,addr pspcolor,addr pspsize,sizeof PROPSHEETPAGE            
                mov pspsize.pszTitle ,offset SheetSize
                mov pspsize.pszTemplate ,IDR_DIALOG_SIZE
                mov pspsize.pfnDlgProc ,offset SizeDlgProc 
                invoke CreatePropertySheetPage,addr pspsize
                mov SelectCard+4,eax
                mov psh.dwSize,sizeof PROPSHEETHEADER
                push hWnd
                pop psh.hwndParent
                mov psh.dwFlags,PSH_USECALLBACK
                push hInstance  
                pop   psh.hInstance
                mov psh.pszCaption,offset TitleName
                mov psh.nPages,2
                mov psh.pStartPage ,0
                mov psh.phpage ,offset  SelectCard
                mov psh.pfnCallback,offset pshproc 
                invoke PropertySheet,addr psh
             .else
               invoke DestroyWindow,hWnd
             .endif  
           .endif
        .else
             invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
             ret
        .endif
        xor eax,eax
        ret
WndProc endp
             
ColorDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
        .if uMsg==WM_INITDIALOG
          invoke GetDlgItem,hWnd,IDC_RED
          invoke SendMessage,eax,BM_CLICK,0,0
          invoke EnableWindow,happly,FALSE
        .elseif uMsg==WM_NOTIFY
          mov edi,lParam
          assume edi:ptr  PSHNOTIFY
          .if [edi].hdr.code==PSN_APPLY              
            invoke GetDlgItem,hWnd,IDC_RED
            invoke SendMessage,eax,BM_GETCHECK,0,0
              .if eax==BST_CHECKED
                 mov Color,0ffh          
              .endif
            invoke GetDlgItem,hWnd,IDC_GREEN
            invoke SendMessage,eax,BM_GETCHECK,0,0
              .if eax==BST_CHECKED
                 mov Color,0ff00h
              .endif
            invoke GetDlgItem,hWnd,IDC_BLUE
            invoke SendMessage,eax,BM_GETCHECK,0,0
              .if eax==BST_CHECKED
                 mov Color,0ff0000h
              .endif
            invoke InvalidateRect,hmainwnd,NULL,TRUE
          .endif
        .elseif uMsg==WM_COMMAND
          .if lParam
            invoke EnableWindow,happly,TRUE
          .endif
        .elseif uMsg==WM_CLOSE
           invoke DestroyWindow,hWnd
        .else
           mov eax,FALSE
           ret
        .endif
        mov eax,TRUE
        ret
ColorDlgProc endp

SizeDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
        .if uMsg==WM_INITDIALOG
          invoke GetDlgItem,hWnd,IDC_SPIN
          mov hupdown,eax
          invoke GetDlgItem,hWnd,IDC_EDIT
          invoke SendMessage,hupdown,UDM_SETBUDDY,eax,0
          invoke SendMessage,hupdown,UDM_SETRANGE,0,00010060H 
          invoke SendMessage,hupdown,UDM_SETPOS,0,10        
        .elseif uMsg==WM_NOTIFY
          mov edi,lParam
          assume edi:ptr  PSHNOTIFY
          .if [edi].hdr.code==PSN_APPLY
              invoke SendMessage,hupdown,UDM_GETPOS,0,0
              mov FontSize,eax
          .endif
          invoke InvalidateRect,hmainwnd,NULL,TRUE
        .elseif uMsg==WM_COMMAND
          .if lParam
            invoke EnableWindow,happly,TRUE
          .endif
        .elseif uMsg==WM_CLOSE
           invoke DestroyWindow,hWnd
        .else
           mov eax,FALSE
           ret
        .endif
        mov eax,TRUE
        ret
SizeDlgProc endp
            
pshproc proc  hwndDlg:dword ,uMsg:dword,lParam:dword
        .if uMsg==PSCB_INITIALIZED 
            invoke GetWindow,hwndDlg,GW_CHILD
            invoke GetWindow,eax,GW_HWNDNEXT
            invoke GetWindow,eax,GW_HWNDNEXT
            mov happly,eax
        .else
            mov eax,TRUE
            ret
        .endif
        xor eax,eax
        ret 
pshproc endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -