⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 carousel.bas

📁 Powerbasic 对GDI 的操作 很漂亮的代码!
💻 BAS
📖 第 1 页 / 共 3 页
字号:
'        // 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 + -