能力值:
( LV9,RANK:210 )
|
-
-
14 楼
我的asm源码如下:
.586
.model flat, stdcall
option casemap :none ; case sensitive
include <windows.inc>
include <kernel32.inc>
includelib <kernel32.lib>
include <user32.inc>
includelib <user32.lib>
include <gdi32.inc>
includelib <gdi32.lib>
include <comctl32.inc>
includelib <comctl32.lib>
;*************************************************
DLG_MAIN equ 101
ICO_1 equ 1005
.data?
hInstance dd ?
lpOldProcEdit dd ?
.data
sta_stat db 0
BtnText db 16 dup (0)
addr0 dd 62 dup (0)
.const
str0 db '0. ',0
str1 db '0 ',0
.code
; 编辑框的新窗口过程>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcEdit proc uses ebx edi esi hWnd,uMsg,wParam,lParam
.if uMsg < 200h || uMsg > 20dh
invoke HideCaret,hWnd
invoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcEdit endp
;********************************************************************
EnableWindows proc hWnd,start_id,end_id,True_False
mov esi,start_id
mov edi,end_id
add esi,80
add edi,80
@@: invoke GetDlgItem,hWnd,esi
invoke EnableWindow,eax,True_False
inc esi
cmp esi,edi
jle @B
ret
EnableWindows endp
;********************************************************************
ShowWindows proc hWnd,start_id,end_id,Show_Hide
mov esi,start_id
mov edi,end_id
@@: invoke GetDlgItem,hWnd,esi
invoke ShowWindow,eax,Show_Hide
inc esi
cmp esi,edi
jle @B
ret
ShowWindows endp
; 主窗口程序>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
;********************************************************************
.if eax == WM_COMMAND ;用户点击“开始”按钮,这个按钮上的文字有时是“停止”
mov eax,wParam
.if eax == 302 ;十进制
invoke ShowWindows,hWnd,305,308,SW_HIDE ;四字、双字、单字、字节
invoke ShowWindows,hWnd,309,311,SW_SHOW ;角度、弧度、梯度
invoke CheckRadioButton,hWnd,309,311,309 ;选中“角度”
invoke SetDlgItemText,hWnd,403,addr str0 ;显示'0. '
invoke EnableWindows,hWnd,46,53,TRUE ;2~9
invoke EnableWindows,hWnd,54,59,FALSE ;A~F
invoke EnableWindows,hWnd,18,20,TRUE ;sin cos tan
invoke EnableWindows,hWnd,28,28,TRUE ;dms
invoke EnableWindows,hWnd,30,31,TRUE ;F-E pi
invoke EnableWindows,hWnd,37,37,TRUE ;Exp
.elseif eax == 301 || eax == 303 || eax == 304 ;十六进制、八进制、二进制
mov ebx,eax
invoke ShowWindows,hWnd,305,308,SW_SHOW ;四字、双字、单字、字节
invoke ShowWindows,hWnd,309,311,SW_HIDE ;角度、弧度、梯度
invoke CheckRadioButton,hWnd,305,308,305 ;选中“四字”
invoke SetDlgItemText,hWnd,403,addr str1 ;显示'0 '
invoke EnableWindows,hWnd,18,20,FALSE ;sin cos tan
invoke EnableWindows,hWnd,28,28,FALSE ;dms
invoke EnableWindows,hWnd,30,31,FALSE ;F-E pi
invoke EnableWindows,hWnd,37,37,FALSE ;Exp
.if ebx == 301
invoke EnableWindows,hWnd,46,59,TRUE ;2~9 A~F
.elseif ebx == 303
invoke EnableWindows,hWnd,46,51,TRUE ;2~7
invoke EnableWindows,hWnd,52,59,FALSE ;8~9 A~F
.else
invoke EnableWindows,hWnd,46,59,FALSE ;2~9 A~F
.endif
.elseif eax == 4+80 ;统计运算按钮
.if sta_stat == 0
mov eax,FALSE
mov sta_stat,1
.else
mov eax,TRUE
mov sta_stat,0
.endif
invoke EnableWindows,hWnd,38,41,eax ;Ave Sum s Dat
.endif
.elseif eax == WM_NOTIFY
mov esi,lParam
.if dword ptr [esi+8] == -0Ch
mov ebx,[esi+4] ;资源ID
.if ebx >= 80 && ebx <= 139
mov eax,ebx
sub eax,80
mov eax,[addr0+eax*4] ;取出按钮上文字的地址
mov lParam,eax ;暂存在这里
mov eax,[esi+0Ch]
.if eax == 1
invoke SetBkMode,[esi+10h],1 ;设置背景模式为透明
mov wParam,eax ;保存原背景模式
.if DWORD ptr [esi+28h] && 4
invoke GetSysColor,COLOR_GRAYTEXT ;取灰化的文字颜色
.else
mov eax,ebx
sub eax,80
lea eax,[color_table+eax*4] ;得到按钮颜色的地址
mov eax,[eax] ;取按钮颜色
.endif
invoke SetTextColor,[esi+10h],eax ;设置文字颜色
lea eax,[esi+14h]
invoke DrawText,[esi+10h],lParam,-1,eax,25h;DT_CENTER|DT_VCENTER|DT_SINGLELINE
invoke SetBkMode,[esi+10h],wParam ;恢复原背景模式
.endif
.endif
.endif
.elseif eax == WM_CLOSE ;用户点击关闭按钮
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG ;初始化对话框,可以做一些初始化工作
invoke LoadIcon,hInstance,ICO_1 ;载入图标
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax ;设置窗口图标
xor esi,esi
lea edi,s0 ;得到第一个按钮上文字的地址
mov [addr0+4*esi],edi ;保存地址
inc esi
xor eax,eax
xor ecx,ecx
dec ecx
@@: repnz scasb ;得到后面每一个按钮上文字的地址
mov [addr0+4*esi],edi ;保存
inc esi
cmp esi,60
jle @B
invoke GetDlgItem,hWnd,403
mov esi,eax
invoke SetWindowLong,eax,GWL_WNDPROC,addr _ProcEdit ;窗口子类化
mov lpOldProcEdit,eax
invoke SetWindowText,esi,addr str0 ;设置文字
invoke GetDlgItem,hWnd,302
invoke SendMessage,eax,BM_CLICK,0,0 ;模拟点击了“十进制”单选按钮
invoke GetDlgItem,hWnd,84
invoke SendMessage,eax,BM_CLICK,0,0 ;模拟点击了“统计”单选按钮
.else
xor eax,eax; mov eax,FALSE
ret
.endif
xor eax,eax
inc eax ; mov eax,TRUE
ret
_ProcDlgMain endp
;*************************************************
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
;**************************************************
.const
s0 db "+/-",0,"C",0,"CE",0,"Backspace",0,"Sta",0,".",0,"And",0,"Or",0,"Xor",0,"Lsh",0
db "/",0,"*",0,"+",0,"-",0,"Mod",0,"x^y",0,"Int",0,"Not",0,"sin",0,"cos",0,"tan",0
db "ln",0,"log",0,"sqrt",0,"x^2",0,"x^3",0,"n!",0,"1/x",0,"dms",0,"%",0,"F-E",0,"pi",0,"=",0
db "MC",0,"MR",0,"MS",0,"M+",0,"Exp",0,"Ave",0,"Sum",0,"s",0,"Dat",0,"(",0,")",0
db "0",0,"1",0,"2",0,"3",0,"4",0,"5",0,"6",0,"7",0,"8",0,"9",0,"A",0,"B",0,"C",0,"D",0,"E",0,"F",0
color_table dd 00FF0000H, 000000FFH, 000000FFH, 000000FFH, 00FF0000H
dd 00FF0000H, 000000FFH, 000000FFH, 000000FFH, 000000FFH
dd 000000FFH, 000000FFH, 000000FFH, 000000FFH, 000000FFH
dd 00FF00FFH, 000000FFH, 000000FFH, 00FF00FFH, 00FF00FFH
dd 00FF00FFH, 00FF00FFH, 00FF00FFH, 00FF00FFH, 00FF00FFH
dd 00FF00FFH, 00FF00FFH, 00FF00FFH, 00FF00FFH, 00FF00FFH
dd 00FF00FFH, 00FF0000H, 000000FFH, 000000FFH, 000000FFH
dd 000000FFH, 000000FFH, 00FF00FFH, 00FF0000H, 00FF0000H
dd 00FF0000H, 00FF0000H, 00FF00FFH, 00FF00FFH, 00FF0000H
dd 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H
dd 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H
dd 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H, 00FF0000H
end start
资源文件:
#include <resource.h>
LANGUAGE 4, 2
1 24 DISCARDABLE "XPStyle.xml"
101 DIALOGEX 100,100,352,170
STYLE WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION
CAPTION "计算器"
FONT 9, "宋体"
MENU 108
BEGIN
EDITTEXT 403,5,1,305,14,WS_BORDER | ES_RIGHT |NOT WS_TABSTOP| WS_VISIBLE | WS_CHILD|WS_EX_NOPARENTNOTIFY|WS_EX_CLIENTEDGE
GROUPBOX "",800,5,34,82,20,0,WS_EX_NOPARENTNOTIFY
CONTROL "Hyp",141,"Button",NOT WS_TABSTOP | BS_AUTOCHECKBOX,49,41,34,10
CONTROL "Inv",140,"Button",NOT WS_TABSTOP | BS_AUTOCHECKBOX,8,41,34,10
GROUPBOX "",-1,5,14,178,20,0,WS_EX_NOPARENTNOTIFY
;每一组单选按钮的第1个设置|WS_GROUP|WS_TABSTOP属性,使这几个单选按钮分成两组
CONTROL "十六进制", 301,"Button",BS_AUTORADIOBUTTON|WS_GROUP ,8,21,44,10
CONTROL "十进制", 302,"Button",BS_AUTORADIOBUTTON ,56,21,37,10
CONTROL "八进制", 303,"Button",BS_AUTORADIOBUTTON ,98,21,37,10
CONTROL "二进制", 304,"Button",BS_AUTORADIOBUTTON ,140,21,37,10
GROUPBOX "",-1,188,14,161,20,0,WS_EX_NOPARENTNOTIFY
CONTROL "四字", 305,"Button",BS_AUTORADIOBUTTON|WS_GROUP ,192,21,32,10
CONTROL "双字", 306,"Button",BS_AUTORADIOBUTTON ,231,21,32,10
CONTROL "单字", 307,"Button",BS_AUTORADIOBUTTON ,270,21,32,10
CONTROL "字节", 308,"Button",BS_AUTORADIOBUTTON ,310,21,32,10
CONTROL "角度", 309,"Button",BS_AUTORADIOBUTTON|WS_GROUP ,192,21,32,10
CONTROL "弧度", 310,"Button",BS_AUTORADIOBUTTON ,231,21,32,10
CONTROL "梯度", 311,"Button",BS_AUTORADIOBUTTON ,270,21,32,10
PUSHBUTTON "", 80,220,120,24,18,NOT WS_TABSTOP; 0 "+/-"
PUSHBUTTON "", 81,305,38,43,18,NOT WS_TABSTOP; 1 "C"
PUSHBUTTON "", 82,260,38,43,18,NOT WS_TABSTOP; 2 "CE"
PUSHBUTTON "", 83,215,38,43,18,NOT WS_TABSTOP; 3 "Backspace"
PUSHBUTTON "", 84,5,60,24,18,NOT WS_TABSTOP; 4 "Sta"
PUSHBUTTON "", 85,246,120,24,18,NOT WS_TABSTOP; 5 "."
PUSHBUTTON "", 86,324,60,24,18,NOT WS_TABSTOP; 6 "And"
PUSHBUTTON "", 87,298,80,24,18,NOT WS_TABSTOP; 7 "Or"
PUSHBUTTON "", 88,324,80,24,18,NOT WS_TABSTOP; 8 "Xor"
PUSHBUTTON "", 89,298,100,24,18,NOT WS_TABSTOP; 9 "Lsh"
PUSHBUTTON "", 90,272,60,24,18,NOT WS_TABSTOP; 10 "/"
PUSHBUTTON "", 91,272,80,24,18,NOT WS_TABSTOP; 11 "*"
PUSHBUTTON "", 92,272,120,24,18,NOT WS_TABSTOP; 12 "+"
PUSHBUTTON "", 93,272,100,24,18,NOT WS_TABSTOP; 13 "-"
PUSHBUTTON "", 94,298,60,24,18,NOT WS_TABSTOP; 14 "Mod"
PUSHBUTTON "", 95,64,100,24,18,NOT WS_TABSTOP; 15 "x^y"
PUSHBUTTON "", 96,324,120,24,18,NOT WS_TABSTOP; 16 "Int"
PUSHBUTTON "", 97,324,100,24,18,NOT WS_TABSTOP; 17 "Not"
PUSHBUTTON "", 98,38,100,24,18,NOT WS_TABSTOP; 18 "sin"
PUSHBUTTON "", 99,38,120,24,18,NOT WS_TABSTOP; 19 "cos"
PUSHBUTTON "", 100,38,140,24,18,NOT WS_TABSTOP; 20 "tan"
PUSHBUTTON "", 101,90,80,24,18,NOT WS_TABSTOP; 21 "ln"
PUSHBUTTON "", 102,90,100,24,18,NOT WS_TABSTOP; 22 "log" 23 "sqrt"
PUSHBUTTON "", 104,64,140,24,18,NOT WS_TABSTOP; 24 "x^2"
PUSHBUTTON "", 105,64,120,24,18,NOT WS_TABSTOP; 25 "x^3"
PUSHBUTTON "", 106,90,120,24,18,NOT WS_TABSTOP; 26 "n!"
PUSHBUTTON "", 107,90,140,24,18,NOT WS_TABSTOP; 27 "1/x"
PUSHBUTTON "", 108,38,80,24,18,NOT WS_TABSTOP; 28 "dms" 29 "%"
PUSHBUTTON "", 110,38,60,24,18,NOT WS_TABSTOP; 30 "F-E"
PUSHBUTTON "", 111,123,140,24,18,NOT WS_TABSTOP; 31 "pi"
PUSHBUTTON "", 112,298,120,24,18,NOT WS_TABSTOP; 32 "="
PUSHBUTTON "", 113,123,60,24,18,NOT WS_TABSTOP; 33 "MC"
PUSHBUTTON "", 114,123,80,24,18,NOT WS_TABSTOP; 34 "MR"
PUSHBUTTON "", 115,123,100,24,18,NOT WS_TABSTOP; 35 "MS"
PUSHBUTTON "", 116,123,120,24,18,NOT WS_TABSTOP; 36 "M+"
PUSHBUTTON "", 117,64,80,24,18,NOT WS_TABSTOP; 37 "Exp"
PUSHBUTTON "", 118,5,80,24,18,NOT WS_TABSTOP; 38 "Ave"
PUSHBUTTON "", 119,5,100,24,18,NOT WS_TABSTOP; 39 "Sum"
PUSHBUTTON "", 120,5,120,24,18,NOT WS_TABSTOP; 40 "s"
PUSHBUTTON "", 121,5,140,24,18,NOT WS_TABSTOP; 41 "Dat"
PUSHBUTTON "", 122,64,60,24,18,NOT WS_TABSTOP; 42 "("
PUSHBUTTON "", 123,90,60,24,18,NOT WS_TABSTOP; 43 ")"
PUSHBUTTON "", 124,194,120,24,18,NOT WS_TABSTOP; 44 "0"
PUSHBUTTON "", 125,194,100,24,18,NOT WS_TABSTOP; 45 "1"
PUSHBUTTON "", 126,220,100,24,18,NOT WS_TABSTOP; 46 "2"
PUSHBUTTON "", 127,246,100,24,18,NOT WS_TABSTOP; 47 "3"
PUSHBUTTON "", 128,194,80,24,18,NOT WS_TABSTOP; 48 "4"
PUSHBUTTON "", 129,220,80,24,18,NOT WS_TABSTOP; 49 "5"
PUSHBUTTON "", 130,246,80,24,18,NOT WS_TABSTOP; 50 "6"
PUSHBUTTON "", 131,194,60,24,18,NOT WS_TABSTOP; 51 "7"
PUSHBUTTON "", 132,220,60,24,18,NOT WS_TABSTOP; 52 "8"
PUSHBUTTON "", 133,246,60,24,18,NOT WS_TABSTOP; 53 "9"
PUSHBUTTON "", 134,194,140,24,18,NOT WS_TABSTOP; 54 "A"
PUSHBUTTON "", 135,220,140,24,18,NOT WS_TABSTOP; 55 "B"
PUSHBUTTON "", 136,246,140,24,18,NOT WS_TABSTOP; 56 "C"
PUSHBUTTON "", 137,272,140,24,18,NOT WS_TABSTOP; 57 "D"
PUSHBUTTON "", 138,298,140,24,18,NOT WS_TABSTOP; 58 "E"
PUSHBUTTON "", 139,324,140,24,18,NOT WS_TABSTOP; 59 "F"
CTEXT "",401,126,38,18,16,WS_GROUP | SS_NOTIFY,WS_EX_CLIENTEDGE
CTEXT "",402,93,38,18,16,WS_GROUP | SS_NOTIFY,WS_EX_CLIENTEDGE
END
108 MENU DISCARDABLE
BEGIN
POPUP "编辑(&E)"
BEGIN
MENUITEM "复制(&C)\tCtrl+C" 300
MENUITEM "粘贴(&P)\tCtrl+V" 301
END
POPUP "查看(&V)"
BEGIN
MENUITEM "标准型(&T)" 305
MENUITEM "科学型(&S)" 304
MENUITEM "" 0
MENUITEM "十六进制(&H)\tF5" 306
MENUITEM "十进制(&D)\tF6" 307
MENUITEM "八进制(&O)\tF7" 308
MENUITEM "二进制(&B)\tF8" 309
MENUITEM "" 0
MENUITEM "四字(&Q)\tF12" 310
MENUITEM "DWORD 值(&R)\tF2" 311
MENUITEM "单字(&W)\tF3" 312
MENUITEM "字节(&Y)\tF4" 313
MENUITEM "" 0
MENUITEM "数字分组(&I)" 303
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "帮助主题(&H) " 317
MENUITEM "" 0
MENUITEM "关于计算器(&A)" 302
END
END
1005 ICON DISCARDABLE "ICO1005.ICO"
请各位大侠帮看一下,改哪里可以让其中的按钮象Windows计算器一样,先谢谢啦
|