Date Time Picker (CDateTimeCtrl) mit dem Windows 10 Creators Update (NOT UNICODE)

Seit dem Upgrade auf die Windows 10 Creators Update sind die Date Time Picker Controls in meiner Anwendung "defekt".

Bild

(steht im Langformat für den Montag, 10. April 2017)

Es scheint, als wären die Feldbreiten für die einzelnen Elemente nicht breit genug (in der Standardeinstellung).

Dies betrifft sowohl das Langformat als auch das Kurzformat.

Tritt nur dann auf, wenn die Projekte nicht mit Unicode unterstützung erstellt werden, sobald Unicode verwendet wird, scheint es zu gehen.

Wenn man das Format explizit definiert, wird es besser, ist aber immer noch nicht sauber.

Das ganze lässt sich auch einfach nachstellen:

- Neues Projekt mit dem Visual Studio

- MFC Dialogfeldbasiertes Projekt erstellen (mit Multibyte Zeichensatz, nicht Unicode!)

- Date Time Picker in den Dialog einfügen

- CDateTimeCtrl als Control

- Ausführen

Ich konnte bislang dazu noch nichts finden und weiß leider nicht, wo ich einen so gearteten bug melden kann (weil es nicht  direkt auf ein Produkt bezogen ist).
Ich bin mir sicher, dass die Anwendung meiner Firma (> 200k Installationen) nicht die einzige ist, die betroffen ist.

Ich kann das ganze hier nachvollziehen. Da scheint es noch einen Bug zu geben. 

Melde das bitte über die Feedback App an Microsoft selber, damit der Fehler behoben werden kann. Im gestrigen, kumulativen Update scheint es noch nicht behoben worden zu sein.

Du kannst auch den Feedback Link hier posten, dann können andere Nutzer das hochvoten.

---
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...

16 Personen fanden diese Antwort hilfreich

·

War diese Antwort hilfreich?

Das war leider nicht hilfreich.

Toll! Vielen Dank für Ihr Feedback.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback. Das hilft uns, die Website zu verbessern.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback.

Die Antwort der Windows Product Group liegt bereits vor und es handelt sich um einen Fehler im Windows 10 Creators Update.

Das DateTime Picker Control wird durch Code in der Betriebssystem DLL COMCTL32.dll implementiert. Die COMCTL32.dll liegt in zwei Hauptversionen vor:

5.x für legacy, non-Unicode Anwendungen. Diese Version existiert aus Kompatibilitätsgründen, damit ältere Anwendungen auf neuen Betriebssystemen funktionieren (sollten).

6.x, neuere, bessere, empfohlene Version für Unicode Anwendungen.

Anbei der Original Wortlaut der Rückmeldung der Windows 10 Produkt Gruppe zu diesem Fall:

“This only occurs in applications that use the Date Time Picker implemented on COMCTL32 V5.

Any application using the COMCTL32 V5 Date Time Picker on RS2 will encounter this problem, including MFC and Windows Forms applications.

Unfortunately, there is currently no workaround for the issue when using the COMCTL32 V5 Date Time Picker other than removing the RS2 update, if possible.

Affected applications could be updated to use COMCTL32 V6, but this is not a trivial change due to the differences in the control implementations between V5 and V6.”

D.h. die aktuell einzige Lösung wäre die MFC Anwendung (zumindest teilweise) auf UNICODE und damit auf die COMCTL32 V6 umzustellen.

Die Verwendung der COMCTL32 V6 passiert über die Projekteinstellung UNICODE Characterset und dadurch über ein Manifest (RT_MANIFEST Resource), die dem Lader mitteilt, die neue Version 6 der COMCTL32.dll zu verwenden.

Egal, ob eine MFC Anwendung für UNICODE erzeugt wird, ist es möglich UNICODE und ANSI Strings zu verwenden (und auch UNICODE und nicht UNICODE Controls können innerhalb einer Anwendung, innerhalb eines Dialog Fensters verwendet werden)

Die Definition von _UNICODE bewirkt (lediglich), dass UNICODE zum Default Zeichenformat wird.

Unicode Programming Summary

https://msdn.microsoft.com/en-us/library/dybsewaf.aspx?f=255&MSPPError=-2147217396

Falls notwendig, können Sie das #define _UNICODE in Ihren C/C++ Sourcen durch ein #undef _UNICODE Rückgängig machen.

#undef Directive (C/C++)

https://msdn.microsoft.com/en-us/library/ts4w8783.aspx

Eventuell können Sie Ihren Code, der das DateTime Picker Control verwendet in eine eigene MFC Regular Unicode DLL auslagern, um so das Problem schnell mit minimalen Konvertierungsaufwand zu umgehen. Eine MFC Regular DLL kann / wird mit einer eigenen MFC DLL  verwendet, was dann Ihrem Fall die Unicode Version der MFC DLL ist.

Diese MFC UNICODE Regular DLL könnte dann in der Zukunft nach und nach weiteren GUI Code Ihrer Anwendung übernehmen und somit eine sukzessive Konvertierung ermöglichen.

UNICODE ist das native Zeichenformat für alle modernen, derzeit supporteten Microsoft Betriebssysteme. D.h. für die meisten Betriebssystem Funktionen, die Parameter vom Typ String haben, wird in der nicht UNICODE Variante der ANSI String Parameter intern nach UNICODE konvertiert. Dasselbe gilt für Rückgabeparameter. D.h. die Verwendung von UNICODE bring in aller Regel (geringe) Performance Vorteile und vor allem eine Vereinfachung der Anpassungsmöglichkeit der Anwendung für andere Länder und Sprachen.

Nur für den unwahrscheinlichen Fall, dass Sie noch Windows 95 / 98 unterstützen müssen, macht eine nicht UNICODE MFC Anwendung heutzutage noch Sinn.

Die Windows 10 Produkt Gruppe versucht aktuell diesen Fehler zu beseitigen. Leider liegt noch keine Aussage vor wann und mit welchem Update dies geschehen wird.

5 Personen fanden diese Antwort hilfreich

·

War diese Antwort hilfreich?

Das war leider nicht hilfreich.

Toll! Vielen Dank für Ihr Feedback.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback. Das hilft uns, die Website zu verbessern.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback.

Hier

https://connect.microsoft.com/VisualStudio/feedback/details/3129203/date-in-datetime-of-mfc-application-is-getting-cropped-in-win10-redstone2-build-15055

gibt es den Hinweis im stdafx.h folgende Ergänzung hinzuzufügen (damit wird auch in einer "Nicht Unicode Anwendung" die V6 verwendet):

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

Ist dies ein sinnvoller workaround?

Mit welchen Seiteneffekten?

15 Personen fanden diese Antwort hilfreich

·

War diese Antwort hilfreich?

Das war leider nicht hilfreich.

Toll! Vielen Dank für Ihr Feedback.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback. Das hilft uns, die Website zu verbessern.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback.

So ganz haut der Hinweis der Produktgruppe scheinbar nicht hin.

In meiner Property Sheet Extension DLL, die seit Windows 10 nicht mehr in Explorer.exe, sondern in DLLHost.exe läuft, funktioniert es auch mit Common-Control 6.0 Manifest und UNICODE übersetzt nach wie vor nicht.

Ob die Common-Controls 6.0 genutzt werden, ist leider nicht so leicht festzustellen.

Im Prozess sind beide Version geladen, SXSTRACE sagt zu ganzen Sache absolut nichts.

War diese Antwort hilfreich?

Das war leider nicht hilfreich.

Toll! Vielen Dank für Ihr Feedback.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback. Das hilft uns, die Website zu verbessern.

Wie zufrieden sind Sie mit dieser Antwort?

Vielen Dank für Ihr Feedback.

 
 

Frageninformationen


Zuletzt aktualisiert 30 Januar, 2021 Aufrufe 2.483 Gilt für: