![]() |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Um erstmal alle Missverständnisse zu beseitigen:
Du möchtest wissen wie hoch das "farbige Dingen" ist, in dem in einem VCL-Formular der Text ausgegeben wird, den man Form.Caption zuweist? |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
|
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
Delphi-Quellcode:
TitleHeight := Form.ClientToScreen(Point(0,0)).Y - Form.Top;
Allerdings bin ich der Meinung, daß die Notwendigkeit diesen Wert wissen zu müssen, schon ein Zeichen für einen Designfehler ist (zumindest wenn man mit der VCL arbeitet). In der Regel erreicht man das Gewünschte auch ohne solche Angaben. |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Mich irritiert vor allem die gedankliche Trennung zwischen VCL und Win32. Die VCL ist aber keine Alternative dazu sondern ein Aufsatz. Daher sehe ich nicht dass man in der VCL etwas fände das einem GetSystemMetrics überlegen wäre. Ich vermute hinter der Ausgangsfrage steckt ein komplexeres Problem mit HighDPI-Anwendungen. Leider bin ich da mangels entsprechender Hardware raus. Allerdings wäre es sicher für die anderen gut zu wissen, um was es eigentlich wirklich geht.
|
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
Meine Erwartung in dieser Hinsicht ist ganz klar, daß eine VCL-Anwendung (zumindest mit Standard-Controls) ohne irgendwelche manuellen Eingriffe High-DPI fähig ist. Arbeite ich mit Icons muss ich diese natürlich in den verschiedenen Auflösungen bereitstellen oder mich mit einem Auto-Scaling zufrieden geben. Da steht eben Aufwand gegen Aussehen und das muss man halt gegeneinander abwägen. Wer nun partout direkt mit der WinApi hantieren muss, steht bei High-DPI mit GetSystemMetrics schnell auf verlorenem Posten. In dem Fall wäre dann vielleicht GetSystemMetricsForDpi die bessere Alternative. Ob das allein dann wirklich ausreicht ist allerdings fraglich. |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
Wenn man seine Anwendung DPI fähig machen will kommt man nun mal nicht Drumherum dann auch jedes erstellte Fenster bzw. Control dementsprechend zu behandeln was die Weite und Höhe angeht. Wie du schon sagst die VCL macht es automatisch wenn (dementsprechend angepasst). Aber mir ist es egal ob ich DPI mit übergebe oder nur Clientweite, Clienthöhe. Letztendlich sind das bei jedem wert nur 3 Buchstaben die ich vorhängen muss. Und nein man steht mit GetSystemMetrics nicht auf verlorenen Posten warum auch? Erkläre das bitte näher. bsp: Aus meinem Player.. C++64 Man beachte das vorgehängte dpi zum Beispiel beim erstellen des Rect.
Code:
Nun wo soll also hier nun ein Problem sein ?
DWORD dwStyle = WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
RECT rc; SetRect(&rc, 0, 0, dpi(CLIENT_WIDTH), dpi(CLIENT_HEIGHT)); AdjustWindowRectEx(&rc, dwStyle, FALSE, 0); long w = Width(rc); long x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2; long h = Height(rc); long y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2; gP.hMainMenu = BuildMenu(); gP.hMain = CreateWindowEx(WS_EX_ACCEPTFILES, STR_CLASS, STR_TITLE, dwStyle, x, y, w, h, nullptr, gP.hMainMenu, hInstance, nullptr); if (gP.hMain) { if (InitKVPlayer(hInstance)) { GetClientRect(gP.hMain, &rc); y = Height(rc) - 80; // Create movie slider dwStyle = WS_VISIBLE | WS_CHILD | TBS_NOTICKS | TBS_FIXEDLENGTH; CreateWindowEx(0, L"msctls_trackbar32", NULL, dwStyle, 0, y - 17, dpi(Width(rc)), dpi(18), gP.hMain, (HMENU)ID_SLIDER, hInstance, NULL); Bin auch schon wieder weg da es hier um VCL geht .. wollte nur deine Behauptung (verlorener posten) widerlegen. gruss |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Was hast Du denn bei diesem schönen Wetter für schlechte Laune? Und warum musst Du die gerade hier rauslassen? Zwingt Dich doch keiner ...
|
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
gruss |
AW: VCL Ersatz für GetSystemMetrics(SM_CYSIZE) bitte
Zitat:
Ich dachte an so etwas banales wie eine "Systems.Windows.Caption.Size.Height" Property. (<- von mir erfundene Wort-Kette) Ich finde allerdings auch keinen VCL Ersatz mit dem ich die Höhe beeinflussen kann, von daher vermute ich mal das es mit VCL nicht funktioniert und das Thema hiermit am Ende ist. In VCL ist das wohl vom Client-Bereich getrennt, Caption kommt vom System/Theme/Skin/o.ä.. Ich finde nur Wege wie ich VCL Captions selber ändern kann indem ich ein Borderless Window erstelle und Kombination aus Image + Text + Knöpfe alles selber zeichne, was am WinApi Skalierungs-Fehler Meilenweit fern ist. Das war halt das blöde, eine 1:1 Portierung klappt nicht wenn ich Api Aufrufe mit VCL Aufrufen ersetzen will. Bei all meinen Anstrengungen eine Fehlerhafte Skalierung aufzudecken so wie ich es mit WinApi in ein paar Minuten hinbekomme, was soll ich sagen, da fehlen der VCL halt ein paar funktionen, was ja auch gut ist, so entsteht zumindest nicht dieser Fehler, aber ich probiere und teste noch ein wenig herum. VCL scheint etwas Eigen-Magie mitzubringen die mir diesen Fehler zumindest verbietet nachzuahmen. Da wird die Caption getrennt vom Client-Bereich erstellt, so das der Client-Bereich immer groß genug ist um bei DPI wechsel die Änderung abzufangen. [EDIT] Um es mit VCL nachzustellen, nicht funktionell aber visuell, hier ist das was ich meine: Man erstellt eine Form, fixe größe, man packt auf diese Form ein Panel, fixe größe / relativ formfüllend. Nun gibt man der Form eine Sizeable Property, wenn man nun das Window kleiner macht, also kleiner als das Panel, was passiert da bei Euch? Bei mit hat das Fenster dann unten und rechts eine Scrollbar. Auf so einen Fehler war ich aus. In WinApi passiert so etwas wenn man nicht alle Größen korrekt mit-nutzt, diesen Fehler per VCL hinzubekommen da übe ich noch ein wenig. [/EDIT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz