Canot open large imagegadget -- Why?

Just starting out? Need help? Post your questions and find answers here.
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Canot open large imagegadget -- Why?

Post by Randy Walker »

Supposed to be a magnifier -- I originally ported this code in from GFA Basic and had it working in earlier version on PB but now cannot get it working right in PB 6.12
Main problem is the ImageGadget will not fill the window as it is.
Am I just asking too much of ImageGadget?

Code: Select all

Dim mousePoint.POINT(1)
GetCursorPos_(mousePoint(1))
x = mousePoint(1)\x
y = mousePoint(1)\y
myX = 400
myY = 300
;
wnd = OpenWindow(0, x-myx/2, y-myy/2, myx, myy, "", #PB_Window_BorderLess)
GetCursorPos_(mousePoint(1))

ImageGadget(1, 0, 0, myx, myy, 0, #PB_Image_Border)
FrameGadget(2, 0, 0, myX+8, myY+8, "")
ResizeGadget(1, #PB_Ignore, #PB_Ignore, 500, 400)
CreateImage(0, myX, myY)
Debug "Gadget bounds: " + Str(GadgetX(1)) + ", " + Str(GadgetY(1)) + ", " + Str(GadgetWidth(1)) + ", " + Str(GadgetHeight(1))

HDC = GetDC_(0)

AddWindowTimer(0, 100, 10)

PointColor = GetPixel_(HDC, x, y)
hdcImage = StartDrawing(ImageOutput(0))
If hdcImage
  x - myX/10
  If x < 0 : x = 0 : EndIf
  y - myY/10
  If y < 0 : y = 0 : EndIf
  StretchBlt_(hdcImage, 0, 0, myX, myY, HDC, x, y, myX/5, myY/5, #SRCCOPY)
  StopDrawing()
  SetGadgetState(0, ImageID(0))
  
  ; The next line tied to "SendMessage WM_NCLBUTTONDOWN, HTCAPTION" line allows dragging window.
  SetWindowLong_(GadgetID(1), #GWL_STYLE, GetWindowLong_(GadgetID(1), #GWL_STYLE) &~#SS_NOTIFY)
  SetForegroundWindow_(WindowID(0))
  SetActiveWindow_(WindowID(0))
  SetActiveWindow(0)
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Timer
        If GetForegroundWindow_() = WindowID(0)
          If EventTimer() = 100
            x = DesktopMouseX()
            y = DesktopMouseY()
            GetCursorPos_(mousePoint(1))
            PointColor = GetPixel_(HDC, x, y)
            hdcImage = StartDrawing(ImageOutput(0))
            If hdcImage
              Xold = x
              Yold = y
              x - myX/10
              If x < 0 : x = 0 : EndIf
              y - myY/10
              If y < 0 : y = 0 : EndIf
              StretchBlt_(hdcImage, 0, 0, myX, myY, HDC, DesktopMouseX() - myX/10 - 40, DesktopMouseY() - myY/10 - 80, myX/5, myY/5, #SRCCOPY)
              Result.d = DrawText(10, 20, "Mouse: " + Str(x) + ", " + Str(y))
              StopDrawing()
              SetGadgetState(1, ImageID(0))
            EndIf
          EndIf
        Else
          Event = #PB_Event_CloseWindow
        EndIf
      Case #WM_LBUTTONUP ; Only detected if double clicked on magnivur
        Event = #PB_Event_CloseWindow
      Case #WM_LBUTTONDOWN  ;, Window dragging dependant on "Left Button Down"
        ; The next line tied to "SetWindowLong_GetWindowLong" line allows dragging window.
        SendMessage_(wnd,#WM_NCLBUTTONDOWN, #HTCAPTION,0)
      Case #WM_KEYDOWN
        
        Debug "Keyd"
        ; Case #WM_KEYUP
        ; Event = #PB_Event_CloseWindow
        ; Debug "Keyu"
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4991
Joined: Sun Apr 12, 2009 6:27 am

Re: Canot open large imagegadget -- Why?

Post by RASHAD »

Hi

Code: Select all

If hdcImage
  x - myX/10
  If x < 0 : x = 0 : EndIf
  y - myY/10
  If y < 0 : y = 0 : EndIf
  StretchBlt_(hdcImage, 0, 0, myX, myY, HDC, x, y, myX/5, myY/5, #SRCCOPY)
  StopDrawing()
EndIf
If IsGadget(0)
  SetGadgetState(0, ImageID(0))
EndIf
Egypt my love
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

Thanks RASHAD. You pulled through for me once again. It certainly fills the window now. Thank you very much, but now It's not magnifying anything. Don't know what happened there.
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
PBJim
Enthusiast
Enthusiast
Posts: 296
Joined: Fri Jan 19, 2024 11:56 pm

Re: Canot open large imagegadget -- Why?

Post by PBJim »

Hi Randy,
If it helps you to know, under PureBasic 6.00 64-bit Windows, it appears to work, at least with the ISGadget() correction.

Image
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

Hi PBJim,
Yes, if I only add only the If IsGadget part it does magnify, but the ImageGadget still does not fill the window as it does if i use the entire If hdcImage post RASHAD gave me.

BTW I am using ver 6.12x64 on 64 bit Windows 11 Pro 23H2
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
User avatar
JHPJHP
Addict
Addict
Posts: 2267
Joined: Sat Oct 09, 2010 3:47 am

Re: Canot open large imagegadget -- Why?

Post by JHPJHP »

Hi Randy Walker,

You're setting Gadget 0, but there is no Gadget 0.
• Should be changed to Gadget 1; line 30 in your original post.

Code: Select all

SetGadgetState(1, ImageID(0))
It's not filling the entire window space because the code is not compliant with your DPI setting.
[ Menu ] > Compiler > Compiler Options... > Enable DPI aware (remove this switch)

I'm not saying the above changes will solve much, because the code is a bit of a mess... sorry.

Are you using the code for anything important or is this just an exercise to convert GFA Basic to PureBasic?
• I only ask because I have a much better solution if you're interested.

If you're not investing in yourself, you're falling behind.

My PureBasic StuffFREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

JHPJHP wrote: Thu Oct 31, 2024 10:11 pm Hi Randy Walker,
I'm not saying the above changes will solve much, because the code is a bit of a mess... sorry.

Are you using the code for anything important or is this just an exercise to convert GFA Basic to PureBasic?
• I only ask because I have a much better solution if you're interested.
Hi JHPJHP
"Messy" is my trademark :D
Always open to better solution, but if you're thinking of the Builtin Windows magnifier, it's not a solution I'm trying to achieve. I use it daily and could not survive without it but it's quite clumsy, so I want my reasonably sized window that can track and magnify around the mouse as a focal point.
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
User avatar
JHPJHP
Addict
Addict
Posts: 2267
Joined: Sat Oct 09, 2010 3:47 am

Re: Canot open large imagegadget -- Why?

Post by JHPJHP »

Hi Randy Walker,
Randy Walker wrote:... but if you're thinking of the Builtin Windows magnifier...
No, I am a programmer :P

See the following temporary link: Windows Magnification API
• Much better resolution.
• Maximize window for Fullscreen mode without borders, Esc to return to Window mode.
• Keys 1 - 4 for various color filters.
• X Key to exclude windows; currently all windows are excluded but could be modified for select windows.

If you're in Fullscreen mode and lose focus because you clicked another object, you will need to move your mouse pointer to the Taskbar and select the window (magnifying glass icon) so that the Esc Key can be used to return to Window mode.

If you're not investing in yourself, you're falling behind.

My PureBasic StuffFREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

JHPJHP wrote: Fri Nov 01, 2024 12:47 am Hi Randy Walker,
Randy Walker wrote:... but if you're thinking of the Builtin Windows magnifier...
No, I am a programmer :P

See the following temporary link: Windows Magnification API
Hi JHPJHP,
Best I can get out of that is "Icon file not found" popup. No indication I can see to say where it looks for the file. I put it in the PB source folder buit same message.
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
User avatar
JHPJHP
Addict
Addict
Posts: 2267
Joined: Sat Oct 09, 2010 3:47 am

Re: Canot open large imagegadget -- Why?

Post by JHPJHP »

Hi Randy Walker,

-\WindowsMagnification\
--\icons\
---magnify.ico
--\references\
---readme.txt
--WM_API.pb

It's a self-contained folder, the icon icons\magnify.ico is included in the ZIP file:
1. Extract the WindowsMagnification folder from the ZIP file.
2. Run the PureBasic file WM_API.pb from its default location.
or (but why?)
• Remove the icon from compiler options: [ Menu ] > Compiler > Compiler options... > Use Icon.

Let me know how it goes; I'm expecting/expected a positive response :)

You don't know me, but if you did, you could tell by my use of emojis how much I want this to work for you... I hate using emojis :!:

If you're not investing in yourself, you're falling behind.

My PureBasic StuffFREE STUFF, Scripts & Programs.
My PureBasic Forum ➤ Questions, Requests & Comments.
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

Oh WOW!!! This WM_API.pb code is VERY complex. Pheewww. I can't begin to figure out what is going 0n anywhere in that code. Much less how to modify and trim it down to my bare necessities. MY original code opened a window and filled that window with enlargement of the area surrounding the mouse pointer, similar to what WM_API.pb is doing but I had no title bar eating up real estate, and a simple click outside the window would close the window. Also allowed to grab anywhere in the window to drag the window.
Did I mention somewhere that I an not a programmer?
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4991
Joined: Sun Apr 12, 2009 6:27 am

Re: Canot open large imagegadget -- Why?

Post by RASHAD »

Hi Randy
I am not sure about your exact aim
But next snippet may help

Code: Select all

Global width,height,zoomfactor
Global DC = GetDC_(0)
Global MemDC = CreateCompatibleDC_(DC)

width = 800
height = 600
zoomfactor = 5

CreateImage(0,width,height)
SelectObject_(MemDC,ImageID(0))

Procedure Zoom()
  GetCursorPos_(p.POINT)
  StretchBlt_(MemDC,0,0,width*zoomfactor,height*zoomfactor,DC,p\x,p\y+height/zoomfactor,width,height,#SRCCOPY)
  StartDrawing(CanvasOutput(0))
  DrawImage(ImageID(0),0,0)
  StopDrawing()
EndProcedure

OpenWindow(0,0,0,width,height,"Zoom",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StickyWindow(0,1)
CanvasGadget(0,0,0,width,height)
AddWindowTimer(0,125,10)

Repeat
  Select WaitWindowEvent(1)
    Case #PB_Event_CloseWindow
      Quit = 1
      
    Case #PB_Event_Timer
      Zoom()
      
  EndSelect 
Until Quit = 1
Egypt my love
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

Hi RASHAD, (My Savior, miracle worker)
That Really looks like something I can work with. I will trim it down, applay a few adaptations and post my results. Thank you VERY MUCH!!!!
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
Randy Walker
Addict
Addict
Posts: 1109
Joined: Sun Jul 25, 2004 4:21 pm
Location: USoA

Re: Canot open large imagegadget -- Why?

Post by Randy Walker »

Well I thought I would be able to tweak your code into my desired shape and behavior but almost all attempts seem to fail.
1. Get window and drawing area to match at 400x300 -- **oddly successful
2. Get window to close by clicking outside window -- Success
3. Get magnifier window to focus/center around mouse pointer so mouse hot spot is always showing at center of the window. -- Total failure
4. Make window open so mouse hot spot is always at center of the window at launch. -- Total failure
5. Line 34 + 45-47 do not allow grab and drag anywhere in the window -- Total failure

**Item #1 I had to do a very odd adjustment to width and height variables to get it to approximate 400x300 dimension.

Adjusted code as follows:

Code: Select all

Dim mousePoint.POINT(1)
GetCursorPos_(mousePoint(1))
x = mousePoint(1)\x
y = mousePoint(1)\y
Global width,height,zoomfactor
Global DC = GetDC_(0)
Global MemDC = CreateCompatibleDC_(DC)

width = 400
height = 300
zoomfactor = 5

CreateImage(0,width,height)
SelectObject_(MemDC,ImageID(0))

Procedure Zoom()
  GetCursorPos_(p.POINT)
  newX = p\x
  newY = p\y
  StretchBlt_(MemDC,0,0,width*zoomfactor,height*zoomfactor,DC,newX,newY+height/zoomfactor,width,height,#SRCCOPY)
  StartDrawing(CanvasOutput(0))
  DrawImage(ImageID(0),0,0)
  Result.d = DrawText(10, 10, "Mouse: " + Str(newX) + ", " + Str(newY), RGB(0, 0, 0), RGB(250, 250, 0)) ; Yellow text
  StopDrawing()
EndProcedure

  GetCursorPos_(p.POINT)
  newX = p\x
  newY = p\y
wnd = OpenWindow(0,newX,newY,width-80,height-58,"",#PB_Window_BorderLess) ; | #PB_Window_ScreenCentered)
StickyWindow(0,1)
CanvasGadget(0,0,0,width,height)
  ; The next line tied to "SendMessage WM_NCLBUTTONDOWN, HTCAPTION" line allows dragging window.
  SetWindowLong_(GadgetID(0), #GWL_STYLE,  GetWindowLong_(GadgetID(0), #GWL_STYLE) &~#SS_NOTIFY)
AddWindowTimer(0,125,10)

Repeat
  If GetForegroundWindow_() = WindowID(0)
    Event =  WaitWindowEvent(1)
    Select Event
      Case #PB_Event_Timer
        Zoom()
      Case #WM_LBUTTONUP ; Only detected if double clicked on magnivur
                         ;Event = #PB_Event_CloseWindow
      Case #WM_LBUTTONDOWN  ;, Window dragging dependant on "Left Button Down"
                            ; The next line tied to "SetWindowLong_GetWindowLong" line allows dragging window.
        SendMessage_(wnd,#WM_NCLBUTTONDOWN, #HTCAPTION,0)
        
    EndSelect 
  Else
    Event = #PB_Event_CloseWindow
  EndIf
Until event = #PB_Event_CloseWindow
- - - - - - - - - - - - - - - -
Randy
I *never* claimed to be a programmer.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4991
Joined: Sun Apr 12, 2009 6:27 am

Re: Canot open large imagegadget -- Why?

Post by RASHAD »

Hi Randy
You can start from here :D
LBUTTON down to move
Esc to end

Code: Select all


Global width,height,zoomfactor
Global DC = GetDC_(0)
Global MemDC = CreateCompatibleDC_(DC)

width = 400
height = 300
zoomfactor = 5

CreateImage(0,width,height)
SelectObject_(MemDC,ImageID(0))

Procedure moveCB()
  GetCursorPos_(p.POINT)
  StretchBlt_(MemDC,0,0,width*zoomfactor,height*zoomfactor,DC,p\x,p\y+height/zoomfactor,width,height,#SRCCOPY)
  StartDrawing(CanvasOutput(0))
  DrawImage(ImageID(0),0,0)
  Result.d = DrawText(10, 10, "Mouse: " + Str(p\x) + ", " + Str(p\y), RGB(0, 0, 0), RGB(250, 250, 0)) ; Yellow text
  StopDrawing()
EndProcedure

wnd = OpenWindow(0,0,0,width-80,height-58,"",#PB_Window_BorderLess | #PB_Window_ScreenCentered|#WS_BORDER)
StickyWindow(0,1)
CanvasGadget(0,0,0,width,height )

BindEvent(#PB_Event_MoveWindow,@moveCB())

Repeat
  Select WaitWindowEvent(1)
      
    Case #WM_CHAR
      If EventwParam() = 27
        End
      EndIf
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftButtonDown
              ReleaseCapture_()
              SendMessage_(WindowID(0),#WM_NCLBUTTONDOWN,#HTCAPTION,0) 
          EndSelect
      EndSelect
      
  EndSelect 
ForEver

Egypt my love
Post Reply