📄 procwinmain.asm
字号:
include HuffmanDecode.asm
.const
IniFileName db '.\Huffman.ini',0
SectionName db '图片',0
KeyName db '输出文件',0
DefaultInput db '千与千寻.huf',0
.code
ProcWinMain? proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
local @hFile,@hFileMap,@lpMemory
local @hWindowDC,@hCompatibleDC,@hBitmap
local @dwWidth,@dwHeight
local @FileName[MAX_PATH]:byte
mov eax,uMsg
.if eax == WM_CREATE
invoke GetPrivateProfileString,offset SectionName,offset KeyName,offset DefaultInput,addr @FileName,MAX_PATH,offset IniFileName
invoke CreateFile,addr @FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke CreateFileMapping,@hFile,NULL,PAGE_READONLY,0,0,NULL
mov @hFileMap,eax
invoke MapViewOfFile,@hFileMap,FILE_MAP_READ,0,0,0
mov @lpMemory,eax
invoke HuffmanDecode?,@lpMemory;输出位图信息结构和颜色数据的指针
.if eax ;解码成功才画位图,否则无操作
mov edi,eax ;esi指向信息结构
mov esi,@lpMemory
add esi,4+256*8
assume esi:ptr BITMAPINFOHEADER
m2m @dwWidth,[esi].biWidth
m2m @dwHeight,[esi].biHeight
assume esi:nothing
;--------------------------------
;参考窗口DC,建立兼容位图DC和位图
;--------------------------------
invoke GetDC,hWnd
mov @hWindowDC,eax
invoke CreateCompatibleDC,@hWindowDC
mov @hCompatibleDC,eax
invoke CreateCompatibleBitmap,@hWindowDC,@dwWidth,@dwHeight
mov @hBitmap,eax
;----------------------------------
;将位图选入兼容DC,并通过DC操作位图
;----------------------------------
invoke SelectObject,@hCompatibleDC,@hBitmap
invoke DeleteObject,eax
invoke SetDIBitsToDevice,@hCompatibleDC,0,0,@dwWidth,@dwHeight,\
0,0,0,@dwHeight,edi,esi,DIB_RGB_COLORS
invoke GlobalFree,esi
;------------------------------
;以位图创建画刷,并选入窗口背景
;------------------------------
invoke CreatePatternBrush,@hBitmap
invoke SetClassLong,hWnd,GCL_HBRBACKGROUND,eax
invoke DeleteObject,eax
invoke InvalidateRect,hWnd,NULL,TRUE
;--------
;清扫工作
;--------
invoke DeleteDC,@hCompatibleDC
invoke DeleteObject,@hBitmap
invoke ReleaseDC,hWnd,@hWindowDC
.endif
;------------------
;清扫建立的内存文件
;------------------
invoke UnmapViewOfFile,@lpMemory
invoke CloseHandle,@hFileMap
invoke CloseHandle,@hFile
.endif
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
ProcWinMain? endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -