;运行效果
;win32汇编环境,窗口程序中使用月历控件示例二
;以下示例有2个操作,即将每周的开始日进行改变,将默认的周日开始改为周一开始,同时实现点击哪个日期,则设定为哪个日期
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include Comctl32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib Comctl32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA
ClassName db "SimpleWinClass",0
AppName db "窗口程序的模版",0
szSMClassName db "SysMonthCal32",0 ;跟踪条控件类名
sz_FontName db "方正姚体",0
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hIDC_MVI1 HWND ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
IDC_MVI1 equ 1001
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke InitCommonControls ;注册并初始化通用控件
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, 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 hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
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 ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,405,380, NULL,NULL,hInst, NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @hFont,@hOldFont ;设置字体变量
LOCAL @hSystemtime01:SYSTEMTIME
.if uMsg == WM_CREATE
invoke CreateWindowEx,NULL,ADDR szSMClassName,NULL, WS_CHILDWINDOW+WS_VISIBLE+WS_EX_DLGMODALFRAME,0,0,0,0,hWnd,hIDC_MVI1,NULL,NULL ;创建月历日期控件
mov hIDC_MVI1,eax
;月历控件的大小取决于其中字体的大小,字体越大,就越把月历给撑大了,字体越小,则控件越小。如果整个控件小于其设定窗口的一半,则会显示出2个月的日期。可以通过改变创建时控件长度试验出来。
;所以可以通过下面创建新字体的方式,调节月历的大小,下面的30和15是所创建字体的高度与长度,通过调整这2个数值可以撑大或缩小月历。
;同时,在资源编辑器中使用的字体与这里创建的字体名称需要一样。如果不一样,则又涉及到哪个控件先设置先显示的问题,徒增混乱。
;然后通过SetWindowPos函数调节在主窗口上显示的坐标值,适配月历控件的大小,不会导致边上有空白出现
invoke CreateFont,30,13,0,0,FW_BLACK,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SWISS,addr sz_FontName ;创建新字体
mov @hFont,eax
invoke SendMessage,hIDC_MVI1,WM_SETFONT,@hFont,TRUE ;发送WM_SETFONT消息,设置月历日期控件的字体
invoke SetWindowPos,hIDC_MVI1,HWND_TOP,0,0,390,320,SWP_DRAWFRAME ;调整月历控件的位置大小
invoke SendMessage,hIDC_MVI1,MCM_SETCOLOR,MCSC_TEXT,0E2C82H ;设置用于显示月份中文本的颜色,0E2C82H是网上抄的16进制颜色值
invoke SendMessage,hIDC_MVI1,MCM_SETCOLOR,MCSC_TITLEBK,0780CFH ;设置日历标题中显示的背景色
invoke SendMessage,hIDC_MVI1,MCM_SETCOLOR,MCSC_TRAILINGTEXT,9192ABH ;设置非本月的日子的文本颜色
invoke DeleteObject,@hFont
invoke SendMessage,hIDC_MVI1,MCM_SETFIRSTDAYOFWEEK,0,0 ;把每星期的第一天设为周一,而不是原来默认的周日,这里最后一个参数为0则为周一,为1则为周二
.elseif uMsg == WM_NOTIFY ;处理月历控件发送过来的消息,是通过WM_NOTIFY发送过来的
mov ebx,lParam ;lParam里包含其消息码
.if [ebx + NMHDR.code] == MCN_SELECT ;如果消息为MCN_SELECT,即点了新的日期时
invoke SendMessage,hIDC_MVI1,MCM_GETCURSEL,0,addr @hSystemtime01 ;把点击的新的日期值赋值给@hSystemtime01变量
invoke SendMessage,hIDC_MVI1,MCM_SETTODAY,0,addr @hSystemtime01 ;把红圈画到新点击的日期上去,也是设定了这个控件的当前日期
.endif ;删除本程序新建的字体
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start