📄 lunarday.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 申明:
; 1. 本开发包为共享软件,你可以免费传播、使用本软件,但不得用于商业目的。
; 2. 传播时请不要改动版权信息,并注明出处。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Author: 罗云彬
; Web: http://asm.yeah.net (罗云彬的编程乐园)
; E-mail: bigluo@telekbird.com.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Version 1.0
; Date: 2000.09.15
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 阳历/农历转换计算开发包
;
; 文件包括:
; Lunar.inc -- Win32Asm 语言的 include 文件,定义了使用的数据结构
; 如果使用 C 或其他语言请自行修改格式
; Lunar.dll -- 动态连接库文件
; Lunar.lib -- Lunar.dll 对应的导入库文件
;
; 开发包包括一个 Win32Asm 的使用例子在 Example 目录中
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 功能:计算 1901 - 2050 的农历、节气数据
; 使用:
; 1. 定义 LUNARDATA 数据结构(在 Lunar.inc 文件中已定义)
; 2. 填写 LUNARDATA 数据结构的输入字段并调用 _GetLunarData
; 3. 输出结果在 LUNARDATA 数据结构的输出字段中
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
include Lunar.inc
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib Lunar.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 2000
ID_YEAR equ 2001
ID_MONTH equ 2002
ID_DAY equ 2003
ID_INFO1 equ 2004
ID_INFO2 equ 2005
ID_INFO3 equ 2006
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
szBuffer db 256 dup (?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 子程序声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
szFormat db '农历%d年%d月%d日',0
szYear db '年'
szBlank db ' ',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;********************************************************************
; 将窗口移动到屏幕中间
; 参数:窗口句柄
;********************************************************************
_CenterWindow proc hWnd:DWORD
local @stRectDeskTop:RECT,@stRectWin:RECT
local @dwWidth:DWORD,@dwHeight:DWORD
invoke GetWindowRect,hWnd,addr @stRectWin
invoke GetDesktopWindow
mov ebx,eax
invoke GetWindowRect,ebx,addr @stRectDeskTop
mov eax,@stRectWin.bottom
sub eax,@stRectWin.top
mov @dwHeight,eax
mov eax,@stRectWin.right
sub eax,@stRectWin.left
mov @dwWidth,eax
mov ebx,@stRectDeskTop.bottom
sub ebx,@dwHeight
shr ebx,1
mov ecx,@stRectDeskTop.right
sub ecx,@dwWidth
shr ecx,1
invoke MoveWindow,hWnd,ecx,ebx,@dwWidth,@dwHeight,FALSE
ret
_CenterWindow endp
;********************************************************************
_ProcDlgMain proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
local @stLunarData:LUNARDATA,@dwMonth,@dwDay,@dwTmp
local @stSystemTime:SYSTEMTIME
mov eax,wMsg
;********************************************************************
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
invoke _CenterWindow,hWnd
invoke GetLocalTime,addr @stSystemTime
xor eax,eax
mov ax,@stSystemTime.wYear
invoke SetDlgItemInt,hWnd,ID_YEAR,eax,FALSE
xor eax,eax
mov ax,@stSystemTime.wMonth
invoke SetDlgItemInt,hWnd,ID_MONTH,eax,FALSE
xor eax,eax
mov ax,@stSystemTime.wDay
invoke SetDlgItemInt,hWnd,ID_DAY,eax,FALSE
invoke SendMessage,hWnd,WM_COMMAND,IDOK,NULL
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
.if eax == IDOK
;********************************************************************
invoke GetDlgItem,hWnd,ID_YEAR
invoke SetFocus,eax
invoke GetDlgItemInt,hWnd,ID_YEAR,addr @dwTmp,FALSE
mov @stLunarData.dwYear,eax
invoke GetDlgItemInt,hWnd,ID_MONTH,addr @dwTmp,FALSE
mov @stLunarData.dwMonth,eax
invoke GetDlgItemInt,hWnd,ID_DAY,addr @dwTmp,FALSE
mov @stLunarData.dwDay,eax
invoke _GetLunarData,addr @stLunarData
;********************************************************************
invoke wsprintf,addr szBuffer,addr szFormat,\
@stLunarData.dwLunarYear,\
@stLunarData.dwLunarMonth,\
@stLunarData.dwLunarDay
;********************************************************************
invoke SendDlgItemMessage,hWnd,ID_INFO1,WM_SETTEXT,NULL,addr szBuffer
;********************************************************************
invoke lstrcpy,addr szBuffer,addr @stLunarData.szLunarYear
invoke lstrcat,addr szBuffer,addr szBlank
invoke lstrcat,addr szBuffer,addr @stLunarData.szLunarYearA
invoke lstrcat,addr szBuffer,addr szYear
invoke lstrcat,addr szBuffer,addr @stLunarData.szLunarMonth
invoke lstrcat,addr szBuffer,addr @stLunarData.szLunarDay
invoke SendDlgItemMessage,hWnd,ID_INFO2,WM_SETTEXT,NULL,addr szBuffer
;********************************************************************
invoke lstrcpy,addr szBuffer,addr @stLunarData.szWeekDay
invoke lstrcat,addr szBuffer,addr szBlank
invoke lstrcat,addr szBuffer,addr @stLunarData.szLunarHolDay
invoke SendDlgItemMessage,hWnd,ID_INFO3,WM_SETTEXT,NULL,addr szBuffer
;********************************************************************
.endif
.else
;********************************************************************
; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
; 要返回 FALSE
;********************************************************************
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;********************************************************************
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
;********************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -