Why doe it makes not make any differences which way these directory switches points to / and \
It will comply anyway which it shouldn't. Is this a fasm bug. I uesed the latest version (Fasm 1.67) which shows no version number under XP Pro and other .exe do.
;===========================================================================================
; Button_2.asm Fasm Flat assembler
; Boutons: bitmap/icones
; Programmé par AsmGges France
;===========================================================================================
; This is one of my choise of
; examples for learning FASM
format PE GUI 4.0
entry start
include 'include/win32a.inc'
;
;;;;;; include 'include/macro/if.inc' ; right
include 'include/macro\if.inc' ; worong but still works
FLOODFILLSURFACE = 01h
section '.code' code readable executable
start:
invoke GetModuleHandle,0
;push 0
;call GetModuleHandle
mov [wc.hInstance],eax
;##############################################
;##############################################
;##############################################
invoke LoadIcon,[wc.hInstance],ID_FRANCE
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
invoke GetSystemMetrics,SM_CXSCREEN
sub eax,[WinW]
shr eax,1
mov [WinX],eax
invoke GetSystemMetrics,SM_CYSCREEN
sub eax,[WinH]
shr eax,1
mov [WinY],eax
sub [WinY],130
invoke RegisterClass,wc
invoke CreateWindowEx,WS_EX_LEFT,ClassName,Titre,WS_OVERLAPPED+WS_SYSMENU,\
[WinX],[WinY],[WinW],[WinH],0,0,[wc.hInstance],0
mov [hWnd],eax
invoke ShowWindow,[hWnd],SW_SHOWDEFAULT
invoke UpdateWindow,[hWnd]
MessageLoop:
invoke GetMessage,msg,0,0,0
or eax,eax
jz ExitProgram
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp MessageLoop
ExitProgram:
invoke ExitProcess,[msg.wParam]
proc WindowProc uses ebx esi edi, @hWnd, @uMsg, @wParam, @lParam
.if [@uMsg] = WM_CLOSE
invoke MessageBox,[@hWnd],MsgEnd,ClassName,MB_OK+MB_ICONINFORMATION
invoke PostQuitMessage,0
.elseif [@uMsg] = WM_COMMAND
.if [@wParam] = BN_CLICKED shl 16+ID_BUTTON_ICON1
invoke MessageBox,[@hWnd],icoMsg1,ClassName,MB_OK
.elseif [@wParam] = BN_CLICKED shl 16+ID_BUTTON_ICON2
invoke MessageBox,[@hWnd],icoMsg2,ClassName,MB_OK
.elseif [@wParam] = BN_CLICKED shl 16+ID_BUTTON_BMP1
invoke MessageBox,[@hWnd],bmpMsg1,ClassName,MB_OK
.elseif [@wParam] = BN_CLICKED shl 16+ID_BUTTON_BMP2
invoke MessageBox,[@hWnd],bmpMsg2,ClassName,MB_OK
.endif
.elseif [@uMsg] = WM_CREATE
stdcall DrawButton,[@hWnd],20,20,36,36,ID_BUTTON_ICON1,BS_ICON
mov [hWndBtn1],eax
invoke LoadIcon,[wc.hInstance],ID_ICON1
invoke SendMessage,[hWndBtn1],BM_SETIMAGE,1,eax
stdcall DrawButton,[@hWnd],20,70,36,36,ID_BUTTON_ICON2,BS_ICON
mov [hWndBtn2],eax
invoke SetWindowLong,[hWndBtn2],GWL_WNDPROC,BtnProc
mov [lpBtnProc],eax
invoke LoadIcon,[wc.hInstance],ID_ICON1
invoke SendMessage,[hWndBtn2],BM_SETIMAGE,1,eax
invoke LoadBitmap,[wc.hInstance],ID_BMP1
mov [hBmp1],eax
PUSH [hBmp1]
CALL SetBmpColor
; stdcall SetBmpColor,[hBmp1]
; mov [hBmp1],eax
;##############################################
;##############################################
;##############################################
invoke LoadBitmap,[wc.hInstance],ID_BMP2
mov [hBmp2],eax
stdcall SetBmpColor,[hBmp2]
mov [hBmp2],eax
stdcall DrawButton,[@hWnd],120,20,100,36,ID_BUTTON_BMP1,BS_BITMAP
mov [hWndBtn3],eax
invoke SendMessage,[hWndBtn3],BM_SETIMAGE,0,[hBmp1]
stdcall DrawButton,[@hWnd],120,70,100,36,ID_BUTTON_BMP2,BS_BITMAP
mov [hWndBtn4],eax
invoke SendMessage,[hWndBtn4],BM_SETIMAGE,0,[hBmp1]
invoke SetWindowLong,[hWndBtn4],GWL_WNDPROC,bmpProc
mov [lpfnbmpProc], eax
.elseif [@uMsg] = WM_PAINT
invoke BeginPaint,[@hWnd],ps
mov [ps.hdc],eax
stdcall PaintProc,[@hWnd],[ps.hdc]
invoke EndPaint,[@hWnd],ps
.else
invoke DefWindowProc,[@hWnd],[@uMsg],[@wParam],[@lParam]
ret
.endif
mov eax,0
ret
endp
;===========================================================================================
proc PaintProc @hWnd, @hDC
local .btn_hi:DWORD, .btn_lo:DWORD
invoke GetSysColor,COLOR_BTNHIGHLIGHT
mov [.btn_hi],eax
invoke GetSysColor,COLOR_BTNSHADOW
mov [.btn_lo],eax
mov eax,0
ret
endp
;===========================================================================================
proc BtnProc @hCtl, @uMsg, @wParam, @lParam
.if [@uMsg] = WM_LBUTTONDOWN | [@uMsg] = WM_KEYDOWN
invoke LoadIcon,[wc.hInstance],ID_ICON2
invoke SendMessage,[hWndBtn2],BM_SETIMAGE,1,eax
.elseif [@uMsg] = WM_LBUTTONUP | [@uMsg] = WM_KEYUP
invoke LoadIcon,[wc.hInstance],ID_ICON1
invoke SendMessage,[hWndBtn2],BM_SETIMAGE,1,eax
.endif
invoke CallWindowProc,[lpBtnProc],[@hCtl],[@uMsg],[@wParam],[@lParam]
ret
endp
;===========================================================================================
proc bmpProc @hCtl, @uMsg, @wParam, @lParam
.if [@uMsg] = WM_LBUTTONDOWN | [@uMsg] = WM_KEYDOWN
invoke SendMessage,[hWndBtn4],BM_SETIMAGE,0,[hBmp2]
.elseif [@uMsg] = WM_LBUTTONUP | [@uMsg] = WM_KEYUP
invoke SendMessage,[hWndBtn4],BM_SETIMAGE,0,[hBmp1]
.endif
invoke CallWindowProc,[lpfnbmpProc],[@hCtl],[@uMsg],[@wParam],[@lParam]
ret
endp
proc DrawButton @hParent, @X, @Y, @wX, @hY, @Id, @ButtonStyle
mov eax,WS_CHILD+WS_VISIBLE
add eax,[@ButtonStyle]
invoke CreateWindowEx,0,Button,noTitre,eax,[@X],[@Y],[@wX],[@hY],\
[@hParent],[@Id],[wc.hInstance],NULL
ret
endp
proc SetBmpColor @hBitmap
local .hMemDC:DWORD, .hBrush:DWORD, .hOldBmp:DWORD, .hReturn:DWORD, .hOldBrush:DWORD
invoke CreateCompatibleDC,NULL
mov [.hMemDC],eax
invoke SelectObject,[.hMemDC],[@hBitmap]
mov [.hOldBmp],eax
invoke GetSysColor,COLOR_BTNFACE
invoke CreateSolidBrush,eax
mov [.hBrush],eax
invoke SelectObject,[.hMemDC],[.hBrush]
mov [.hOldBrush],eax
invoke GetPixel,[.hMemDC],1,1
invoke ExtFloodFill,[.hMemDC],1,1,eax,FLOODFILLSURFACE
invoke SelectObject,[.hMemDC],[.hOldBrush]
invoke DeleteObject,[.hBrush]
invoke SelectObject,[.hMemDC],[@hBitmap]
mov [.hReturn],eax
invoke DeleteDC,[.hMemDC]
mov eax,[.hReturn]
ret
endp
section '.data' data readable writeable
Titre db ' Boutons: Bitmap / Icône ',0
ClassName db ' AsmGges Win32',0
MsgEnd db ' AsmGges France @2006 ',0
Button db 'BUTTON',0
noTitre db '',0
icoMsg1 db 'Bouton: 1 icône ',0
icoMsg2 db 'Bouton: 2 icônes ',0
bmpMsg1 db 'Bouton: 1 bitmap ',0
bmpMsg2 db 'Bouton: 2 Bitmap ',0
align 4
WinX dd 0
WinY dd 0
WinW dd 248
WinH dd 156
hWnd dd ?
hWndBtn1 dd ?
hWndBtn2 dd ?
hWndBtn3 dd ?
hWndBtn4 dd ?
hBmp1 dd ?
hBmp2 dd ?
lpBtnProc dd ?
lpfnbmpProc dd ?
wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,0,ClassName
msg MSG
ps PAINTSTRUCT
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
gdi32,'GDI32.DLL'
; -------------------------------
include 'include/apia\kernel32.inc'
include 'include/apia\user32.inc'
include 'include/apia\gdi32.inc'
section '.rsrc' resource data readable
directory RT_ICON,icons,\
RT_GROUP_ICON,group_icons,\
RT_BITMAP,appBmp
ID_FRANCE = 1
ID_ICON1 = 2
ID_ICON2 = 3
ID_BMP1 = 10
ID_BMP2 = 11
ID_BUTTON_ICON1 = 400
ID_BUTTON_ICON2 = 401
ID_BUTTON_BMP1 = 402
ID_BUTTON_BMP2 = 403
resource icons,\
1,LANG_NEUTRAL,france_data,\
2,LANG_NEUTRAL,icon1_data,\
3,LANG_NEUTRAL,icon2_data
resource group_icons,\
ID_FRANCE,LANG_NEUTRAL,france,\
ID_ICON1, LANG_NEUTRAL,icon1,\
ID_ICON2, LANG_NEUTRAL,icon2
resource appBmp,\
ID_BMP1,LANG_NEUTRAL,bmp1,\
ID_BMP2,LANG_NEUTRAL,bmp2
icon france,france_data,'res\france.ico'
icon icon1, icon1_data, 'res\icon1.ico'
icon icon2, icon2_data, 'res\icon2.ico'
bitmap bmp1,'res\bmp1.bmp'
bitmap bmp2,'res\bmp2.bmp'
;==========================================================================================