Starting monitor

Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Starting monitor

Post by Natter »

If there are several monitors, is it possible to specify the starting monitor for the application ?
Horizon
Posts: 1327
Joined: Fri May 23, 2008 1:33 pm
Has thanked: 5 times

Re: Starting monitor

Post by Horizon »

Hi,

http://forums.fivetechsupport.com/viewtopic.php?f=16&t=36546&hilit=fw+getmonitor&sid=5408cb8de17b12ed5065f9731c82ea6a

Code: Select all | Expand

* 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.04
Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Re: Starting monitor

Post by Natter »

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. :(
User avatar
driessen
Posts: 1422
Joined: Mon Oct 10, 2005 11:26 am
Location: Genk, Belgium

Re: Starting monitor

Post by driessen »

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

Michel D.
Genk (Belgium)
_____________________________________________________________________________________________
I use : FiveWin for (x)Harbour v. 24.09 - Harbour 3.2.0 (February 2024) - xHarbour Builder (January 2020) - Bcc773
Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Re: Starting monitor

Post by Natter »

To get the DC of the monitor, it is suggested to use the EnumDisplayMonitors function. Where can I find this function?
User avatar
Antonio Linares
Site Admin
Posts: 42597
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 40 times
Been thanked: 86 times
Contact:

Re: Starting monitor

Post by Antonio Linares »

regards, saludos

Antonio Linares
www.fivetechsoft.com
Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Re: Starting monitor

Post by Natter »

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 :(
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: Starting monitor

Post by Jimmy »

hi,

as i understand ENUMDISPLAYMONITORS need a Callback to build a Array

from MiniGUI Extended Version

Code: Select all | Expand

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
Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Re: Starting monitor

Post by Natter »

And how does it adapt this to xHarbour ?
User avatar
Jimmy
Posts: 1740
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany
Has thanked: 2 times

Re: Starting monitor

Post by Jimmy »

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: Select all | Expand

#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: Select all | Expand

  colItems       := objWMIServices:ExecQuery("select * from Win32_DesktopMonitor",,48)


it does have this Property

Code: Select all | Expand

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
Natter
Posts: 1244
Joined: Mon May 14, 2007 9:49 am

Re: Starting monitor

Post by Natter »

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
User avatar
nageswaragunupudi
Posts: 10729
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 10 times
Contact:

Re: Starting monitor

Post by nageswaragunupudi »

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: Select all | Expand

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
User avatar
Marc Venken
Posts: 1485
Joined: Tue Jun 14, 2016 7:51 am
Location: Belgium

Re: Starting monitor

Post by Marc Venken »

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
User avatar
Marc Venken
Posts: 1485
Joined: Tue Jun 14, 2016 7:51 am
Location: Belgium

Re: Starting monitor

Post by Marc Venken »

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
User avatar
nageswaragunupudi
Posts: 10729
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 10 times
Contact:

Re: Starting monitor

Post by nageswaragunupudi »

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: Select all | Expand

#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
Post Reply