win32汇编环境,窗口程序中使用月历控件示例二

;运行效果

;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                                                      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一品人家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值