Lately I have been interested in the Resource section of the .EXE and .DLL
files and found only one reference to their use and creation on the web.

The following code will allow the use of an RT_ANIICON or RT_CURSOR to
change the cursor or create an animated icon in a widow or dialog box.

For the Dialog Box Template the control entries are:

CONTROL NULL, IDI_ICON, "UserAniIcon32", NULL, Dx, Dy, NULL, NULL

Where:

IDI_ICON - Is the resourceID in this program of the Animated Icon or Cursor.
Dx - Is the Horizontal position of the upper left corner in Dialog Units.
Dy - Is the Vertical position of the upper left corner in Dialog Units.

The WndProc for the class sets all other values.

Note: The description above will handle internal reources in the module.

To use an .ANI file with full path and filename include quotes in the text entry
and use the form:

CONTROL "'C:\Test.ANI'", IDC_ICONX, "UserAniIcon32", NULL, Dx, Dy, NULL, NULL

Where:
"'C:\Test.ANI'" - Is a sample of the path and filename with 's added
IDI_ICONX - Is the child window ID for the control.
Dx - Is the Horizontal position of the upper left corner in Dialog Units.
Dy - Is the Vertical position of the upper left corner in Dialog Units.

The WndProc for the class sets all other values.

The programmer must include the following line in WinMain if using the template controls:
invoke InitUserAniIcon

To set a Class Cursor use:

invoke LoadAnimatedResource, hInstance, ADDR AniData, ADDR szAni
.IF eax == TRUE
invoke SetClassLong, hWnd, GCL_HCURSOR, AniData.hRAnimated
.ENDIF
Where:

hInstance - Is the module handle of the current program or a module handle of a
library loaded with LoadLibrary.
AniData - Is a defined ANIRESOURCE_INFO structure.
szAni - Is the ResourceID, ResourceName String, or full path and filename in
quotes. Note ADDR is not used with the ResourceID.

To Create an Animated Icon as a Child Window use:

For resources using ID#

invoke CreateAnimatedIcon, hWnd, x, y, ResourceID, NULL

For Named Resources or Full path and filename

invoke CreateAnimatedIcon, hWnd, x, y, IDI_ICONX, ADDR szAni

The ResourceID and Named Resource types is limited to the current program.

Where:

x - Is the horizontal client position of the upper left corner in pixels.
y - Is the vertical client position of the upper left corner in pixels.
ResourceID - Numeric resource ID of the icon or cursor
IDI_ICONX - User supplied unique child ID
szAni - As described for the Named Resources and Full path and filename above.

I have included all of my routines in the coding and used no macros for clarity.



FillBuffer proc lpBuffer:DWORD,lenBuffer:DWORD,TheChar:DWORD
push edi
push ecx
mov edi, lpBuffer ; address of buffer
mov ecx, lenBuffer ; buffer length
mov eax, TheChar ; load al with character using eax
rep stosb ; write character to buffer until ecx = 0
pop ecx
pop edi
ret
FillBuffer endp

;------------------------------------------------------------------------------------;
; Procedure: LoadAnimatedResource ;
; ;
; Purpose: To retrieve a RT_ANICURSOR or RT_ANIICON from the ;
; current program or a library module loaded with the ;
; LoadLibrary function. ;
; ;
; Protected: edi, esi, edx, ecx, ebx. ;
; ;
; Arguments: hModule DWORD The instance handle of the ;
; current program or the handle ;
; returned by the LoadLibrary ;
; function. ;
; ;
; pAniInfo DWORD A pointer to a user ;
; created ANIRESOURCE_INFO ;
; structure to contain the returned data. ;
; ;
; ResID DWORD A valid resource ID or pointer to a ;
; resource name string. This is the same ;
; as defined for functions ;
; like LoadCursor. To allow for loading files the ;
; resource name string can contain the full path and ;
; name of a file with the .ANI extension. To use a ;
; filename place the path and name in quotation ;
; marks( either single or double). ;
; ;
; Return: TRUE if the ANIRESOURCE_INFO structure has been filled. ;
; ;
; FALSE if the ANIRESOURCE_INFO pointer is invalid and data cannot ;
; be passed. ;
; ;
; Remarks: Animated icons and cursors have been allowed as resources since ;
; NT 4.0 however, the normal mechanisms for loading resources will ;
; only retrieve regular icons and cursors from a programs resources. ;
; ;
; The LoadCursorFromFile function and the superceeding LoadImage will ;
; only load RT_ANICURSOR types from files (even LoadImage fails to ;
; load RT_ANIICON) from .ANI type files. ;
; ;
; This routine will retrieve the resource from a module copy the data ;
; to a temporary file and use LoadImage to retrieve the handle for a ;
; cursor which may be used as a cursor or through the use of DrawIcon ;
; or my CreateAminatedIcon use it as an icon. ;
; ;
; Additional information for the number or frames and framerate are ;
; retrieved from the RIFF data during the process. ;
; ;
; Memory used here cannot not released until the programs termination. ;
; ;
;----------------------------------------------------------------------------------;
;
.data
FAILED_MODULEHANDLE equ 0001h
FAILED_ANIRESOURCEI equ 0002h
FAILED_RESOURCETYPE equ 0004h
FAILED_RESIURCEID equ 0008h
FAILED_FINDRESOURCE equ 0010h
FAILED_LOADRESOURCE equ 0020h
FAILED_LOCKRESOURCE equ 0040h
FAILED_FINDFRAMES equ 0080h
FAILED_FINDRATE equ 0100h
FAILED_CREATETEMP equ 0200h
FAILED_WRITETEMP equ 0400h
FAILED_LOADTEMP equ 0800h
FAILED_OPENANI equ 1000h
FAILED_CREATEICON equ 2000h
ANIRESOURCE_INFO Struct
ErrorCode DWORD ?
hRAnimated DWORD ?
cFrames DWORD ?
cFrameRate DWORD ?
ANIRESOURCE_INFO Ends
ANIICON_INFO Struct
pResInfo DWORD ?
hWndIcon DWORD ?
hImage DWORD ?
TimerID DWORD ?
cFrames DWORD ?
cFrameRate DWORD ?
FrameNumber DWORD ?
RateCount DWORD ?
FrameChange DWORD ?
ANIICON_INFO Ends
hValueRiff DD 46464952h ;"FFIR"
hValueRate DD 65746172h ;"etar"
hValueAnih DD 68696E61h ;"hina"
szTempANI db "TempFile.ANI", 00h
TempBuffer db MAX_PATH+1 dup (00h)
.code
LoadResourceFile Proc USES edi esi edx ecx ebx, \
pAniInfo:DWORD, ResID:DWORD
LOCAL vRet:DWORD, fDone:DWORD
LOCAL hResFile:DWORD
LOCAL hMap:DWORD, pMap:DWORD, pEndMap:DWORD
LOCAL cbSizeOfMap:DWORD
LOCAL vQuoteUsed:BYTE

mov vRet, FALSE
mov edi, pAniInfo
ASSUME edi:PTR ANIRESOURCE_INFO

mov eax, ResID
and eax, 0FFFF0000h ;Check Numeric ID
jz LoadResourceFile_Exit ;Is Numeric Exit

;
; Check first character ' or "
;
mov esi, ResID
mov al, [esi]
.IF ((al == '"') || (al == "'"))
mov vQuoteUsed, al
invoke FillBuffer, ADDR TempBuffer, MAX_PATH+1, NULL
push edi
mov edi, Offset TempBuffer
inc esi
mov fDone, NULL
.WHILE fDone == NULL
mov al, [esi]
.IF al != vQuoteUsed
mov [edi], al
inc esi
inc edi
.ELSE
mov fDone, 1
.ENDIF
.ENDW
pop edi
;
; We have a file so open it
;
mov vRet, TRUE
invoke CreateFile, ADDR TempBuffer, GENERIC_READ, NULL, NULL, \
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
mov hResFile, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_OPENANI
jmp LoadResourceFile_Exit
.ENDIF
;
; Now map the file
;
invoke CreateFileMapping, hResFile, NULL, PAGE_READONLY, \
NULL,NULL, NULL
mov hMap, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_OPENANI
jmp LoadResourceFile_Exit
.ENDIF
invoke MapViewOfFile, hMap, FILE_MAP_READ, NULL, NULL, NULL
mov pMap, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_OPENANI
jmp LoadResourceFile_ExitMap
.ENDIF
;
; pMap points to a the start of the RIFF
; Get the Size in bytes
;
mov eax, pMap
mov eax, [eax]
.IF eax != hValueRiff
or [edi].ErrorCode, FAILED_OPENANI
jmp LoadResourceFile_ExitView
.ELSE
mov eax, pMap
add eax, 4
mov eax, [eax]
mov cbSizeOfMap, eax
add eax, pMap
mov pEndMap, eax
;
; Find Frames in the anih
;
and fDone, NULL
mov esi, pMap
.WHILE (esi < pEndMap) && (fDone == NULL)
mov eax, [esi]
.IF eax == hValueAnih
add esi, 12
mov eax, [esi]
mov [edi].cFrames, eax
or fDone, 1
.ELSE
inc esi
.ENDIF
.ENDW
.IF fDone == NULL
or [edi].ErrorCode, FAILED_FINDFRAMES or FAILED_OPENANI
jmp LoadResourceFile_ExitView
.ENDIF
;
; Find Rate in the rate
;
and fDone, NULL
mov esi, pMap
.WHILE (esi < pEndMap) && (fDone == NULL)
mov eax, [esi]
.IF eax == hValueRate
add esi, 4
mov eax, [esi]
mov [edi].cFrameRate, eax
or fDone, 1
.ELSE
inc esi
.ENDIF
.ENDW
.IF fDone == NULL
or [edi].ErrorCode, FAILED_FINDRATE or FAILED_OPENANI
jmp LoadResourceFile_ExitView
.ENDIF
;
; UnMap and Close the file
;
invoke UnmapViewOfFile, pMap
invoke CloseHandle, hMap
invoke CloseHandle, hResFile

;
; Load the Animated Cursor - Yes Animated Icons are Animated Cursors
;
invoke LoadImage, NULL, ADDR TempBuffer, IMAGE_CURSOR, \
NULL, NULL, LR_LOADFROMFILE
.IF eax == NULL
or [edi].ErrorCode, FAILED_OPENANI
.ENDIF

mov [edi].hRAnimated, eax
.ENDIF
.ENDIF
LoadResourceFile_ExitView:
invoke UnmapViewOfFile, pMap
LoadResourceFile_ExitMap:
invoke CloseHandle, hMap
invoke CloseHandle, hResFile
LoadResourceFile_Exit:
ASSUME edi:NOTHING
mov eax, vRet
ret
LoadResourceFile Endp
.code
LoadAnimatedResource Proc USES edi esi edx ecx ebx, \
hModule:DWORD, pAniInfo:DWORD, ResID:DWORD

LOCAL vRet:DWORD
LOCAL hResource:HANDLE, hResMemory:DWORD, pResMemory:DWORD
LOCAL cbSizeOfResource:DWORD, hTempFile:DWORD
LOCAL cbBytesWritten:DWORD, pEndResMemory:DWORD, fDone:DWORD

mov vRet, FALSE
mov edi, pAniInfo
ASSUME edi:PTR ANIRESOURCE_INFO

.IF pAniInfo == NULL
jmp LoadAnimatedResource_Exit
.ENDIF
.IF hModule == NULL
or [edi].ErrorCode, FAILED_MODULEHANDLE
jmp LoadAnimatedResource_Exit
.ENDIF
.IF ResID == NULL
or [edi].ErrorCode, FAILED_RESIURCEID
jmp LoadAnimatedResource_Exit
.ENDIF

mov eax, NULL
mov [edi].ErrorCode, eax
;
; Check for a filename rather than a resource
;
invoke LoadResourceFile, pAniInfo, ResID
.IF eax == TRUE
.IF [edi].ErrorCode == NULL
mov vRet, TRUE
.ELSE
mov vRet, FALSE
.ENDIF
jmp LoadAnimatedResource_Exit
.ENDIF
;
; Find the Resource from the Module RT_ANIICON or RT_ANICURSOR
;
Invoke FindResource, hModule, ResID, RT_ANIICON
mov hResource, eax
.IF eax == NULL
Invoke FindResource, hModule, ResID, RT_ANICURSOR
mov hResource, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_FINDRESOURCE
jmp LoadAnimatedResource_Exit
.ENDIF
.ENDIF
;
; Load it to Global Memory and get a pointer
;
invoke LoadResource, hInstance, hResource
mov hResMemory, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_LOADRESOURCE
jmp LoadAnimatedResource_Exit
.ENDIF
invoke LockResource, hResMemory
mov pResMemory, eax
.IF eax == NULL
or [edi].ErrorCode, FAILED_LOCKRESOURCE
jmp LoadAnimatedResource_Exit
.ENDIF
;
; hResource points to a Resource_Data_Entry
; Get the Size in bytes
;
mov eax, hResource
add eax, 4
mov eax, [eax]
mov cbSizeOfResource, eax
add eax, pResMemory
mov pEndResMemory, eax
;
; Find Frames in the anih
;
and fDone, NULL
mov esi, pResMemory
.WHILE (esi < pEndResMemory) && (fDone == NULL)
mov eax, [esi]
.IF eax == hValueAnih
add esi, 12
mov eax, [esi]
mov [edi].cFrames, eax
or fDone, 1
.ELSE
inc esi
.ENDIF
.ENDW
.IF fDone == NULL
or [edi].ErrorCode, FAILED_FINDFRAMES
jmp LoadAnimatedResource_Exit
.ENDIF
;
; Find Rate in the rate
;
and fDone, NULL
mov esi, pResMemory
.WHILE (esi < pEndResMemory) && (fDone == NULL)
mov eax, [esi]
.IF eax == hValueRate
add esi, 4
mov eax, [esi]
mov [edi].cFrameRate, eax
or fDone, 1
.ELSE
inc esi
.ENDIF
.ENDW
.IF fDone == NULL
or [edi].ErrorCode, FAILED_FINDRATE
jmp LoadAnimatedResource_Exit
.ENDIF
;
; Create a temporary file in the program directory
;
invoke CreateFile, ADDR szTempANI, GENERIC_WRITE, NULL, NULL, \
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
mov hTempFile, eax
.IF eax == INVALID_HANDLE_VALUE
or [edi].ErrorCode, FAILED_CREATETEMP
jmp LoadAnimatedResource_Exit
.ENDIF
;
; Write the Resource to the TempFile.ANI file
;
invoke WriteFile, hTempFile, pResMemory, \
cbSizeOfResource, ADDR cbBytesWritten, NULL
.IF eax == FALSE
or [edi].ErrorCode, FAILED_WRITETEMP
jmp LoadAnimatedResource_Exit
.ENDIF


;
; Close the TempFile.ANI file
;
invoke CloseHandle, hTempFile
;
; Load the Animated Cursor - Yes Animated Icons are Animated Cursors
;
invoke LoadImage, NULL, ADDR szTempANI, IMAGE_CURSOR, \
NULL, NULL, LR_LOADFROMFILE
.IF eax == NULL
or [edi].ErrorCode, FAILED_LOADTEMP
jmp LoadAnimatedResource_Exit
.ENDIF

mov [edi].hRAnimated, eax
mov vRet, TRUE
LoadAnimatedResource_Exit:
mov eax, vRet
ASSUME edi:NOTHING
ret
LoadAnimatedResource Endp
.data?
AniWndProcResID DWORD ?
.data
AniTimerCount DWORD 00h
.code
AniIconWndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL pResInfo:DWORD, pIconInfo:DWORD
LOCAL wWidth:DWORD, wHeight:DWORD, vBaseUnits:DWORD
LOCAL IRect:RECT, IPoint:POINT, hWndParent:DWORD
LOCAL ps:PAINTSTRUCT, hDC:HDC

push edi
push esi

.IF uMsg == WM_NCCREATE
mov eax, lParam
ASSUME eax:PTR CREATESTRUCT
;
; Get the Resource ID or Name from the Title field
; Save it to a global variable and replace it with NULL
;
mov ebx, [eax].lpszName
.IF ebx == NULL
invoke GetWindowLong, hWnd, GWL_ID
mov AniWndProcResID, eax
.ELSE
mov AniWndProcResID, ebx
mov [eax].lpszName, NULL
.ENDIF
ASSUME eax:NOTHING
invoke SetWindowLong, hWnd, GWL_EXSTYLE, WS_EX_TRANSPARENT
invoke SetWindowLong, hWnd, GWL_STYLE, WS_CHILD or WS_BORDER
mov eax, TRUE
ret

.ELSEIF uMsg == WM_CLOSE
invoke DestroyWindow, hWnd

.ELSEIF uMsg == WM_DESTROY
invoke GetWindowLong, hWnd, GWL_USERDATA
.IF eax != NULL
mov esi, eax
ASSUME esi:PTR ANIICON_INFO
.IF [esi].hImage != NULL
invoke DestroyCursor, [esi].hImage
.ENDIF
.IF [esi].pResInfo != NULL
invoke GlobalFree, [esi].pResInfo
.ENDIF
.IF [esi].TimerID != NULL
invoke KillTimer, [esi].hWndIcon, [esi].TimerID
.ENDIF
invoke GlobalFree, esi
.ENDIF

.ELSEIF uMsg == WM_CREATE
invoke SetWindowLong, hWnd, GWL_USERDATA, NULL
invoke GlobalAlloc, GPTR, SIZEOF ANIICON_INFO
mov pIconInfo, eax
.IF eax == NULL
invoke SendMessage, hWnd, WM_CLOSE, NULL, NULL
jmp AniIconWndProc_Exit
.ENDIF
invoke SetWindowLong, hWnd, GWL_USERDATA, pIconInfo
mov esi, pIconInfo
ASSUME esi:PTR ANIICON_INFO
invoke GlobalAlloc, GPTR, SIZEOF ANIRESOURCE_INFO
mov pResInfo, eax
.IF eax == NULL
invoke SendMessage, hWnd, WM_CLOSE, NULL, NULL
jmp AniIconWndProc_Exit
.ENDIF
mov [esi].pResInfo, eax
mov eax, hWnd
mov [esi].hWndIcon, eax
;
; Load as Cursor first and then Icon to allow for varied use
;
mov edi, pResInfo
ASSUME edi:PTR ANIRESOURCE_INFO
invoke LoadAnimatedResource, hInstance, pResInfo, AniWndProcResID
.IF eax == TRUE
mov eax, [edi].hRAnimated
mov [esi].hImage, eax
mov eax, [edi].cFrames
mov [esi].cFrames, eax
mov eax, [edi].cFrameRate
mov [esi].cFrameRate, eax
mov [esi].RateCount, eax
and [esi].FrameNumber, NULL
mov [esi].FrameChange, 1
.ELSE
and [esi].hImage, NULL
invoke SendMessage, hWnd, WM_CLOSE, NULL, NULL
jmp AniIconWndProc_Exit
.ENDIF
;
; Now Create the Timer
;
inc AniTimerCount
invoke SetTimer, hWnd, AniTimerCount, 11h, NULL
mov eax, AniTimerCount
mov [esi].TimerID, eax
;
; Mow resize the window to 20 dialog units square
;
invoke GetWindowRect, hWnd, ADDR IRect
invoke GetDialogBaseUnits
mov vBaseUnits, eax
and eax, 0000FFFFh
push edx
xor edx, edx
push ecx
mov ecx, 18
mul ecx
mov ecx, 4
div ecx
mov wWidth, eax
xor edx, edx
mov eax, vBaseUnits
shr eax, 10h
mov ecx, 18
mul ecx
mov ecx, 8
div ecx
mov wHeight, eax
pop ecx
pop edx
mov eax, IRect.left
mov IPoint.x, eax
mov eax, IRect.top
mov IPoint.y, eax
invoke GetWindowLong, hWnd, GWL_HWNDPARENT
mov hWndParent, eax
invoke ScreenToClient, hWndParent, ADDR IPoint
invoke MoveWindow, hWnd, IPoint.x, IPoint.y, wWidth, wHeight, TRUE

.ELSEIF uMsg == WM_PAINT
invoke GetWindowLong, hWnd, GWL_USERDATA
mov esi, eax
ASSUME esi:PTR ANIICON_INFO
.IF [esi].FrameChange != NULL
invoke BeginPaint, hWnd, ADDR ps
mov hDC, eax
invoke DrawIconEx, hDC, 0, 0, [esi].hImage, NULL, NULL, \
[esi].FrameNumber, NULL, DI_NORMAL
invoke EndPaint, hWnd, ADDR ps
mov [esi].FrameChange, NULL
.ENDIF

.ELSEIF uMsg == WM_TIMER
invoke GetWindowLong, hWnd, GWL_USERDATA
mov esi, eax
ASSUME esi:PTR ANIICON_INFO
mov eax, wParam
.IF eax == [esi].TimerID
dec [esi].RateCount
.IF [esi].RateCount == 0
inc [esi].FrameNumber
mov eax, [esi].FrameNumber
.IF eax == [esi].cFrames
mov [esi].FrameNumber, NULL
.ENDIF
mov eax, [esi].cFrameRate
mov [esi].RateCount, eax
mov [esi].FrameChange, 1
invoke InvalidateRect, hWnd, NULL, TRUE
.ENDIF
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
AniIconWndProc_Exit:
ASSUME esi:NOTHING
ASSUME edi:NOTHING
pop esi
pop edi
xor eax,eax
ret
AniIconWndProc Endp

.data
szClassAnim db "UserAniIcon32", 00h
;----------------------------------------------------------------------------------;
; Procedure: InitUserAniIcon ;
; ;
; Purpose: Register the class "UserAniIcon32" used to create and animate icon ;
; controls (Windows). ;
; ;
; Protected: None. ;
; ;
; Arguments: hInst DWORD The instance handle of the current program. ;
; ;
; Return: TRUE if the class was successfully registered. ;
; ;
; FALSE if the class registration failed. ;
; ;
; Remarks: This class creates a transparent window for the display of frames ;
; from the loaded .ANI image through the use of DrawIconEx. ;
; ;
; The double word reserved in cbWndExtra contains a pointer to the ;
; ANIICON_INFO structure build during creation to hold window data. ;
; ;
; A timer is initiated during creation for cycling frames every 1/60 ;
; second as the rate is defined in these terms. ;
; ;
; All data structures created for this class and the image used are ;
; destroyed for cleanup before closing the window. ;
; ;
;----------------------------------------------------------------------------------;
;
.code
InitUserAniIcon Proc
LOCAL wc:WNDCLASSEX
LOCAL vRet:DWORD
LOCAL hInst:DWORD
mov eax, TRUE
mov vRet, eax

invoke GetModuleHandle, NULL
mov hInst, eax
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET AniIconWndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, SIZEOF DWORD ;Pointer to window data
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName,OFFSET szClassAnim
mov wc.hIcon, NULL
mov wc.hIconSm, NULL
mov wc.hCursor, NULL
invoke RegisterClassEx, addr wc
.IF eax == NULL
mov eax, FALSE
mov vRet, eax
.ENDIF
ret
InitUserAniIcon Endp
.code
CreateAnimatedIcon Proc hParent:DWORD, Iconx:DWORD, \
Icony:DWORD,IconID:DWORD, ResID:DWORD
LOCAL hInst:DWORD
LOCAL hWndIcon:DWORD

invoke GetModuleHandle, NULL
mov hInst, eax
invoke InitUserAniIcon
INVOKE CreateWindowEx,NULL,ADDR szClassAnim, ResID,\
WS_CHILD,Iconx,\
Icony,0,0,hParent,IconID,\
hInst,NULL
.IF eax == NULL
mov eax, FAILED_CREATEICON
.ELSE
mov hWndIcon, eax
invoke UpdateWindow, hWndIcon
invoke ShowWindow, hWndIcon,SW_SHOW
mov eax, NULL
.ENDIF
ret
CreateAnimatedIcon Endp

I have tried to correct the coding to correctly read without wrap.
if you wish I can send you the Source. When you e-mail me use subject MASM32
so I can sort you from the JUNK.

Enjoy
Norm
Posted on 2003-07-06 19:32:08 by ngc2501ca
Nice stuff - I'm sure I'll use it sometime, somewhere :)
Posted on 2003-07-07 07:02:49 by Homer
The code posted is close to perfect but I still need to resolve the background
issue since WS_EX_TRANSPARENT has problems in Dialog Boxes and when moving
the window.

I will post the update.

Thanks,
Norm
Posted on 2003-07-07 07:23:34 by ngc2501ca