FIREIMAGE with SCROLL

Started by Israel Vega Alvarez, July 29, 2012, 12:59:06 AM

Previous topic - Next topic

Israel Vega Alvarez

Somebody have a sample using FIREIMAGE control with SCROLL?

I was found this code but using GRAPHIC but i not know how adapter to FIREIMAGE control:


#DIM ALL
#INCLUDE "win32API.inc"

GLOBAL hHook???
FUNCTION HookGFXWindow(BYVAL lMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
  IF lMsg = %HCBT_CREATEWND THEN                    ' wParam = handle of Window about to be created
    UnhookWindowsHookEx hHook
    SetWindowLong wParam, %GWL_STYLE, (GetWindowLong (wParam, %GWL_STYLE) OR %WS_VSCROLL OR %WS_HSCROLL)
  END IF
FUNCTION = 0
END FUNCTION
'------------------/HookGFXWindow

FUNCTION GWProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, _
                BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
LOCAL  oldProc AS DWORD
STATIC hBmp    AS DWORD
STATIC GW      AS Rect
STATIC BmpSz, GWSz, siLn AS POINTAPI
STATIC hsi AS SCROLLINFO, vsi AS SCROLLINFO

  SELECT CASE AS LONG wMsg
    CASE %WM_USER + 1000
      GetClientRect hWnd, GW                        ' Get Graphic Window size
      GWSz.x = GW.nRight : GWSz.y = GW.nBottom
      hBmp  = wParam                                ' BitMap Handle and Size (passed from PBMain)
      BmpSz.x = LO(WORD, lParam) : BmpSz.y = HI(WORD, lParam)

      siLn.X = 0.1 * GWSz.x ' 10% of page           ' define 'line width' ie move increment
      siLn.Y = 0.1 * GWSz.y ' 10% of page

      hsi.cbsize = SIZEOF(hsi)
      hsi.nMin   = 0
      hsi.nPage  = GWSz.x
      hsi.fMask  = %SIF_ALL '%SIF_Range Or %SIF_Page
      hsi.nMax   = BmpSz.x
      SetScrollInfo hWnd, %SB_HORZ, hsi, 1          ' initialize Horizontal ScrollInfo structure

      vsi = hsi
      vsi.nPage  = GWSz.y
      vsi.nMax   = BmpSz.y
      SetScrollInfo hWnd, %SB_VERT, vsi, 1          ' initialize Vertical ScrollInfo structure

      GRAPHIC ATTACH hWnd, 0
      GRAPHIC COPY hBmp, 0, (hsi.nPos, vsi.nPos)-(hsi.nPos + GWSz.x-1, vsi.nPos + GWSz.y-1) TO (0,0)

    CASE %WM_HSCROLL
      SELECT CASE LO(WORD, wParam)
        CASE %SB_LINELEFT   : hsi.nPos = hsi.nPos - siLn.X
        CASE %SB_LINERIGHT  : hsi.nPos = hsi.nPos + siLn.X
        CASE %SB_PAGELEFT   : hsi.nPos = hsi.nPos - GWSz.x
        CASE %SB_PAGERIGHT  : hsi.nPos = hsi.nPos + GWSz.x
        CASE %SB_LEFT       : hsi.nPos = 0
        CASE %SB_RIGHT      : hsi.nPos = BmpSz.x - GWSz.x
        CASE %SB_THUMBTRACK : hsi.nPos = HI(WORD, wParam)
        CASE ELSE           : EXIT FUNCTION
      END SELECT
      hsi.nPos = MAX(hsi.nPos, 0): hsi.nPos = MIN(hsi.nPos, BmpSz.x - GWSz.x)
      hsi.fMask = %SIF_POS
      SetScrollInfo hWnd, %SB_HORZ, hsi, 1

      GRAPHIC ATTACH hWnd, 0
      GRAPHIC COPY hBmp, 0, (hsi.nPos, vsi.nPos)-(hsi.nPos + GWSz.x-1, vsi.nPos + GWSz.y-1) TO (0,0)

    CASE %WM_VSCROLL
      SELECT CASE LO(WORD, wParam)
        CASE %SB_LINEUP     : vsi.nPos = vsi.nPos - siLn.Y
        CASE %SB_LINEDOWN   : vsi.nPos = vsi.nPos + siLn.Y
        CASE %SB_PAGEUP     : vsi.nPos = vsi.nPos - GWSz.y
        CASE %SB_PAGEDOWN   : vsi.nPos = vsi.nPos + GWSz.y
        CASE %SB_THUMBTRACK : vsi.nPos = HI(WORD, wParam)
        CASE ELSE           : EXIT FUNCTION
      END SELECT
      vsi.nPos = MAX(vsi.nPos, 0): vsi.nPos = MIN(vsi.nPos, BmpSz.y - GWSz.y)
      vsi.fMask = %SIF_POS
      SetScrollInfo hWnd, %SB_VERT, vsi, 1

      GRAPHIC ATTACH hWnd, 0
      GRAPHIC COPY hBmp, 0, (hsi.nPos, vsi.nPos)-(hsi.nPos + GWSz.x-1, vsi.nPos + GWSz.y-1) TO (0,0)

    CASE %WM_MOUSEWHEEL
     LOCAL zDelta AS INTEGER
      zDelta = HI(WORD, wParam)

      IF (LO(WORD, wParam) AND %MK_CONTROL) = %MK_CONTROL THEN  ' horizontal scroll (Ctrl key down)
        IF zDelta > 0 THEN                                      ' scroll to the left
          SendMessage hWnd, %WM_HSCROLL, MAK(LONG, %SB_LINELEFT, 0), 0
        ELSE                                                    ' scroll to the right
          SendMessage hWnd, %WM_HSCROLL, MAK(LONG, %SB_LINERIGHT, 0), 0
        END IF
      ELSE                                                      ' vertical scroll
        IF zDelta > 0 THEN                                      ' scroll upwards
          SendMessage hWnd, %WM_VSCROLL, MAK(LONG, %SB_LINEUP, 0), 0
        ELSE                                                    ' scroll downwards
          SendMessage hWnd, %WM_VSCROLL, MAK(LONG, %SB_LINEDOWN, 0), 0
        END IF
      END IF

  END SELECT
oldProc  = GetProp (hWnd, "OldGWProc")
FUNCTION = CallWindowProc(oldProc, hWnd, wMsg, wParam, lParam)
END FUNCTION
'------------------/GWProc

FUNCTION PBMAIN() AS LONG
LOCAL BmpSz        AS POINTAPI
LOCAL hBmp, hGWin  AS DWORD
LOCAL xSize&, ySize&, ImageFile$, nFile&, k$

  xSize& = 400 : ySize& = 400                       ' Graphic Window size

  ImageFile$ = "C:\sample.bmp"  ' <<- select an image bigger than the window for scrolling to work.

  nFile& = FREEFILE
  OPEN ImageFile$ FOR BINARY ACCESS READ AS nFile&  ' get the size of the image
    GET #nFile&, 19, BmpSz.x
    GET #nFile&, 23, BmpSz.y
  CLOSE nFile&

  ' Create a Graphic Bitmap and load the image
  GRAPHIC BITMAP LOAD ImageFile$, BmpSz.x, BmpSz.y TO hBmp

  ' create a window to display the part image in the screen (hook it to add scrollbars)
  hHook = SetWindowsHookEx(%WH_CBT, CODEPTR(HookGFXWindow), GetModuleHandle(""), 0)
  GRAPHIC WINDOW "Test - Graphic Window scrolling", 200, 200, ySize&, xSize& TO hGWin

  ' SubClass the GW to get access to scroll info
  SetProp hGWin, "OldGWProc", SetWindowLong(hGWin, %GWL_WNDPROC, CODEPTR(GWProc))

  ' Pass hBmp and size to GWProc, set up SCROLLINFO structures
  PostMessage hGWin, %WM_USER + 1000, hBmp, MAK(LONG, BmpSz.x, BmpSz.y)

  GRAPHIC ATTACH hGWin, 0
  GRAPHIC PRINT "No bitmap loaded"

  WHILE ISWIN(hGWin)
    GRAPHIC INKEY$ TO k$                            ' Capture arrow keys etc
    SELECT CASE LEN(k$)
      CASE 0                                        ' No keys pressed
        DIALOG DOEVENTS
      CASE 1                                        ' ASCII Key pressed
        IF k$ = $ESC OR k$="q" OR k$="Q" THEN
          EXIT LOOP
        END IF
      CASE 2                                        ' Extended key pressed - NB not number pad *
       LOCAL vScroll??, hScroll??, wScrollNotify??
        SELECT CASE ASC(RIGHT$(k$,1))
          CASE 72 : vScroll = 1 : hScroll = 0 : wScrollNotify = %SB_LINEUP    ' Up Arrow
          CASE 80 : vScroll = 1 : hScroll = 0 : wScrollNotify = %SB_LINEDOWN  ' Down arrow
          CASE 73 : vScroll = 1 : hScroll = 0 : wScrollNotify = %SB_PAGEUP    ' Page up        *
          CASE 81 : vScroll = 1 : hScroll = 0 : wScrollNotify = %SB_PAGEDOWN  ' Page down      *
          CASE 77 : hScroll = 1 : vScroll = 0 : wScrollNotify = %SB_LINERIGHT ' Right arrow
          CASE 75 : hScroll = 1 : vScroll = 0 : wScrollNotify = %SB_LINELEFT  ' Left arrow
          CASE 71 : hScroll = 1 : vScroll = 0 : wScrollNotify = %SB_LEFT      ' Home           *
          CASE 79 : hScroll = 1 : vScroll = 0 : wScrollNotify = %SB_RIGHT     ' End            *
        END SELECT
        IF vScroll THEN SendMessage(hGWin, %WM_VSCROLL, MAK(LONG, wScrollNotify, 0), 0)
        IF hScroll THEN SendMessage(hGWin, %WM_HSCROLL, MAK(LONG, wScrollNotify, 0), 0)
    END SELECT
  WEND

  RemoveProp hGWin, "OldGWroc"
  GRAPHIC ATTACH hBmp, 0
  GRAPHIC BITMAP END
END FUNCTION



Israel

José Roca

No, this control has not scroll features, but Paul is going to add a dedicated graphic control to Firefly using my graphic control. It is resizable, stretchable and scrollable (scrollbars appear and disappear as needed) and GDI+ aware.

A little example:


' ########################################################################################
' Microsoft Windows
' File: CW_GraphCtxSkeleton.pbtpl
' Contents: Template - CWindow Graphic Control Skeleton
' Compilers: PBWIN 10.02+, PBCC 6.02+
' Headers: Windows API headers 2.03+
' Copyright (c) 2011 Jose Roca. Freeware. Use at your own risk.
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
' ########################################################################################
#COMPILE EXE
#DIM ALL
%UNICODE = 1

' // Header files for imported files
%USEGRAPHCTX = 1
#INCLUDE ONCE "CWindow.inc"   ' // CWindow class

%IDC_GRCTX = 1001

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS WSTRINGZ PTR, BYVAL nCmdShow AS LONG) AS LONG

   ' // Set process DPI aware
   IF AfxGetWindowsVersion => 6 THEN SetProcessDPIAware

   ' // Create an instance of the CWindow class
   LOCAL pWindow AS IWindow
   pWindow = CLASS "CWindow"
   IF ISNOTHING(pWindow) THEN EXIT FUNCTION

   ' // Create the main window
   pWindow.CreateWindow(%NULL, "CWindow Graphic Control Skeleton", 0, 0, 0, 0, 0, 0, CODEPTR(WindowProc))
   ' // Set the client size
   pWindow.SetClientSize 600, 350
   ' // Center the window
   pWindow.CenterWindow

   ' // Add a GDI+ aware graphic control
   LOCAL hCtl AS DWORD
   hCtl = pWindow.AddGraphCtx(pWindow.hwnd, %IDC_GRCTX, "", 0, 0, pWindow.ClientWidth, pWindow.ClientHeight)
   SetFocus hCtl

   ' // Capture the desktop window and display it in the control
   LOCAL hBitmap AS DWORD
   hBitmap = AfxCaptureDesktopWindow
   GraphCtx_SetVirtualBufferSize(hCtl, AfxGetBitmapWidth(hBitmap), AfxGetBitmapHeight(hBitmap))
   AfxDrawBitmap(GraphCtx_GetDc(hCtl), 0, 0, hBitmap)
   DeleteObject hBitmap

   

   ' // Default message pump (you can replace it with your own)
   pWindow.DoEvents(nCmdShow)

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main callback function.
' ========================================================================================
FUNCTION WindowProc (BYVAL hwnd AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG

   STATIC hInstance AS DWORD        ' // Instance handle
   STATIC lpc AS CREATESTRUCT PTR   ' // Pointer to the creation parameters
   STATIC pWindow AS IWindow        ' // Reference to the IWindow interface

   SELECT CASE uMsg

      CASE %WM_CREATE
         ' // Pointer to the creation parameters
         lpc = lParam
         ' // Instance handle
         hInstance = @lpc.hInstance
         ' // Get a reference to the IWindow interface from the CREATESTRUCT structure
         pWindow = CWindow_GetObjectFromCreateStruct(lParam)
         EXIT FUNCTION

      CASE %WM_COMMAND
         SELECT CASE LO(WORD, wParam)
            CASE %IDCANCEL
               ' // If the Escape key has been pressed...
               IF HI(WORD, wParam) = %BN_CLICKED THEN
                  ' // ... close the application by sending a WM_CLOSE message
                  SendMessage hwnd, %WM_CLOSE, 0, 0
               END IF
         END SELECT

      CASE %WM_SIZE
         ' // If the window isn't minimized, resize it
         IF wParam <> %SIZE_MINIMIZED THEN
            pWindow.MoveWindow GetDlgItem(hwnd, %IDC_GRCTX), 0, 0, pWindow.ClientWidth, pWindow.ClientHeight, %TRUE
         END IF

      CASE %WM_DESTROY
         ' // End the application
         PostQuitMessage 0
         EXIT FUNCTION

   END SELECT

   ' // Pass unprocessed messages to Windows
   FUNCTION = DefWindowProc(hwnd, uMsg, wParam, lParam)

END FUNCTION
' ========================================================================================



Elias Montoya

 Hey thats nice Jose! Where can i learn more about your control?
Win7, iMac x64 Retina display 5K, i7-5820K 4.4 ghz, 32GB RAM, All updates applied. - Firefly 3.70.

José Roca

In the help file for my headers. It has been available for years.

Israel Vega Alvarez

#4
Thanks Jose...you control es very nice...

Only I have a question...where I can catch message for capture a region or select a portion of image and sent to clipboard ?

I put this code into of  WindowProc but I can't catch this messages:



' Microsoft Windows
' File: CW_GraphCtxSkeleton.pbtpl
' Contents: Template - CWindow Graphic Control Skeleton
' Compilers: PBWIN 10.02+, PBCC 6.02+
' Headers: Windows API headers 2.03+
' Copyright (c) 2011 Jose Roca. Freeware. Use at your own risk.
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
' ########################################################################################
#COMPILE EXE
#DIM ALL
%UNICODE = 1

' // Header files for imported files
%USEGRAPHCTX = 1
#INCLUDE ONCE "CWindow.inc" ' // CWindow class

%IDC_GRCTX = 1001

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS WSTRINGZ PTR, BYVAL nCmdShow AS LONG) AS LONG

' // Set process DPI aware
IF AfxGetWindowsVersion => 6 THEN SetProcessDPIAware

' // Create an instance of the CWindow class
LOCAL pWindow AS IWindow
pWindow = CLASS "CWindow"
IF ISNOTHING(pWindow) THEN EXIT FUNCTION

' // Create the main window
pWindow.CreateWindow(%NULL, "CWindow Graphic Control Skeleton", 0, 0, 0, 0, 0, 0, CODEPTR(WindowProc))
' // Set the client size
pWindow.SetClientSize 600, 350
' // Center the window
pWindow.CenterWindow

' // Add a GDI+ aware graphic control
LOCAL hCtl AS DWORD
hCtl = pWindow.AddGraphCtx(pWindow.hwnd, %IDC_GRCTX, "", 0, 0, pWindow.ClientWidth, pWindow.ClientHeight)
SetFocus hCtl


LOCAL hBitmap AS DWORD

'hBitmap = AfxCaptureDesktopWindow

LOCAL BmpSz        AS POINTAPI
LOCAL hBmp, hGWin  AS DWORD
LOCAL xSize&, ySize&, ImageFile$, nFile&, k$
xSize& = 400 : ySize& = 400                       ' Graphic Window size
  ImageFile$ = "C:\fotosel\anei_magdalena.bmp"  ' <<- select an image bigger than the window for scrolling to work.
  nFile& = FREEFILE
  OPEN ImageFile$ FOR BINARY ACCESS READ AS nFile&  ' get the size of the image
    GET #nFile&, 19, BmpSz.x
    GET #nFile&, 23, BmpSz.y
  CLOSE nFile&

  ' Create a Graphic Bitmap and load the image
  hBitmap = LoadImage( 0, IMAGEFILE$ + CHR$(0), 0, BMPSZ.X,BMPSZ.Y,  %LR_LOADFROMFILE)



GraphCtx_SetVirtualBufferSize(hCtl, AfxGetBitmapWidth(hBitmap), AfxGetBitmapHeight(hBitmap))
AfxDrawBitmap(GraphCtx_GetDc(hCtl), 0, 0, hBitmap)
DeleteObject hBitmap



' // Default message pump (you can replace it with your own)
pWindow.DoEvents(nCmdShow)

END FUNCTION
' ========================================================================================

%IDM_CLIPBOARD            = 1001
%IDM_PRINTER              = 1002
%IDM_CANCEL               = 1003


' ========================================================================================
' Main callback function.
' ========================================================================================
FUNCTION WindowProc (BYVAL hwnd AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG


    LOCAL hWndRC        AS Rect

    LOCAL newRC         AS Rect
    LOCAL Current       AS POINTAPI
    LOCAL nWidth        AS LONG
    LOCAL nHeight       AS LONG
    LOCAL hMemDC        AS LONG

    LOCAL hBmpx          AS LONG
    LOCAL hBmpOld       AS LONG
    LOCAL PopupMenu     AS DWORD
    LOCAL lRet          AS LONG
    LOCAL hDC_Printer   AS DWORD
    LOCAL Window_Y      AS LONG
    LOCAL Printer_Y     AS LONG
    LOCAL Multiplier    AS DOUBLE

    STATIC DrawnOnce    AS LONG
    STATIC Drawing      AS LONG
    STATIC Start        AS POINTAPI
    STATIC OldRC        AS Rect

    LOCAL rc  AS  Rect
    LOCAL pt  AS  POINTAPI
    LOCAL hDC AS LONG
    LOCAL i   AS LONG
    LOCAL PS            AS PAINTSTRUCT
    LOCAL result        AS LONG



STATIC hInstance AS DWORD ' // Instance handle
STATIC lpc AS CREATESTRUCT PTR ' // Pointer to the creation parameters
STATIC pWindow AS IWindow ' // Reference to the IWindow interface

SELECT CASE uMsg


CASE %WM_CREATE
' // Pointer to the creation parameters
lpc = lParam
' // Instance handle
hInstance = @lpc.hInstance
' // Get a reference to the IWindow interface from the CREATESTRUCT structure
pWindow = CWindow_GetObjectFromCreateStruct(lParam)
EXIT FUNCTION

        CASE %WM_LBUTTONDOWN
            SetCapture HWND
            Start.x=LOINT(LPARAM)
            Start.y=HIINT(LPARAM)
            Drawing=%TRUE


        CASE %WM_MOUSEMOVE
            IF ISTRUE(Drawing) THEN
                hDC=GetDC(HWND)
                IF ISTRUE(DrawnOnce) THEN
                    DrawFocusRect hDC, oldRC
                END IF
                Current.x=LOINT(LPARAM)
                Current.y=HIINT(LPARAM)
                IF Current.x<=Start.x THEN
                    rc.nLeft=Current.x
                    rc.nRight=Start.x
                ELSE
                    rc.nLeft=Start.x
                    rc.nRight=Current.x
                END IF
                IF Current.y<=Start.y THEN
                    rc.nTop=Current.y
                    rc.nBottom=Start.y
                ELSE
                    rc.nTop=Start.y
                    rc.nBottom=Current.y
                END IF
                GetClientRect HWND, hWndRC
                IF rc.nLeft<hWndRC.nLeft THEN rc.nLeft=hWndRC.nLeft
                IF rc.nTop<hWndRC.nTop THEN rc.nTop=hWndRC.nTop
                IF rc.nRight>hWndRC.nRight THEN rc.nRight=hWndRC.nRight
                IF rc.nBottom>hWndRC.nBottom THEN rc.nBottom=hWndRC.nBottom
                DrawFocusRect hDC, rc
                TYPE SET oldRC=rc
                DrawnOnce=%TRUE
                ReleaseDC HWND, hDC
            END IF

        CASE %WM_LBUTTONUP
            IF ISTRUE(Drawing) THEN
                hDC=GetDC(HWND)
                DrawFocusRect hDC, oldRC

                nWidth=oldRC.nRight-oldRC.nLeft
                nHeight=oldRC.nBottom-oldRC.nTop

                hMemDC=CreateCompatibleDC(hDC)
                hBmpx=CreateCompatibleBitmap(hDC, nWidth, nHeight)
                hBmpOld=SelectObject(hMemDC, hBmpx)
                BitBlt hMemDC, 0, 0, nWidth, nHeight, hDC, oldRC.nLeft, oldRC.nTop, %SRCCOPY

                RESET DrawnOnce
                RESET Start
                RESET OldRC
                RESET Drawing

                Window_Y=GetDeviceCaps(hDC, %LOGPIXELSY)

                pt.x=LOINT(LPARAM)
                pt.y=HIINT(LPARAM)
                MapWindowPoints HWND, %HWND_DESKTOP, pt, 1
                PopupMenu=CreatePopupMenu()
                InsertMenu PopupMenu, 1, %MF_BYCOMMAND OR %MF_ENABLED, %IDM_CLIPBOARD, "Copiar a Memoria"
                InsertMenu PopupMenu, 2, %MF_BYCOMMAND OR %MF_ENABLED, %IDM_PRINTER, "Imprimir"
                InsertMenu PopupMenu, 3, %MF_SEPARATOR, 0, "-"
                InsertMenu PopupMenu, 4, %MF_BYCOMMAND OR %MF_ENABLED, %IDM_CANCEL, "Cancelar"
                lRet=TrackPopupMenuEx(PopupMenu, %TPM_LEFTALIGN OR %TPM_RETURNCMD, pt.x, pt.y, HWND, BYVAL %Null)
                DestroyMenu PopupMenu

                 SELECT CASE lRet
                    CASE %IDM_CLIPBOARD
                        IF OpenClipboard(HWND) THEN
                            EmptyClipboard
                            SetClipboardData %CF_BITMAP, hBmpx
                            CloseClipboard
                        ELSE
                            MSGBOX "Error opening clipboard.", %MB_ICONERROR, "Copy Screen Section"
                        END IF
                    CASE %IDM_PRINTER
                        XPRINT ATTACH CHOOSE
                        IF XPRINT$<>"" THEN
                            XPRINT GET DC TO hDC_Printer
                            Printer_Y=GetDeviceCaps(hDC_Printer, %LOGPIXELSY)
                            Multiplier=Printer_Y/Window_Y
                            StretchBlt hDC_Printer, 0, 0, nWidth*Multiplier, nHeight*Multiplier, hMemDC, 0, 0, nWidth, nHeight, %SRCCOPY
                            XPRINT FORMFEED
                            XPRINT CLOSE
                        END IF
                    CASE %IDM_CANCEL
                        ' Do Nothing
                END SELECT

                SelectObject hMemDC, hBmpOld
                DeleteDC hMemDC
                DeleteObject hBmpx
                ReleaseDC HWND, hDC
                ReleaseCapture
            END IF


CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDCANCEL
' // If the Escape key has been pressed...
IF HI(WORD, wParam) = %BN_CLICKED THEN
' // ... close the application by sending a WM_CLOSE message
SendMessage hwnd, %WM_CLOSE, 0, 0
END IF
END SELECT

CASE %WM_SIZE
' // If the window isn't minimized, resize it
IF wParam <> %SIZE_MINIMIZED THEN
pWindow.MoveWindow GetDlgItem(hwnd, %IDC_GRCTX), 0, 0, pWindow.ClientWidth, pWindow.ClientHeight, %TRUE
END IF

CASE %WM_DESTROY
' // End the application
PostQuitMessage 0
EXIT FUNCTION

END SELECT

' // Pass unprocessed messages to Windows
FUNCTION = DefWindowProc(hwnd, uMsg, wParam, lParam)

END FUNCTION
                                                         

José Roca

Messages are sent as notification messages:


' // Notification messages
'%NM_CLICK           = %NM_FIRST - 2
'%NM_DBLCLK          = %NM_FIRST - 3
'%NM_RCLICK          = %NM_FIRST - 5
'%NM_RDBLCLK         = %NM_FIRST - 6
'%NM_SETFOCUS        = %NM_FIRST - 7
'%NM_KILLFOCUS       = %NM_FIRST - 8

' // Process them in the main window callback as follows:
'
' CASE %WM_NOTIFY
'    LOCAL phdr AS NMHDR PTR
'    phdr = lParam
'    IF wParam = %IDC_GRCTX THEN
'       SELECT CASE @phdr.code
'          CASE %NM_CLICK
'             ' Left button clicked
'          CASE %NM_RCLICK
'             ' Right button clicked
'          CASE %NM_SETFOCUS
'             ' The control has gained focus
'          CASE %NM_KILLFOCUS
'             ' The control has lost focus
'       END SELECT
'    END IF


Paul Squires

Quote from: Jose Roca on July 29, 2012, 02:17:17 AM
No, this control has not scroll features, but Paul is going to add a dedicated graphic control to Firefly using my graphic control. It is resizable, stretchable and scrollable (scrollbars appear and disappear as needed) and GDI+ aware.
I have most of the new Graphic control implemented. Just need to add support for the notification messages (and ask Haakon nicely for a new ToolBox graphic for the control)  :)
Paul Squires
PlanetSquires Software

José Roca

I wrote it because the DDT graphic control can't be used wth SDK applicaions. As it is GDIP+ aware, you can use both GDI and GDIP+ with it, so you aren't restricted to use bitmaps. Besides, I have complete reference guides in .chm format for GDI and GDI+. Just forget all these DDT GRAPHIC XXX statements.