📄 第一次示例.asm
字号:
include windows.inc ;包含 Windows API 函数、常数、结构体声明
.data
wc WNDCLASS ;窗体风格
hInstance dd ;程序实例句柄
msg MSG ;Windows的消息结构
hBitmap dd ;图片句柄
hIcon dd ;图标句柄
.code
Start:
;取得程序的实例句柄
invoke GetModuleHandle, NULL
mov hInstance, eax
;从资源文件中加载图标和位图
invoke LoadImage, hInstance, "MainIcon", IMAGE_ICON, 72, 72, LR_DEFAULTCOLOR
mov hIcon, eax
invoke LoadBitmap, hInstance, "Logo"
mov hBitmap, eax
;注册一个窗口类
mov wc.style, 0
mov wc.lpfnWndProc, offset WindowProc
mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov eax, hInstance
mov wc.hInstance, eax
invoke LoadIcon, NULL, IDI_WARNING ;使用感叹号图标
mov wc.hIcon, eax
invoke LoadCursor, NULL, IDC_CROSS ;使用十字形光标
mov wc.hCursor, eax
invoke GetStockObject, WHITE_BRUSH ;使用白色背景
mov wc.hbrBackground, eax
mov wc.lpszMenuName, 0
mov wc.lpszClassName, "FirstSampleClass"
invoke RegisterClass, offset wc
;创建一个窗体实例
invoke CreateWindowEx, 0, "FirstSampleClass", "演示窗体", \
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, \
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, 0
invoke ShowWindow, eax, SW_SHOW ;将刚才创建的窗体显示出来
;进入消息循环
invoke GetMessage, offset msg, NULL, 0, 0
while eax
invoke TranslateMessage, offset msg
invoke DispatchMessage, offset msg
invoke GetMessage, offset msg, NULL, 0, 0
endw
;卸载图标和位图
invoke DestroyIcon, hIcon
invoke DeleteObject, hBitmap
invoke ExitProcess,0 ;退出程序
;-----------------------------------------------------------------
;窗口函数
WindowProc proc stdcall hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local ps:PAINTSTRUCT ;定义局部变量
local rect:RECT, hdc:dword
if uMsg = WM_PAINT ;当窗体刷新时在窗体中央显示文字,左右两个上角显示图片
invoke BeginPaint, hWnd, addr ps
;在左上角画出图标
invoke DrawIconEx, ps.hdc, 10, 10, hIcon, 72, 72, 0, NULL, DI_NORMAL
;创建一个内存设备环境,并将图片选入其中
invoke CreateCompatibleDC, ps.hdc
mov hdc, eax
invoke SelectObject, hdc, hBitmap
;在右上角显示图片
invoke GetClientRect, hWnd, addr rect
mov eax, rect.right
sub eax, 50
invoke BitBlt, ps.hdc, eax, 10, 40, 40, hdc, 0, 0, SRCCOPY
;删除内存设备环境
invoke DeleteDC, hdc
;在窗体中央显示文字
sar rect.right, 1
sar rect.bottom, 1
invoke SetTextAlign, ps.hdc, TA_CENTER
invoke TextOut, ps.hdc, rect.right, rect.bottom, "欢迎使用辰灿汇编语言开发环境", 28
invoke EndPaint, hWnd, addr ps
return 0 ;返回函数一定要使用return语句,而不能使用ret指令,否则局部变量没有退栈,会出现堆栈混乱
elseif uMsg == WM_CLOSE
invoke PostQuitMessage, 0
return 0
elseif uMsg == WM_SIZE
invoke RedrawWindow, hWnd, NULL, NULL, RDW_ERASENOW|RDW_INVALIDATE
else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
endif
endp
;-----------------------------------------------------------------
end Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -