📄 carousel.bas
字号:
' // Repaint only the caption.
CALL GetClientRect(hWnd, rc)
CALL zGetImageSize(zGetProperty(hWnd, %FORM_TopMid), 0, rc.nBottom)
CALL InvalidateRect(hWnd, rc, 0)
CALL UpdateWindow(hWnd)
EXIT FUNCTION
CASE %WM_NCLBUTTONDBLCLK
IF IsIconic(hWnd) = 0 THEN
LOCAL CaptionHeight AS LONG, p AS POINTAPI
p.X = LO(INTEGER, lParam): p.Y = HI(INTEGER, lParam)
CALL ScreenToClient(hWnd, p)
CALL zGetImageSize(zGetProperty(hWnd, %FORM_TopMid), 0, CaptionHeight)
IF p.Y < CaptionHeight THEN
IF IsZoomed(hWnd) THEN
CALL zButtonSysCommand(hWnd, MAKLNG(%ID_RESTORE, 0))
ELSE
CALL zButtonSysCommand(hWnd, MAKLNG(%ID_MAXIMIZE, 0))
END IF
FUNCTION = 0: EXIT FUNCTION
END IF
END IF
CASE %WM_NCACTIVATE
LOCAL hBut AS LONG
hBut = GetDlgItem(hWnd, %ID_LED)
IF hBut THEN
' // Windows please do your job first.
FUNCTION = DefWindowProc(hWnd, Msg, wParam, lParam)
IF zMainWindow(0) = GetForegroundWindow THEN
gColorCaption = SK_ACTIVECAPTION()
ELSE
gColorCaption = SK_INACTIVECAPTION()
END IF
' // Update caption
CALL zPaintBackground()
' // Repaint only the caption.
CALL GetClientRect(hWnd, rc)
CALL zGetImageSize(zGetProperty(hWnd, %FORM_TopMid), 0, rc.nBottom)
CALL InvalidateRect(hWnd, rc, 0)
CALL UpdateWindow(hWnd)
EXIT FUNCTION
END IF
CASE %WM_ERASEBKGND
FUNCTION = 1: EXIT FUNCTION
CASE %WM_PAINT
BeginPaint(hWnd, ps)
CALL zPaintDoubleBuffer(hWnd, ps.hDC)
CALL EndPaint(hWnd, ps)
FUNCTION = 0: EXIT FUNCTION
CASE %WM_DESTROY
' // Remove all image resource from memory
' // Must be done just before to exit the main program in case zAddResource
' // has been used to store image handles that are not tied to a specific control.
' // For example: Image used in an ownerdrawn menu.
CALL zRemoveAllImageResource()
' // Delete Image, Bitmap and DC matching this window
CALL zDestroyWindowResource(hWnd)
CALL PostQuitMessage(0)
FUNCTION = 0: EXIT FUNCTION
' //START AERO section ---------------------------------------------------------
CASE %WM_TIMER
IF wParam = %CAROUSEL_TIMER THEN
CALL DrawCarousel()
ELSEIF wParam = %BLINK_TIMER THEN
CALL ButtonBlink(%ID_BTN_Play, 0)
FUNCTION = 0: EXIT FUNCTION
ELSE
IF zDwmIsCompositionEnabled() = 0 THEN
IF SK_AEROEMULATE() AND zIsAeroLayered() THEN
IF zIsLButtonDown() = 0 THEN IsMoving = 0
IF IsMoving = 0 OR (zIsLButtonDown() AND IsMoving) THEN
CALL GetWindowRect(hWnd, rc)
CALL zMoveBackground(rc.nLeft, rc.nTop)
CALL zUpdateWindow(hWnd, 0)
END IF
END IF
END IF
END IF
CASE %WM_NCLBUTTONDOWN
IsMoving = -1
CASE %WM_MOVING
IF zDwmIsCompositionEnabled() = 0 THEN
IF SK_AEROEMULATE() AND zIsAeroLayered() THEN
DIM rw AS RECT PTR
rw = lparam
CALL zMoveBackground(@rw.nLeft,@rw.nTop)
CALL zUpdateWindow(hWnd, 0)
FUNCTION = 1: EXIT FUNCTION
END IF
END IF
' //END AERO section ---------------------------------------------------------
END SELECT
FUNCTION = zDefWindowProc(hWnd, Msg, wParam, lParam)
END FUNCTION
SUB PlayCarousel()
CALL ShowWindow(zGetMainItem(%ID_BTN_PLAY), %SW_HIDE): CALL zSetZorder(zGetMainItem(%ID_BTN_PLAY), %HWND_BOTTOM)
CALL ShowWindow(zGetMainItem(%ID_BTN_PAUSE), %SW_SHOW): CALL zSetZorder(zGetMainItem(%ID_BTN_PAUSE), %HWND_TOP)
IF LBOUND(gSpriteData) < 1 THEN
CALL LoadSprites()
gAnimate = -1
ELSE
gAnimate = -1
END IF
END SUB
SUB LoadSprites()
DIM gSpriteData(1 TO %ID_MAX_SPRITE) AS SpriteDataStruct
DIM zorder(1 TO %ID_MAX_SPRITE) AS LONG
DIM faceorder(1 TO %ID_MAX_SPRITE) AS LONG
gSpriteData(01).ImageName = zsExePath() + "guide.png"
gSpriteData(02).ImageName = zsExePath() + "photoshop.png"
gSpriteData(03).ImageName = zsExePath() + "mac.png"
gSpriteData(04).ImageName = zsExePath() + "msn.png"
gSpriteData(05).ImageName = zsExePath() + "quicktime.png"
gSpriteData(06).ImageName = zsExePath() + "fileprint.png"
gSpriteData(07).ImageName = zsExePath() + "mail.png"
gSpriteData(08).ImageName = zsExePath() + "ecran.png"
gSpriteData(09).ImageName = zsExePath() + "babelfish.png"
gSpriteData(10).ImageName = zsExePath() + "burner.png"
StepAngle& = 360 / %ID_MAX_SPRITE
UseRotate& = zGetCheckButtonStatus(zGetMainItem(%ID_SELFROTATION))
FOR K& = 1 TO %ID_MAX_SPRITE
IF UseRotate& = 0 THEN
gSpriteData(K&).hBitmap = ZI_CreateMirrorBitmapFromFile(gSpriteData(K&).ImageName, bmW&, bmH&)
ELSE
gSpriteData(K&).hBitmap = ZI_CreateBitmapFromFile(gSpriteData(K&).ImageName, bmW&, bmH&)
END IF
gSpriteData(K&).ID = K&
gSpriteData(K&).nWidth = bmW&
gSpriteData(K&).nHeight = bmH&
gSpriteData(K&).rAngle = AngleStep&
CALL ZD_DrawBitmapToCtrl(zGetMainItem(%ID_CTRL), gSpriteData(K&).xPos, gSpriteData(K&).yPos, _
gSpriteData(K&).hBitmap, &HFFFFFFFF, gSpriteData(K&).ID, %ZS_VISIBLE)
AngleStep& = AngleStep& + StepAngle&
CALL ZD_UsePngOpacity(K&, %TRUE)
NEXT
LOCAL rc AS RECT
CALL GetClientRect(zGetMainItem(%ID_CTRL), rc)
CALL ZD_DrawTextToCtrl(zGetMainItem(%ID_CTRL), _
"No DirectX, no OpenGL, no WPF, just plain lean GDImage ...", _
rc.nRight, _ ' X coordinate
10, _ ' Y coordinate
ZD_ColorARGB(128, RGB(255,255,255)), _ ' ARGB color
"Times New Roman", _ ' True Type Font to use
40, _ ' Font size in pixel
%ID_OBJECT_TEXT, _ ' Unique object ID
%ZS_HIDDEN, _ ' Hidden
0, _ ' No shadow
0) ' Optional string format
CALL ZD_GetObjectBound(%ID_OBJECT_TEXT, gnBoundWidth, gnBoundHeight)
END SUB
SUB DrawCarousel()
IF gAnimate THEN
LOCAL K, x, y AS LONG, rAngle AS SINGLE, rc AS RECT
DIM zorder(1 TO %ID_MAX_SPRITE) AS LONG
DIM faceorder(1 TO %ID_MAX_SPRITE) AS LONG
y& = zGetTrackValue(zGetMainItem(%ID_TRACK_Y)) ' Default = 50
speed! = zGetTrackValue(zGetMainItem(%ID_TRACK_SPEED)) / 4
fl! = zGetTrackValue(zGetMainItem(%ID_TRACK_FOCAL)) / 100 ' Default = 150
IF fl! < .02 THEN fl! = 0.001
PiDiv180# = 1.74532925199433E-2#
CALL GetClientRect(zGetMainItem(%ID_CTRL), rc)
xcenter& =(rc.nRight - 128) / 2
ycenter& =(rc.nBottom - 128) / 2
zcenter& = ycenter& / 2
radius& = rc.nRight / 3.675 ' 160
FOR K = %ID_MAX_SPRITE TO 1 STEP -1
rAngle = gSpriteData(K).rAngle: anglePi! = rAngle * PiDiv180#
z! = SIN(anglePi!) * radius& + zcenter&
scale! = fl! / (fl! + z!)
x& = COS(anglePi!) * radius&
gSpriteData(K).xPos = x& * scale! + xcenter&
gSpriteData(K).yPos = y& * scale! + ycenter& - y&
'xscale!= scale! * 100: yscale! = xscale!
zorder(K) = rAngle - 90: IF zorder(K) > 180 THEN zorder(K) = 360 - zorder(K)
faceorder(K) = K
IF gMoveToLeft THEN
rAngle = rAngle - speed!
IF rAngle < 1 THEN rAngle = 360
ELSE
rAngle = rAngle + speed!
IF rAngle > 359 THEN rAngle = rAngle - 360
END IF
gSpriteData(K).rAngle = rAngle
' Compute the scale factor
IF zGetCheckButtonStatus(zGetMainItem(%ID_USE3D)) THEN
CALL ZD_SetObjectScale(gSpriteData(K).ID, (ABS(zorder(K)) MOD 182) * 0.0027777 + .5)
ELSE
CALL ZD_SetObjectScale(gSpriteData(K).ID, 1)
END IF
' Switch the Alpha channel accordingly
IF zGetCheckButtonStatus(zGetMainItem(%ID_OPACITY)) AND fl! > .999 THEN
CALL ZD_SetObjectAlpha(gSpriteData(K).ID, MIN&(100 * scale!, 255), %FALSE)
ELSE
CALL ZD_SetObjectAlpha(gSpriteData(K).ID, 255, %FALSE)
END IF
CALL ZD_SetObjectXY(gSpriteData(K).ID, gSpriteData(K).xPos, gSpriteData(K).yPos, %FALSE)
IF zGetCheckButtonStatus(zGetMainItem(%ID_SELFROTATION)) THEN
CALL ZD_SetObjectAngle(gSpriteData(K).ID, CLNG(gSpriteData(K).rAngle), %FALSE)
ELSE
CALL ZD_SetObjectAngle(gSpriteData(K).ID, 0, %FALSE)
END IF
NEXT
' Compute the current Z-order
ARRAY SORT zorder(), TAGARRAY faceorder()
' Set the Sprite's Z-order
K = faceorder(1)
IF gMoveToLeft THEN
K = K + 1: IF K > %ID_MAX_SPRITE THEN K = 1
END IF
CALL ZD_SetObjectZorder(gSpriteData(K).ID, %ZD_ORDER_BOTTOM)
CALL ZD_SetObjectZorder(gSpriteData(faceorder(%ID_MAX_SPRITE)).ID, %ZD_ORDER_TOP)
IF zGetCheckButtonStatus(zGetMainItem(%ID_MARQUEE)) THEN CALL DrawMarquee(rc.nRight)
' Update the control display
CALL ZI_UpdateWindow(zGetMainItem(%ID_CTRL), 0)
END IF
END SUB
SUB DrawMarquee(BYVAL nRight AS LONG)
LOCAL x, y AS LONG
CALL ZD_GetObjectXY(%ID_OBJECT_TEXT, x, y)
x = x - 2
IF x < - gnBoundWidth THEN x = nRight
CALL ZD_SetObjectXY(%ID_OBJECT_TEXT, x, y, %ZD_DRAW_DEFERRED)
END SUB
SUB ButtonBlink(BYVAL ID AS LONG, BYVAL nStop AS LONG)
LOCAL hBut, Img, ImgW, ImgH, ButtonStyle, hDC, graphics, UseTimer AS LONG
LOCAL rw AS RECT
LOCAL lp AS POINTAPI
STATIC UseState AS LONG
INCR gBlinkCount
hBut = zGetMainItem(ID) ' // %ID_BTN_Select
Img = zGetButImageProperty(hBut)
CALL GetWindowRect(hBut, rw)
lp.x = rw.nLeft: lp.y = rw.nTop
CALL ScreenToClient(zMainwindow(0), lp)
IF UseState < 5 THEN UseState = 5 ELSE UseState = 1
IF nStop THEN UseState = 1
hDC = GetDC(zMainwindow(0))
IF GdipCreateFromHDC(hDC, graphics) = 0 THEN
CALL zPaintButton(graphics, UseState, Img, lp.X, lp.Y, rw.nRight - rw.nLeft, rw.nBottom - rw.nTop, %BS_PUSHBUTTON)'ButtonStyle)
CALL GdipDeleteGraphics(graphics)
END IF
CALL ReleaseDC(zMainwindow(0), hDC)
'IF ID = %ID_BTN_User THEN
' UseTimer = %BLINK_USER: gBlinkCount = 1
'ELSE
UseTimer = %BLINK_TIMER
'END IF
IF gBlinkCount > 29 OR nStop THEN
gBlinkCount = 0: CALL KillTimer(zMainWindow(0), UseTimer)
END IF
END SUB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -