FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Starting monitor
Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Starting monitor
Posted: Fri Dec 03, 2021 06:32 AM

If there are several monitors, is it possible to specify the starting monitor for the application ?

Posts: 1387
Joined: Fri May 23, 2008 01:33 PM
Re: Starting monitor
Posted: Fri Dec 03, 2021 07:39 AM
Hi,

http://forums.fivetechsupport.com/viewtopic.php?f=16&t=36546&hilit=fw+getmonitor&sid=5408cb8de17b12ed5065f9731c82ea6a
Code (fw): Select all Collapse
* Multiple Monitors support functions:
fwh\source\function\getsysin.prg

- FW_ActiveMonitors() --> nMonitors
Number of extended monitors currently active.

- FW_VirtualScreen() --> oRect
TRect object representing the area of virtual screen covered by all the
extended monitors. (Note: The object has datas nTop, nLeft, nBottom,
nRight, nWidth, nHeight)
The total width of the rectangle is the sum of horizontal resolutions of
all the monitors and height is the maximum of the vertical resolutions
of all the monitors.
Recommended reading for better understanding
https://docs.microsoft.com/en-us/window ... ual-screen
https://docs.microsoft.com/en-us/window ... y-monitors

- FW_GetMonitor(params) --> oMonitor (TMonitor object)
params:
FW_GetMonitor() --> oPrimaryMonitor
FW_GetMonitor( n ) --> nth Monitor object. Defaults to primary monitor
if there is only one active monitor.
FW_GetMonitor( oWnd/hWnd ) --> oMonitor containing max area of the window
FW_GetMonitor( nRow, nCol ) --> oMonitor containing the coordinates

- TMonitor class datas and methods
DATAS:
lPrimary // Is primary monitor
nTop, nLeft, nBottom, nRight, nWidth, nHeight
CenterPt --> { nRow, nCol }

METHODS:
Row( nMonitorRow ) --> nRow on Virtual Screen
Col( nMonitorCol ) --> nCol on Virtual Screen
Center( oWnd/hWnd ) --> Centers the window inside the monitor
Move( oWnd/hWnd ) --> Sets the window in the monitor with the same
relative coordinates

Example Usage:
ACTIVATE WINDOW oWnd ON INIT FW_GetMonitor( 2 ):Center( oWnd )
ACTIVATE WINDOW oWnd ON INIT FW_GetMonitor( 2 ):Move( oWnd )
If the program is run on a single monitor the display defaults to the
primary monitor
Regards,



Hakan ONEMLI



Harbour & MSVC 2022 & FWH 23.06
Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Re: Starting monitor
Posted: Fri Dec 03, 2021 08:33 AM

Thank you, Horizon! I've read it all. But I was hoping for a concrete example. And so you'll have to figure it out yourself. :(

Posts: 1467
Joined: Mon Oct 10, 2005 11:26 AM
Re: Starting monitor
Posted: Mon Dec 06, 2021 09:46 AM

I'm also interested in an example of multimonitor.
Thanks.

Regards,

Michel D.
Genk (Belgium)


_____________________________________________________________________________________________

I use : FiveWin for (x)Harbour v. 25.12 - Harbour 3.2.0 (May 2025) - xHarbour Builder (January 2020) - Bcc773

Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Re: Starting monitor
Posted: Tue Dec 07, 2021 12:58 PM

To get the DC of the monitor, it is suggested to use the EnumDisplayMonitors function. Where can I find this function?

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Starting monitor
Posted: Wed Dec 08, 2021 05:21 AM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Re: Starting monitor
Posted: Wed Dec 08, 2021 06:41 AM

I tried:

DLL32 FUNCTION EnumDisplayMonitors( hdc AS LONG, lprcClip AS LONG, ;
lpfnEnum AS Mnt_Lg, dwData AS LONG) AS BOOL PASCAL LIB "user32.dll"

But, apparently, I am wrong in the description of the call function :(

Posts: 1772
Joined: Thu Sep 05, 2019 05:32 AM
Re: Starting monitor
Posted: Wed Dec 08, 2021 07:02 AM
hi,

as i understand ENUMDISPLAYMONITORS need a Callback to build a Array

from MiniGUI Extended Version
Code (fw): Select all Collapse
HB_FUNC( ENUMDISPLAYMONITORS )
{
   PHB_ITEM pMonitorEnum = hb_itemArrayNew( 0 );

   EnumDisplayMonitors( NULL, NULL, _MonitorEnumProc0, ( LPARAM ) pMonitorEnum );

   hb_itemReturnRelease( pMonitorEnum );
}

BOOL CALLBACK _MonitorEnumProc0( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
greeting,

Jimmy
Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Re: Starting monitor
Posted: Wed Dec 08, 2021 07:16 AM

And how does it adapt this to xHarbour ?

Posts: 1772
Joined: Thu Sep 05, 2019 05:32 AM
Re: Starting monitor
Posted: Wed Dec 08, 2021 07:29 AM
hi,

And how does it adapt this to xHarbour

i´m nur sure but as i know MiniGUI can be used with xHarbour and BCC
Code (fw): Select all Collapse
#ifndef __XHARBOUR__
HB_FUNC( ENUMDISPLAYMONITORS )
BOOL CALLBACK _MonitorEnumProc0( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
HB_FUNC( GETMONITORINFO )
#endif

#ifndef __XHARBOUR__
HB_EXPORT PHB_ITEM Rect2Hash( RECT * rc )
#endif

IMHO it seems me xharbour do HAVE that API Function already

---

you can also use WMI

Code (fw): Select all Collapse
   colItems       := objWMIServices:ExecQuery("select * from Win32_DesktopMonitor",,48)


it does have this Property

Code (fw): Select all Collapse
LOCAL aProp := {;
"Availability",;
"Bandwidth",;
"Caption",;
"ConfigManagerErrorCode",;
"ConfigManagerUserConfig",;
"CreationClassName",;
"Description",;
"DeviceID",;
"DisplayType",;
"ErrorCleared",;
"ErrorDescription",;
"InstallDate",;
"IsLocked",;
"LastErrorCode",;
"MonitorManufacturer",;
"MonitorType",;
"Name",;
"PixelsPerXLogicalInch",;
"PixelsPerYLogicalInch",;
"PNPDeviceID",;
"PowerManagementCapabilities",;
"PowerManagementSupported",;
"ScreenHeight",;
"ScreenWidth",;
"Status",;
"StatusInfo",;
"SystemCreationClassName",;
"SystemName" }
greeting,

Jimmy
Posts: 1392
Joined: Mon May 14, 2007 09:49 AM
Re: Starting monitor
Posted: Wed Dec 08, 2021 07:44 AM

Thanks, Jimmy !

I don't know, I've never used MiniGui

Through WMI I will try. If it doesn't work, I'll try using PowerShell

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Starting monitor
Posted: Fri Dec 10, 2021 10:59 AM
Natter wrote:If there are several monitors, is it possible to specify the starting monitor for the application ?


If you want to start the application in the 2nd monitor, then use
Code (fw): Select all Collapse
ACTIVATE WINDOW oWnd ON INIT FW_GetMonitor( 2 ):Center( oWnd )


I think we can do most anything required with the provided multi-monitor functions given above.
Regards



G. N. Rao.

Hyderabad, India
Posts: 1487
Joined: Tue Jun 14, 2016 07:51 AM
Re: Starting monitor
Posted: Mon Sep 12, 2022 07:13 PM

I don't get it working.

I was trying to show a xbrowse on screen 1 and on screen 2 a dialog with some data from that browse, INCLUDING a picture (ximage) that is located in the browse as a file name (data files on drive)

moving in the browse changes the data in screen 2

Anyone has this running like this ?

Marc Venken

Using: FWH 23.08 with Harbour
Posts: 1487
Joined: Tue Jun 14, 2016 07:51 AM
Re: Starting monitor
Posted: Mon Sep 12, 2022 07:46 PM

The 2 screens are not the same (desktop large monitor and a laptop monitor. The virtual screen wil not look nice this way.
Should I look into a MDI dialog ? (also nerver used)

Marc Venken

Using: FWH 23.08 with Harbour
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Starting monitor
Posted: Tue Sep 13, 2022 06:28 PM
Marc Venken wrote:I don't get it working.

I was trying to show a xbrowse on screen 1 and on screen 2 a dialog with some data from that browse, INCLUDING a picture (ximage) that is located in the browse as a file name (data files on drive)

moving in the browse changes the data in screen 2

Anyone has this running like this ?


Can be done in different ways.
Here is one sample I quickly made. (Tested and working)
Code (fw): Select all Collapse
#include "fivewin.ch"

REQUEST DBFCDX

function Main()

   local oDlg

   USE WWONDERS ALIAS WW VIA "DBFCDX"

   DEFINE DIALOG oDlg SIZE 400,400 PIXEL TRUEPIXEL

   @ 20,20 SAY WW->NAME SIZE 360,30 PIXEL OF oDlg CENTER

   oDlg:bPainted := {|hDC| oDlg:DrawImage( WW->IMAGE, { 60,30,380,280 } ) }

   ACTIVATE DIALOG oDlg NOMODAL ON INIT FW_GetMonitor( 2 ):Center( oDlg )

   XBROWSER "WW" SETUP ( oBrw:bChange := { || oDlg:Refresh() } ) ;
      VALID ( oDlg:End(), .t. )

return nil
Regards



G. N. Rao.

Hyderabad, India