| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| On-Demand-Webinare zu SolidCAM (SolidCAM) |
Autor
|
Thema: API: Bildschirmauflösung anpassen? (4396 mal gelesen)
|
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 16. Nov. 2006 09:43 <-- editieren / zitieren --> Unities abgeben:
Hallo, weiß wer einen Weg, im Makro die vorhandene Bildschirmauflösung zu ermitteln, um das Userform immer auf den Bildschirm zu bekommen? Der Hintergrund ist der: Alle meine Makros sind so konzipiert, daß die Position der Userform in der Windows-Registrierung gespeichert wird. Im Laufe der Zeit hat es sich ergeben, daß die meisten Userforms am rechten Bildschirmrand platziert sind, und dort wohl auch am wenigsten stören. Nun mußte ich mit meinem PC zum Kunden und der baut mir seinen Monitor mit geringerer Auflösung an. Und schwuppdiwupp war keines meiner rechtsliegenden Makro-Fenster mehr zu sehen. Bei meiner Suchen nach der richtigen Positionierung der Userform kemmt´s nun daran, daß ich zwar die Pixel für die Bildschirmaufläsung über die API-Funktion bekomme. Da aber die Positionierung der Userform nicht die Pixel, sondern die Maßeinheit "Punkt" (1TWIP=0,05Punkt) brauche ich noch für den jeweiligen Monitor den Umrechnungsfaktor von Twips in Pixel. Dazu habe ich in den VB-Foren die Formeln Code: x=Screen.Width/Screen.TwipsPerPixelX y=Screen.Hight/Screen.TwipsPerPixelY
gefunden. Leider Verfügt mein SWX-Programmierwerkzeug nicht über das Screen-Objekt. Habt Ihr eine andere Idee, wie ich immer mit der Userform meine Bedienoberfläche treffen kann? Viele Grüße! ThomasEine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 16. Nov. 2006 10:14 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
;o) Gruß Micha [TwipsPerPixel X+Y = 15] [CODE] Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Sub Screen() Dim r As RECT Dim l As Long l = GetWindowRect(GetDesktopWindow, r) Debug.Print r.Right Debug.Print r.Bottom Debug.Print r.Left Debug.Print r.Top End Sub [\CODE] ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 16. Nov. 2006 13:06 <-- editieren / zitieren --> Unities abgeben:
Hallo Micha, vielen Dank für Deine Unterstützung, aber der Code liefert mir die Pixel, z.B. 1600x1200. Würde ich für mein UserForm.Left=1400 setzen, so wäre diese Form bei mir schon jenseits der rechten Bildschirmgrenze, weil bei UserForm.Left=1197 schon nur noch das letzte Stück der Form zu sehen ist. "Pixel" und "Punkt" sind nicht das selbe. Oder verbirgt sich das Geheimnis hinter [TwipsPerPixel X+Y = 15]. Ich weiß aber nicht, was ich damit machen kann. Viele Grüße! Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 16. Nov. 2006 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Zitat: Original erstellt von Thomas5:
x=Screen.Width/Screen.TwipsPerPixelX y=Screen.Hight/Screen.TwipsPerPixelYThomas
das sollte der entsprechende Befehl dann sein y = r.Bottom / 15 x = r.Left / 15 (x = x - Form.Width) damit dein Form.Left auch passt nicht vergessen die Breite deiner Form noch vom x abziehen Gruß Micha ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Mitglied Teamleiter
Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 16. Nov. 2006 13:22 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Zitat: Original erstellt von VBSpawn: das sollte der entsprechende Befehl dann sein y = r.Bottom / 15 x = r.Left / 15(x = x - Form.Width) damit dein Form.Left auch passt nicht vergessen die Breite deiner Form noch vom x abziehen Gruß Micha
TwipsPerPixel sind aber nicht immer 15. Wir haben Rechner bei denen ist diese Konstante im Screen Objekt von vb6 12. Es ist also mit vorsicht zu geniesen, wenn man einfach blind 15 für die Umrechnung angibt! ------------------ Mfg Daniel Brauchen Sie Hilfe, sind Sie in Not? Wir retten Sie mit unseren Code! ---------------------------------------------- SolidWorks API-Programmierung | Makros | Tools | Addins | Schulung
SolidWorks API Programmierung; Schuler Design Automation GmbH | kontakt@schuler-da.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 16. Nov. 2006 13:30 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Zitat: Original erstellt von tbd: TwipsPerPixel sind aber nicht immer 15. Wir haben Rechner bei denen ist diese Konstante im Screen Objekt von vb6 12. Es ist also mit vorsicht zu geniesen, wenn man einfach blind 15 für die Umrechnung angibt!
Klaro .... Blind sind dann aber auch diejenigen die Ihre DPI angepasst haben(Blind oder LapTop User) hättest aber ruhig noch sagen können wie man die DPI ermittelt Gruß Micha ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Müller Mitglied Masch. Ing. HTL / Betriebsing. STV
Beiträge: 1151 Registriert: 11.04.2001
|
erstellt am: 16. Nov. 2006 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Hallo Thomas. Auch wenn die Herausforderung für solche Problemchen sehr spannend sind, möchte man doch manchmal eine ähnliche, fertige und schnelle Lösung haben . Solch eine könnte ich anbieten, vielleicht kennst Du die schon. In den Eigenschaften eines Fensters kann unter "StartUpPosition" der Wert "3-Windows-Standard" eingestellt werden. Dann erscheint das Fenster auf jedem Monitor oben links. Zwar nicht die gewünschte Position, aber doch auch schön am Rand . ------------------ Gruss Andreas Bachmann engineering ag Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 16. Nov. 2006 15:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, Du hast mich auf eine Idee gebracht. Ich hab mir ein kleines Makro "Bildschirmgrenzen" gebaut, das ich dann aufrufe, wenn ich mal mit einem fremden Monitor Probleme habe. Da wird bei x=0 und y=0 ein Userform aufgemacht. Indem ich dieses Userform mit der Maus in die rechte Untere Ecke schiebe messe ich mir den Bildschirm ab und schreibe die Werte in meine Windows-Registrierung. Code: Private Sub UserForm_Layout() SaveSetting "SWX_Bildschirm", "SWX_Bildschirm", "X", CStr(Me.Left) SaveSetting "SWX_Bildschirm", "SWX_Bildschirm", "Y", CStr(Me.Top) End Sub
Von da kann dann jedes meiner Makros schauen, ob´s noch auf den Bildschirm paßt. Vielen Dank und viele Grüße! Thomas[Diese Nachricht wurde von Thomas5 am 16. Nov. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
d_b Mitglied vorhanden
Beiträge: 88 Registriert: 15.03.2001 42
|
erstellt am: 16. Nov. 2006 17:43 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Zitat: Original erstellt von Thomas5: Hallo,
Code: x=Screen.Width/Screen.TwipsPerPixelX y=Screen.Hight/Screen.TwipsPerPixelY
gefunden. Leider Verfügt mein SWX-Programmierwerkzeug nicht über das Screen-Objekt. Habt Ihr eine andere Idee, wie ich immer mit der Userform meine Bedienoberfläche treffen kann? Viele Grüße! Thomas
damit sollte es gehen:
Code:
Option ExplicitPrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Const LOGPIXELSX = 88 Private Const LOGPIXELSY = 90 Public Const HORZRES = 8 Public Const VERTRES = 10 Function GetDeviceCapsVal(ByVal nIndex As Integer) As Long Dim nDC As Long
nDC = GetDC(0) GetDeviceCapsVal = GetDeviceCaps(nDC, nIndex) ReleaseDC 0, nDC End Function Sub main() Dim x As Double Dim y As Double x = GetDeviceCapsVal(HORZRES) * GetDeviceCapsVal(LOGPIXELSX) / 1440 y = GetDeviceCapsVal(VERTRES) * GetDeviceCapsVal(LOGPIXELSY) / 1440 End Sub
Gruß, d_b Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 16. Nov. 2006 18:39 <-- editieren / zitieren --> Unities abgeben:
Hallo d_b, vielen Dank für Deine Mühe, aber ich denke, die Werte deines Codes für x / y (bei meinem Monitor 106,66 / 80) liegen zu weit von denen meiner "Handmethode" (x /y -> 1197 / 875) weg. Da scheint etwas noch nicht zu stimmen. Ich forsche weiter. Viele Grüße! Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 16. Nov. 2006 21:59 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Hi, hier die Lösung: also mach die mal zum Test ne neue VBA Userform und erzeuge einen Button dann kopiere das in die Form .... Code:
Option Explicit Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Const SPI_GETWORKAREA& = 48 Private Declare Function SystemParametersInfo Lib "user32" _ Alias "SystemParametersInfoA" _ (ByVal uAction As Long, _ ByVal uParam As Long, _ lpvParam As Any, _ ByVal fuWinIni As Long) As Long Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long Private Const HWND_DESKTOP As Long = 0 Private Const LOGPIXELSX As Long = 88 Private Const LOGPIXELSY As Long = 90 Function TwipsPerPixelX() As Single Dim lngDC As Long lngDC = GetDC(HWND_DESKTOP) TwipsPerPixelX = 1440 / GetDeviceCaps(lngDC, LOGPIXELSX) ReleaseDC HWND_DESKTOP, lngDC End Function Function TwipsPerPixelY() As Single Dim lngDC As Long lngDC = GetDC(HWND_DESKTOP) TwipsPerPixelY = 1440 / GetDeviceCaps(lngDC, LOGPIXELSY) ReleaseDC HWND_DESKTOP, lngDC End Function Sub UntenRechts() Dim rc As RECT Call SystemParametersInfo(SPI_GETWORKAREA, 0&, rc, 0&) Me.Top = rc.Bottom * TwipsPerPixelY / 20 - Me.Height Me.Left = rc.Right * TwipsPerPixelX / 20 - Me.Width End Sub Private Sub CommandButton1_Click() UntenRechts End Sub
Gruß Micha ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 16. Nov. 2006 22:30 <-- editieren / zitieren --> Unities abgeben:
|
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 17. Nov. 2006 08:10 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas5
Zitat: Original erstellt von Thomas5: [i]Das ist die Lösung, das Gelbe vom Ei
*jaja .... aber nicht wirklich, denn wenn du die Position deiner Form abspeicherst... kann noch folgendes passieren: der User ändert sein Bildschirmauflösung von 1920 x 1440 auf 1280 x 1024 und Schwupps ist deine Form wieder im Nirvana ... Gruß Micha
------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas5 Mitglied Konstrukteur, SWX-Admin
Beiträge: 420 Registriert: 14.07.2003 SWX2013
|
erstellt am: 17. Nov. 2006 12:14 <-- editieren / zitieren --> Unities abgeben:
Hallo Micha, bei jeder Initialisierung frage ich das ab. Und ICH bin der User und ändere mitten in der SWX -Sitzung nicht die Bildschirmauflösung. Mir ging es, wie eingangs erklärt, um das Vermeiden der Vorführpanne beim Kunden und wenn ich zurück bin das selbe in Grün, weil ich selten den Monitor mitschleppe sondern nur die Workstation. Vielen Dank noch mal und viele Grüße! Thomas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |