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

📄 reflect.bas

📁 Powerbasic 对GDI 的操作 很漂亮的代码!
💻 BAS
📖 第 1 页 / 共 3 页
字号:
          CALL zSetCTLFont(hStatus&, zDefaultFont)

        ' Show the main window
          CALL ShowWindow(hMain, iCmdShow)
          CALL SetForegroundWindow(hMain)                  ' Slightly Higher Priority
          CALL SetFocus(hCtrl)                             ' Sets Keyboard Focus To The Window

          WHILE GetMessage(Msg, %NULL, 0, 0)
              IF IsDialogMessage(hMain, Msg) = %FALSE THEN
                 CALL TranslateMessage(msg)                ' Translate The Message
                 CALL DispatchMessage(msg)                 ' Dispatch The Message
              END IF
          WEND

          CALL zDeleteObject(zCaptionFont) ' Delete the caption font

          FUNCTION = msg.wParam
       END IF

     ' UNLOAD the WinXP Theme DLL (if necessary)
       IF hWinXP_Lib THEN CALL FreeLibrary(hWinXP_Lib)

    END IF
'
    IF hMutex THEN CALL CloseHandle(hMutex)
'
END FUNCTION

SUB GetSpriteFromFile(BYVAL hCtrl AS LONG)
    LOCAL rc AS RECT
    LOCAL k AS LONG, x AS LONG, y AS LONG

    CALL ZI_GetBitmapSize(ZI_GetBMP(hCtrl), useWidth&, useHeight&)

    DIM hBitmap(1 TO 4)

    hBitmap(1) = ZI_CreateMirrorBitmapFromFile("tophat.png", bmW&, bmH&)
    CALL ZD_DrawBitmapToCtrl(hCtrl, 120, 54, hBitmap(1), &HFFFFFFFF, %ID_OBJECT_SPRITE + 1, %ZS_VISIBLE)
    CALL ZD_SetObjectImageLabel(%ID_SPRITE1, ("tophat.png"))
    IF useWidth& THEN CALL ZD_SetObjectScroll(%ID_SPRITE1, %TRUE)
    CALL ZD_UsePngOpacity(%ID_SPRITE1, %TRUE)

    hBitmap(2) = ZI_CreateMirrorBitmapFromFile("tube.png", bmW&, bmH&)
    CALL ZD_DrawBitmapToCtrl(hCtrl, 12, 247, hBitmap(2), &HFFFFFFFF, %ID_OBJECT_SPRITE + 2, %ZS_VISIBLE)
    CALL ZD_SetObjectImageLabel(%ID_SPRITE2, ("tube.png"))
    IF useWidth& THEN CALL ZD_SetObjectScroll(%ID_SPRITE2, %TRUE)
    CALL ZD_UsePngOpacity(%ID_SPRITE2, %TRUE)

    hBitmap(3) = ZI_CreateMirrorBitmapFromFile("mirror.png", bmW&, bmH&)
    CALL ZD_DrawBitmapToCtrl(hCtrl, 136, 300, hBitmap(3), &HFFFFFFFF, %ID_OBJECT_SPRITE + 3, %ZS_VISIBLE)
    CALL ZD_SetObjectImageLabel(%ID_SPRITE3, ("mirror.png"))
    IF useWidth& THEN CALL ZD_SetObjectScroll(%ID_SPRITE3, %TRUE)
    CALL ZD_UsePngOpacity(%ID_SPRITE3, %TRUE)

    hBitmap(4) = ZI_CreateMirrorBitmapFromFile("goodwine.png", bmW&, bmH&)
    CALL ZD_DrawBitmapToCtrl(hCtrl, 270, 247, hBitmap(4), &HFFFFFFFF, %ID_OBJECT_SPRITE + 4, %ZS_VISIBLE)
    CALL ZD_SetObjectImageLabel(%ID_SPRITE4, ("goodwine.png"))
    IF useWidth& THEN CALL ZD_SetObjectScroll(%ID_SPRITE4, %TRUE)
    CALL ZD_UsePngOpacity(%ID_SPRITE4, %TRUE)

END SUB

SUB GDImageLoadFile(BYVAL hWnd AS LONG, BYVAL sFileName AS STRING)
    IF LEN(sFileName) THEN
       LOCAL hCtrl AS LONG, x AS LONG, y AS LONG, Item AS LONG
       LOCAL Path AS STRING, FilName AS STRING

       INCR ChangeItem: IF ChangeItem > UBOUND(hBitmap) THEN ChangeItem = LBOUND(hBitmap)
       Item = %ID_OBJECT_SPRITE + ChangeItem

       hCtrl = GetDlgItem(hWnd, %ID_CTRL)
       CALL ZI_GetBitmapSize(ZI_GetBMP(hCtrl), useWidth&, useHeight&)

       CALL ZD_GetObjectXY(Item, x, y)
       CALL zDeleteObject(hBitmap(ChangeItem))
       hBitmap(ChangeItem) = ZI_CreateMirrorBitmapFromFile((sFileName), bmW&, bmH&)
       CALL ZD_DrawBitmapToCtrl(hCtrl, x, y, hBitmap(ChangeItem), &HFFFFFFFF, Item, %ZS_VISIBLE)

       CALL zSplitN(sFileName, Path, FilName)
       CALL ZD_SetObjectZorder(Item, %ZD_ORDER_BOTTOM)
       CALL ZD_SetObjectImageLabel(Item, (FilName))
       IF useWidth& THEN CALL ZD_SetObjectScroll(Item, %TRUE)
       CALL ZD_UsePngOpacity(Item, %TRUE)

       CALL ZI_UpdateWindow(hCtrl, 0)
    END IF
END SUB

FUNCTION WndProc(BYVAL hWnd AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG

    LOCAL rc AS RECT, ps AS PAINTSTRUCT
    LOCAL ObjectID AS LONG , x AS LONG, y AS LONG, hCtrl AS LONG
    STATIC StartFromExePath AS LONG

    SELECT CASE Msg

    CASE %WM_GETMINMAXINFO 'Set minimum and naximum dialog size
         LOCAL MinMax AS MINMAXINFO PTR
         MinMax = lParam
       ' Window Extended Style
         dwExStyle& = %WS_EX_APPWINDOW OR %WS_EX_WINDOWEDGE
       ' Windows Style
         dwStyle& = %WS_OVERLAPPEDWINDOW
         CALL SetRect(rc, 0, 0, %UseWidth, %UseHeight)
         CALL AdjustWindowRectEx(rc, dwStyle&, %FALSE, dwExStyle&) ' Adjust Window To True Requested Size
         @MinMax.ptMinTrackSize.x = rc.nRight - rc.nLeft
         @MinMax.ptMinTrackSize.y = rc.nBottom - rc.nTop
         FUNCTION = 0: EXIT FUNCTION

    CASE %WM_CTLCOLORSTATIC
         SELECT CASE LONG GetDlgCtrlID(lParam)
         CASE %ID_STA_Help
            CALL SetTextColor(wParam, RGB(2,77,220))
            CALL SetBkMode(wParam, %TRANSPARENT)

          ' Use a custom background for the help control
            CALL GetClientRect(GetDlgItem(hWnd, %ID_STA_Help), rc)
            CALL ZI_GradientPaintDC(wParam, 0, 0, rc.nRight, rc.nBottom, RGB(228,227,255), RGB(188,187,211))
            hPen& = CreatePen(0, 1, RGB(128,128,192))
            OldPen& = SelectObject(wParam, hPen&)
            CALL SelectObject(wParam, GetStockObject(%NULL_BRUSH))
            CALL RoundRect(wParam, 0, 0, rc.nRight, rc.nBottom, 8, 8)
            CALL SelectObject(wParam, OldPen&)
            CALL zDeleteObject(hPen&)

            EXIT FUNCTION
         CASE %ID_BTN_CHECK
            CALL SetBkMode(wParam, %TRANSPARENT)

          ' Use a custom background for the Check control
            CALL GetClientRect(GetDlgItem(hWnd, %ID_BTN_CHECK), rc)
            CALL ZI_GradientPaintDC(wParam, 0, 0, rc.nRight, rc.nBottom, RGB(179,178,198), RGB(176,175,196))
            CALL SelectObject(wParam, GetStockObject(%NULL_BRUSH))

            EXIT FUNCTION
         END SELECT

    CASE %WM_SIZE
         IF wParam <> %SIZE_MINIMIZED THEN
          ' Move Status bar
            hStatus& = GetDlgItem(hWnd, %ID_STATUSBAR)
            IF hStatus& THEN CALL SendMessage(hStatus&, Msg, wParam, lParam)
         END IF

    CASE %WM_COMMAND
         SELECT CASE LONG LOWRD(wParam)
         CASE %ID_BTN_CHECK

         CASE %ID_BTN_LOAD
              ' Start from the EXE path folder only once per session
              IF StartFromExePath = 0 THEN
                 StartFromExePath = -1: CALL zSplitN(zExename, Path$, FilName$)
                 CALL ZI_LoadSavePath((Path$), 1)
              END IF
              CALL GDImageLoadFile(hWnd, ZI_LoadDialog(hWnd))
         END SELECT

    CASE %WM_ERASEBKGND
         CALL GetClientRect (hWnd, rc)
         CALL ZI_GradientPaintDC(wParam, 0, 0, rc.nRight, rc.nBottom, RGB(228,227,227), RGB(168,167,191))
         FUNCTION = 1: EXIT FUNCTION

    CASE %WM_PAINT
         BeginPaint(hWnd, ps)
         CALL EndPaint(hWnd, ps)
         FUNCTION = 0: EXIT FUNCTION

    CASE %WM_DESTROY
         IF LBOUND(hBitmap)> 0 THEN
            FOR K& = LBOUND(hBitmap) TO UBOUND(hBitmap): CALL zDeleteObject(hBitmap(K&)): NEXT
         END IF
         CALL PostQuitMessage(0)
         FUNCTION = 0: EXIT FUNCTION
    END SELECT
    FUNCTION = DefWindowProc(hWnd, Msg&, wParam&, lParam&)
END FUNCTION

FUNCTION MyCallBack(BYVAL hWnd AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
    LOCAL sMessage AS STRING, ObjectID AS LONG, rc AS RECT, nRet AS LONG
    LOCAL x AS LONG, y AS LONG

    nRet = %FALSE ' Do not stop the event processing in GDImage

    IF hWnd = GetDlgItem(hMain, %ID_CTRL) THEN ' In case we use the same callback for several GDImage control
                                               ' make sure that we handle the good one.
       SELECT CASE LONG Msg

       CASE %WM_LBUTTONDOWN
            ObjectID = ZI_MouseOverObjectID()
            IF ObjectID = GetDlgCtrlID(hWnd) THEN LabelIs$ = $Background ELSE LabelIs$ = ZD_GetObjectImageLabel(ObjectID)
            sMessage = "WM_LBUTTONDOWN on object" + str$(ObjectID) + " >" + LabelIs$ + "<"
            CALL SetWindowText(GetDlgItem(hMain, %ID_STATUSBAR), (sMessage))

       CASE %WM_RBUTTONDOWN
            ObjectID = ZI_MouseOverObjectID()
            IF ObjectID = GetDlgCtrlID(hWnd) THEN LabelIs$ = $Background ELSE LabelIs$ = ZD_GetObjectImageLabel(ObjectID)
            sMessage = "WM_RBUTTONDOWN on object" + str$(ObjectID) + " >" + LabelIs$ + "< at location" + str$(LOWRD(lParam))+","+str$(HIWRD(lParam))
            CALL SetWindowText(GetDlgItem(hMain, %ID_STATUSBAR), (sMessage))

       CASE %WM_MOUSEMOVE
            ObjectID = ZI_GetMovingSpriteID()
            IF ObjectID THEN
             ' Does %ID_BTN_CHECK is checked ?
               IF SendMessage(GetDlgItem(GetParent(hWnd), %ID_BTN_CHECK), %BM_GETCHECK, 0, 0) THEN
                  x = LOWRD(lParam): y = HIWRD(lParam)
                  xCurrentScroll& = ZI_GetProperty(hWnd, %ZI_Horizontal)
                  yCurrentScroll& = ZI_GetProperty(hWnd, %ZI_Vertical)
                  ZD_GetObjectXY(ObjectID, x1&, y1&)
                  ZD_GetObjectXYcapture(ObjectID, xCapture&, yCapture&)
                  DX& = (x - xCapture& +  xCurrentScroll&) - x1&
                  DY& = (y - yCapture& +  yCurrentScroll&) - y1&
                  FOR ID& = %ID_FIRST TO %ID_LAST
                      IF ID& <> ObjectID THEN
                         CALL ZD_GetObjectXY(ID&, x, y)
                       ' Add the DX,DY offset
                         CALL ZD_SetObjectXY(ID&, x + DX&, y + DY&, %ZD_DRAW_DEFERRED) ' Move, without immediate redraw
                      END IF
                  NEXT
                ' Note: The display's refresh is yeld by the default GDImage WM_MOUSE event
               END IF
            END IF

       CASE %WM_KEYDOWN
            ObjectID = ZI_GetObjectFocusID()

            IF ObjectID THEN
               CALL ZD_GetObjectXY(ObjectID, x, y)
               x1& = x ' Make a copy to keep the orignal x location unchanged
               y1& = y ' Make a copy to keep the orignal y location unchanged

             ' Check accelerator keys to compute the step range
               IF ZI_IsCtrlKeyPressed THEN
                  UseStep& = 4
                  IF ZI_IsShiftKeyPressed THEN UseStep& = 16
               ELSEIF ZI_IsShiftKeyPressed THEN
                  UseStep& = 2
               ELSE
                  UseStep& = 1
               END IF

               IF ZD_GetObjectScroll(ObjectID) THEN ' If object scroll with the bitmap background
                ' Get the size of the bitmap background
                  CALL ZI_GetBitmapSize(ZI_GetBMP(GetDlgItem(hMain, %ID_CTRL)), useWidth&, useHeight&)
               ELSE
                ' Get the control client size
                  CALL GetClientRect(GetDlgItem(hMain, %ID_CTRL), rc)
                  useWidth& = rc.nRight: useHeight& = rc.nBottom
               END IF
             ' Get the sprite object size
               CALL ZD_GetObjectBound(ObjectID, BoundWidth&, BoundHeight&)

               x2Div2& = (BoundWidth& \ 2): y2Div2& = BoundHeight& \ 2

               SELECT CASE wParam
               CASE %VK_HOME
                    x1& = 0
               CASE %VK_END
                    x1& = MAX&(useWidth& - BoundWidth&, 0)
               CASE %VK_PRIOR
                    y1& = 0
               CASE %VK_NEXT
                    y1& = MAX&(useHeight& - BoundHeight&, 0)
               CASE %VK_LEFT, %VK_NUMPAD4
                    IF x1& > -x2Div2& THEN x1& = MAX&(x1& - UseStep&, -x2Div2&)
               CASE %VK_UP, %VK_NUMPAD8
                    IF y1& > -y2Div2& THEN y1& = MAX&(y1& - UseStep&, -y2Div2&)
               CASE %VK_RIGHT, %VK_NUMPAD6
                    IF x1& < useWidth& - x2Div2& THEN
                       x1& = MIN&(x1& + UseStep&, useWidth& - x2Div2&)
                    END IF
               CASE %VK_DOWN, %VK_NUMPAD2
                    IF y1& < useHeight& - y2Div2& THEN
                    y1& = MIN&(y1& + UseStep&, useHeight& - y2Div2&)
                    END IF
               END SELECT

               IF x <> x1& OR y <> y1& THEN
                  x = x1&: y = y1&
                  CALL ZD_SetObjectXY(ObjectID, x1&, y1&, %TRUE)
               END IF
               sMessage = "Object" + str$(ObjectID) + " coordinates" + str$(x&)+","+str$(y&)
               CALL SetWindowText(GetDlgItem(hMain, %ID_STATUSBAR), (sMessage))

            END IF
       END SELECT
    END IF

    FUNCTION = nRet
END FUNCTION

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -