نقل قول:
1-mov wc.cbSize,SIZEOF WNDCLASSEX مربوط به اندازه پنجره هستش میشه مثل برنامه هایی که توی ++c می نویسیم عدد هم بهش داد یه مثال هم میزنید.
بله میشه
نقل قول:
2-ساختاری رو که گفتید رو توی این برنامه گذاشتم (کپی) میشه بگید کجای برنامه باید فراخوانی تابع زمان رو انجام بدم
کد زیر چیزی که شما نیاز داری هست
.486
.model flat,stdcall
option casemap:none
lpStr macro Text :req
local lText
.data
lText db Text
.code
exitm <addr lText>
endm
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include c:\masm32\include\windows.inc
include c:\masm32\macros\macros.asm
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\msvcrt.inc ;crt__ultoa
includelib c:\masm32\lib\msvcrt.lib ;crt__ultoa
.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
OurText db "Win32 assembly is great and easy!",0
MyString DB 20 dup(' '),0
LTimeis db "LocalTime is: "
HTime DB 2 dup (' ')
SymTime db ':'
STime DB 2 dup (' ')
db 0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
stimestruct STRUCT
wYear WORD ?
wMonth WORD ?
wDayOfWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
stimestruct EndS
stime stimestruct {}
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
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 hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NUL L,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
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 hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
call LTimep
invoke DrawText, hdc,ADDR LTimeis,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
LTimep proc
lea ebx,stime
push ebx
call GetLocalTime
xor eax,eax
mov al,byte ptr [ebx].stimestruct.wHour
invoke crt__ultoa,eax,ADDR MyString,10
mov ax,word ptr MyString
mov word ptr HTime,ax
cmp HTime+1,0
jne next
mov al,HTime
xchg HTime+1,al
mov HTime,' '
next:
xor eax,eax
mov al,byte ptr [ebx].stimestruct.wMinute
invoke crt__ultoa,eax,ADDR MyString,10
mov ax,word ptr MyString
mov word ptr STime,ax
cmp STime+1,0
jne next2
mov STime,al
next2:
ret
LTimep endp
end start
نقل قول:
3-واسه نمایش یه متن از خط زیر استفاده شده
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
و از ADDR OurText که در قسمت datd تعریف کردیم متن رو به پنجره اضافه می کنیم .حالا توی برنامه شده eax زمان رو ذخیره کرده درسته اگه به جای ADDR OurText بزارم کار درستیه؟
بله شما میخواین روی فرم نمایش بدین که در کد بالا براتون نوشتم
موفق باشی