![]() |
Entwicklung für Vista und XP
Hallo,
im Forum habe ich einige Beträge zu den neuen Vista- und Office-Themes nebst Komponenten-Suites von Drittherstellern gelesen. Solche Pakte erlauben es, unter XP Anwendungen zu schreiben, die schon heute Aussehen wie die zukünftigen Microsoftprodukte. Für mich stellt sich jedoch eine andere Frage: Wie kann ich eine Software entwickeln, die sowohl unter Windows XP als auch unter Windows Vista "zeitgemäß" aussieht. Das Theme von Buttons und Fensterrändern übernimmt die Rendering-Engine von Windows größtenteils automatisch. Aber wie kann ich mich bspw. an den ![]() ![]() ![]() Habt Ihr irgendwelche Lösungsideen dazu? |
Re: Entwicklung für Vista und XP
Naja also momentan haben wir ja für XP das "XP-Manifest", das sich immer an das gegbene Windows Design anpasst (wenn man das Programm z.B. unter Win2000 ausführt etc). Das Manifest kann man ja als Komponente hinzufügen (ab Delphi 7) oder manuell in das Verzeichnis schieben. Ich denke, dass man das auch in Vista über ne Manifest Datei lösen können wird.
Mein Tipp: Momentan noch abwarten bis Vista kommt. Dann kann man immernoch schnell n' Update rausgeben. |
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Liste der Anhänge anzeigen (Anzahl: 1)
Das denke ich nicht, denn dann wäre der Beitrag an sich überflüssig. :lol: Ein simples 08/15-Programm, das keine speziellen Windows-Funktionen verwendet, die auf bestimmte Systeme beschränkt ist, läuft in der Regel von 95 bis Vista und nutzt dann natürlich auch den jeweiligen Fensterstil.
Wenn es wirklich darum geht, warum dann die Frage nach einem "zeitgemäßen" Look der Anwendungen? btw, das .NET Framework 3.0 erlaubt ein nahezu unbegrenztes Anpassen der eigenen Anwendung. Mit Hilfe von im Programm integrierten Ressourcendeklarationen kann man das Aussehen von fast allen Elementen beliebig ändern. Aus einem gelben Standard-Tooltip habe ich so ein etwas größeres graublaues Element mit abgerundeten Ecken und fester Breite gemacht (s. Bild im Anhang). Und ich bin kein Designer. Stell dir vor, was Leute mit echten grafischen Talenten anstellen könnten. :stupid: |
Re: Entwicklung für Vista und XP
Ich würde es toll finden, wenn sich choose auch nochmal äußern würde, damit wir wissen was er genau meinte und ob seine Frage nun beantwortet ist etc.
|
Re: Entwicklung für Vista und XP
@MathiasSimmack: Ich denke, du verstehst da etwas ganz falsch.
Also: choose möchte sein Programm den Guidelines anpassen, welche vom Betriebssystem abhänging sind. So haben wir unter Windows XP in Dialogen die Buttons unten rechts, in Windows Vista sollen sie oben links plaziert sein. (Zumindestens der Zurück-Button.) Nun sucht choose eine Möglichkeit, seine Anwendung so zu gestalten, dass unter Windows XP die Buttons unten und in Windows Vista die Buttons eben oben sind. |
Re: Entwicklung für Vista und XP
@idontwantaname: Ich denke, du verstehst da etwas ganz falsch.
Also: ... :mrgreen: Scherz beiseite, Choose soll nochmal sagen, was er konkret meint, allerdings hab ich ihn so verstanden, wie es Matthias verstanden hat. Aber man kann nicht sagen, dass einer es so und nicht anders gemeint hat (oder hast du ICQ Kontakt zu ihm?) Gruß alias5000 |
Re: Entwicklung für Vista und XP
Naja als allgemeinen Tipp:
Man könnte die Windows-Version auslesen und sich dann sein Programm passend zurechtbasteln. Oder man schreibt einfach zwei Applikationen. :lol: |
Re: Entwicklung für Vista und XP
Zitat:
Grüße Faux |
Re: Entwicklung für Vista und XP
Zitat:
Ich lad mir doch nicht tausende Megabytes runter nur um zu wissen ob der "Zurück"-Button oben links oder unten rechts hinkommt! :lol: Außerdem werden wohl viele Vista im klassischen Modus laufen haben (bei den Systemvoraussetzungen für Aero Glass) und da sieht das was im Vista- oder XP-Style gut aussieht meist eigenartig aus. |
Re: Entwicklung für Vista und XP
Zitat:
Trotzdem hast du noch ein Problem: Die Richtlinien (Guide lines) eines Assistenten unter 9x/ME/NT/200x/XP unterscheiden sich von denen, die für Vista gelten. Headerbereiche, Willkommensseiten, usw. sollten unter Vista nach Möglichkeit nicht mehr verwendet werden. Also doch zwei Assistenten programmieren? Ehrlich gesagt, ich habe mich bisher noch nicht weiter damit beschäftigt. Vllt. findet sich im Windows SDK ein kleiner Beitrag darüber. |
Re: Entwicklung für Vista und XP
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Entwicklung für Vista und XP
Hey,
ich möchte in der Tat ein(e) Programm/Codebasis für die Betriebssysteme Win2k, WinXP und Vista pflegen und dabei sowohl die jeweiligen Themes als auch die Guidelines unterstützen. In der Vergangenheit war das relativ unkompliziert. Zum einen gab es "offizielle" Guidelines meines Wissens erst seit Windows XP (so dass sie sich nicht widersprachen) und zum Anderen ließen sie sich größtenteils erreichen, indem man die Controls entsprechend platzierte. Andere Controls änderten ihr Verhalten mit entsprechenden CreateParams oder Windows-Botschaften, die von vorherigen Versionen ignoriert wurden. So zeigt ein Passwort-Edit unter Win2k noch Sternchen, während man unter XP die Kreise mit automatischem Hint bei aktiviertem Caps-Lock sieht. Ich rede weniger von Buttons oder Listen, die sich ins Bild einfügen, auch einfache Controls wie der CommandLink lassen sich durch neue Botschaften (s.o.) erzeugen. Ich gehe davon aus, dass sich die ListViews und andere Controls gleichfalls aufbohren lassen. Viel mehr interessiert mich, wie die unterschiedlichen Layouts und Konzepte erreicht werden können. Wizard Pages, Durchsuchbarer Content, Dialogboxen mit Details, Fußnoten und abweichenden Buttonbeschriftungen. Auch interessiert mich, wie ich das Glass im ClientArea erzeugen soll und damit zu arbeiten habe, wenn ich sonst schon einen Alpha-Kanal verwende. Die Beispiele, die ich dazu finde, richten sich vornehmlich an .net und -nun kommt's- ich muss eine Win32-Anwendung weiterpflegen. |
Re: Entwicklung für Vista und XP
Hallo Mathias,
Zitat:
|
Re: Entwicklung für Vista und XP
Zitat:
Grüße Faux |
Re: Entwicklung für Vista und XP
Zitat:
![]() Zitat:
Mich hat´s gerade gepackt: ich werde mal den Assistenten aus den Tutorials vista-risieren, damit er vernünftig aussieht (Titelleiste usw.). :zwinker: Der ist mit Delphi 5 und dem Win32-API entwickelt worden. In dem Fall genügt wirklich nur ein neues Flag, um den Look zu ändern. Aber genau das ist das Problem mit Borland. Borland hat leider nie einfach mal ein neues Unitpaket mit aktualisierten und neuen Flags geschnürt. Man sollte sich immer gleich eine neue Delphi-Version kaufen. Und selbst dann waren nicht immer sofort alle neuen Dinge möglich. Bei Microsoft dagegen holst du dir das PSDK oder (weil du von Vista redest) das Windows SDK, und du erhältst einen Satz Headerdateien. Was glaubst du, wo ich den Wert von PSH_AEROWIZARD her habe? :) Ich habe bei mir das Windows SDK installiert (1gig-ISO von Microsoft, musst du mal suchen, nimm die June CTP!) mit Dokumentationen zum API, zum .NET Framework und auch zu Vista. Der Blick da rein lohnt sich auf jeden Fall. |
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Zitat:
In der Vergangenheit habe ich einige Komponenten selbst geschrieben, um bspw. auf die SysLinks zu verzichten. Auch unter Win2k konnten so Links innerhalb der Applikation verwendet werden. Mit den Command Links werde ich das wahrscheinlich ähnlich machen. Was aber passiert aber mit den "Task Dialogs", die nun die einfachen Meldungsboxen ablösen? Muss ich das abermals über eine eigene Komponente abdecken, damit ich die Phrasen in den Meldungen nicht zweimal entwerfen muss? Und was ist mit dem übrigen Aero-Sachen? Bin ich gezwungen spezielle "Panels" einzuführen, damit sie unter Vista den gewünschten Glas-Effekt haben? Vielen Dank für den Hinweis zum SDK, Mathias. |
Re: Entwicklung für Vista und XP
Zitat:
PS: Den Glas-Effekt im Clientbereich kannst du vergessen. Wer so was macht, der muss besch**** sein. :zwinker: Den Glas-Effekt würde ich wirklich nur auf die Kanten und Titelleiste des Fensters beschränken. Im Clientbereich hat das nichts zu suchen, und mir ist bisher in Vista noch kein Assistent oder sonst was begegnet, der ein durchscheinendes Panel besaß, auf dem Buttons sitzen, o.ä. |
Re: Entwicklung für Vista und XP
Noch ein PS:
Zitat:
![]() |
Re: Entwicklung für Vista und XP
Zitat:
![]() |
Re: Entwicklung für Vista und XP
Hallo Mathias,
Zitat:
|
Re: Entwicklung für Vista und XP
Zitat:
![]() ![]() |
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
Im Original ist die Deklaration der Buttons eigentlich vom enum-Typ, aber egal. Das funktioniert auch erst mal so. Merkwürdig finde ich das mit den Symbolen. Hier mal die Originaldeklaration der Funktion
unit Vista;
interface; const TD_WARNING_ICON = -1; TD_ERROR_ICON = -2; TD_INFORMATION_ICON = -3; TD_SHIELD_ICON = -4; // TASKDIALOG_COMMON_BUTTON_FLAGS TDCBF_OK_BUTTON = $0001; // selected control return value IDOK TDCBF_YES_BUTTON = $0002; // selected control return value IDYES TDCBF_NO_BUTTON = $0004; // selected control return value IDNO TDCBF_CANCEL_BUTTON = $0008; // selected control return value IDCANCEL TDCBF_RETRY_BUTTON = $0010; // selected control return value IDRETRY TDCBF_CLOSE_BUTTON = $0020; // selected control return value IDCLOSE function TaskDialog(hwndParent: HWND; hInstance: longword; pszWindowTitle: PWideChar; pszMainInstruction : PWideChar; pszContent: PWideChar; dwCommonButtons: dword; pszIcon : PWideChar; var pnButton: integer): HRESULT; stdcall; implementation const comctl32 = 'comctl32.dll'; function TaskDialog; external comctl32; end.
Code:
PCWSTR ist doch, IMHO, ein PWideChar, oder? Demzufolge müsste meine Delphi-Deklaration von oben ja korrekt sein. Klappt nur nicht. Versuche ich ein Symbol zu laden, dann sehe ich die Box überhaupt nicht. Bisher klappt es nur mit nil:
WINCOMMCTRLAPI HRESULT WINAPI TaskDialog(__in_opt HWND hwndParent, __in_opt HINSTANCE hInstance, __in_opt PCWSTR pszWindowTitle, __in_opt PCWSTR pszMainInstruction, __in_opt PCWSTR pszContent, TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons, __in_opt PCWSTR pszIcon, __out_opt int *pnButton);
Delphi-Quellcode:
An sich sollte aber auch
if (TaskDialog(0, 0, 'Test TaskDialog', 'So eine etwas dickere Überschrift',
'Dies ist der eigentliche Inhalt.', TDCBF_YES_BUTTON or TDCBF_NO_BUTTON or TDCBF_CANCEL_BUTTON, nil, i) = S_OK) then begin case i of IDYES: MessageBox(0, 'Ja', nil, 0); IDNO: MessageBox(0, 'Nein', nil, 0); IDCANCEL: MessageBox(0, 'Abbrechen', nil, 0); end; end;
Delphi-Quellcode:
klappen. Wo also liegt der Fehler?
(TaskDialog(0, 0, { ... } MAKEINTRESOURCEW(TD_INFORMATION_ICON), i)
@André: Wenn es für dein Programm einen guten Grund gibt, einen komplett durchsichtigen Hintergrund zu nutzen, dann nur zu. Andernfalls solltest du erst mal ausprobieren, wie das aussieht, was andere dazu sagen und die Sache dann wieder vergessen. :lol: Nichts für ungut, aber bei den Gadgets macht das noch halbwegs Sinn. Die Startleiste ist ja auch transparent. PS: Aaaah, Problem (wieder mal :stupid:) selbst gelöst. Die Icon-Werte waren falsch. Und das aus der Headerdatei des Windows SDK :roll: Egal:
Delphi-Quellcode:
geht dann aber (s. neues Bild im Anhang).
TD_ICON_BLANK = 100;
TD_ICON_WARNING = 101; TD_ICON_QUESTION = 102; TD_ICON_ERROR = 103; TD_ICON_INFORMATION = 104; TD_ICON_BLANK_AGAIN = 105; TD_ICON_SHIELD = 106; |
Re: Entwicklung für Vista und XP
Liste der Anhänge anzeigen (Anzahl: 1)
Am "TaskDialogIndirect" sitze ich gerade (s. Bild im Anhang). Aber damit mache ich morgen weiter. Der Code ist fertig. Ich muss mir nur noch angucken, was für Spielchen man damit noch so alles machen kann. :stupid:
|
Re: Entwicklung für Vista und XP
Hallo Mathias,
das sieht ja schon richtig gut aus! Wie sieht im Augenblick Dein Entwicklungszyklus aus? Codieren unter XP und unter Vista laufen lassen oder tatsächlich in der Konsole kompilieren und mit Notepad entwickeln? Du hast nicht zufällig vor, die Ergebnisse in Form einer Funktionssammlung mit Delphi-Typen und etwas Komfort zur Verfügung zu stellen, oder? |
Re: Entwicklung für Vista und XP
Die Deklaration vom ersten Dialog, "TaskDialog", hast du ja bereits. Der läuft wirklich nur unter Vista, und ein Manifest ist zwingend erforderlich, sonst kommt auch unter Vista die Meldung, die Funktion könne nicht gefunden werden.
Der erste Dialog war nicht so tragisch. Etwas komplizierter war das Record (unser Luckie würde "Struktur" sagen :stupid:) für "TaskDialogIndirect". Aber wie du im Bild sehen kannst, hast du da auch mehr Möglichkeiten. Ich schraube gerade eine kleine Demo zusammen, die beide Dialoge aufruft. Ich muss noch ein paar Sachen testen, damit ich auch weiß wovon ich rede, und dann erscheint das ganze als Artikel inkl. Quellcode. btw, Delphi 5 läuft jetzt auch unter Vista. Nur am Anfang kommt die Meldung, irgendein Verzeichnis kann nicht umbenannt werden. Aber damit kann ich leben. Ich brauche es eh nur für Notfälle, falls ich mal direkt unter Vista kompilieren will. Ansonsten, ehrlich gesagt, hätte ich mir Delphi da nicht mehr installiert. :oops: Ich hätte nicht gedacht, das mal zugeben zu müssen, aber ich muss mich echt wieder in Delphi eingewöhnen. Bei CSharp hätte ich dafür schon eine NativeMethods-Klasse zusammengeschraubt. :) |
Re: Entwicklung für Vista und XP
Okay, grundsätzlich hätte ich den Artikel fertig. Das einzige Problem ist momentan die Checkbox. Das Erzeugen derselben und das Reagieren in der Callback-Funktion ist kein Ding. Der Rückgabewert ist das, womit ich zurzeit Schwierigkeiten habe. Hier die Original-Deklaration:
Code:
Der letzte Parameter ist ein Zeiger auf einen bool-Wert. Lt. SDK ist dieser Wert TRUE, wenn der Haken in der Checkbox gesetzt war, und FALSE, wenn er das nicht war. Irgendwie klappt das nur nicht. :gruebel: Wenn ich die Variable initialisiere (mit FALSE), dann erhalte ich grundsätzlich auch FALSE zurück. Wenn ich die Variable nicht initialisiere, dann liefert die Funktion TRUE, selbst wenn ich gar keine Checkbox im Dialog nutze. :roll: Irgendwo ist da noch der Wurm drin.
HRESULT TaskDialogIndirect(
const TASKDIALOGCONFIG *pTaskConfig, int *pnButton, BOOL *pfVerificationFlagChecked ); Soll ich den Artikel trotzdem erst mal veröffentlichen? Das Thema Checkbox würde ich ausklammern, und wir reden darüber, wenn Artikel und Demo online sind. |
Re: Entwicklung für Vista und XP
Zitat:
|
Re: Entwicklung für Vista und XP
Und hier der versprochene Artikel;
![]() Auch wenn es nirgens steht, Mathias ist der Autor und übernimmt somit die volle Verantwortung. Fragen bitte an Mathias richten. (Tippfehler bitte an mich per PN.) @Mathias: Als PDF hast du da snicht noch zufällig vorliegen? Wie ich hier: ![]() |
Re: Entwicklung für Vista und XP
Müsste ich bei Gelegenheit mal zusammenbauen.
Aber was ist denn eigentlich aus meinem schönen Delphi-Stylesheet geworden? :cry: |
Re: Entwicklung für Vista und XP
Der wird noch benutzt. Ich habe nur meinen Stylesheet für die Codeblöcke benutzt.
|
Re: Entwicklung für Vista und XP
Das Problem ist nur, dass dein Stylesheet nichts mit meinen Klassenangaben anfangen kann. Wenn du das wieder korrigieren könntest, wäre ich dir dankbar. Notfalls passe ich die Farben in der "delphi8.css" an deine Vorgaben an, aber ich formatiere den Quellcode nun mal mit meinem Tool. :stupid:
|
Re: Entwicklung für Vista und XP
Ich habe mal mit einer CSharp-Klasse für den einfachen TaskDialog (nicht TaskDialogIndirect!) angefangen. Die Anwendung ist ähnlich wie die MessageBox. Vom einfachen Aufruf nur mit dem Inhalt bis hin zum kompletten Aufruf inkl. Titel, Buttons, usw. Nur mit dem Symbol habe ich noch Probleme. Grundsätzlich sieht die Deklaration so aus:
Code:
Wenn ich aber, ähnlich wie bei Delphi, den Icon-Wert in einen String umwandle, dann erscheint der Dialog nicht. Nur wenn ich null nehme, klappt es. Anbei mal der Code der Show()-Methode mit allen Parametern, weil hier der eigentliche Aufruf des Dialogs drin steckt:
[DllImport(Win32Libraries.ComCtl32, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern void TaskDialog( IntPtr hwndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, TaskDialogButtons dwCommonButtons, string pszIcon, [In,Out] ref int pnButton); /* ... */ public enum TaskDialogIcon { Blank = 100, Warning, Question, Error, Information, BlankAgain, Shield }
Code:
Die Funktion "GetIconValue" würde also den numerischen Wert von TaskDialogIcon liefern. Etwa 104 für Information. Also in etwa nach dem Prinzip, was
public static TaskDialogResult Show(IntPtr hwndParent, IntPtr hInstance,
string content, string dialogTitle, string mainInstruction, TaskDialogButtons buttons, TaskDialogIcon icon) { if (!SupportedOS.IsWindowsVistaOrHigher()) { throw new NotSupportedException ("Your operating system does not support this dialog."); } int dialogResult = 0; NativeMethods.TaskDialog (hwndParent, hInstance, dialogTitle, mainInstruction, content, buttons, GetIconValue(icon), ref dialogResult); return (TaskDialogResult)dialogResult; } static string GetIconValue(TaskDialogIcon icon) { // return ((int)icon).ToString(); return null; }
Delphi-Quellcode:
bei der Delphi-Version machen würde. Aber das klappt nicht. Wo liegt mein Denkfehler?
MAKEINTRESOURCEW(104)
|
Re: Entwicklung für Vista und XP
Zitat:
Du bräuchtest im Import nicht einmal string als typen nehmen sondern einfach direkt TaskDialogIcon. Sicherheitshalber könntest du TaskDialogIcon so deklarieren, dass es von Int32 "ableitet", aber wirklich nötig sollte das nicht sein. Enum sind ja per default 32Bit-Integer. Ungetestet, aber es sollte so gehen:
Code:
[DllImport(Win32Libraries.ComCtl32, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern void TaskDialog(IntPtr hwndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, TaskDialogButtons dwCommonButtons, [MarshalAs(UnmanagedType.LPWStr)] TaskDialogIcon pszIcon, [In, Out] ref int pnButton); public enum TaskDialogIcon : int { Blank = 100, Warning, Question, Error, Information, BlankAgain, Shield } |
Re: Entwicklung für Vista und XP
Die Anregung war prima. :thumb: Ich musste tatsächlich den (Feld)Marshal bemühen, allerdings so:
Code:
Jetzt funktioniert es.
[DllImport(Win32Libraries.ComCtl32, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern void TaskDialog( IntPtr hwndParent, IntPtr hInstance, string pszWindowTitle, string pszMainInstruction, string pszContent, TaskDialogButtons dwCommonButtons, [MarshalAs(UnmanagedType.U4)] TaskDialogIcon pszIcon, [In,Out] ref int pnButton); |
Re: Entwicklung für Vista und XP
Ich wollte übrigens noch verraten, dass sich das Rätsel mit der Checkbox auch erledigt hat. Wollt ihr wirklich den Grund wissen? Der typische Fall von "die rechte Hand weiß nicht was die linke macht". Rechte und linke Hand sind in dem Fall die Doku-Schreiber und die Programmierer bei Microsoft. :lol: Im SDK und im MSDN steht die Deklaration von "TaskDialogIndirect" so drin, wie ich es
![]()
Code:
Dadurch verschiebt sich der Parameter zum Prüfen der Checkbox um eine Stelle, und siehe da: nun klappt es. Und wo habe ich das gefunden? In einem CSharp-Sample im Windows SDK. :roll:
HRESULT TaskDialogIndirect(
const TASKDIALOGCONFIG *pTaskConfig, int *pnButton, int *pnRadioButton, BOOL *pfVerificationFlagChecked ); Aktuelles Projekt und aktueller Artikel liegen schon bei Luckie im Postfach und werden sicher auch bald online gehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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