none
Statt Controlbox wird in Windows 8.1 nur weißer Fleck angezeigt RRS feed

  • Frage

  • Ich bin kürzlich von Windows 8 auf 8.1 gewechselt und habe nun ein seltsames Phänomen: bei den Formularen meiner Anwendung ist zur Laufzeit im rechten oberen Eck der Titelleiste, wo sonst die Control Box ist, nur ein weißer Fleck. Wenn man mit der Maus draufklickt, dann werden die entsprechenden Funktionen, also Minimieren, Vergrößern und Schließen, jedoch aktiviert (d.h. wenn man auf diesem weißen Fleck die richtige Funktion trifft). In VS 2012 beim Bearbeiten des Formulars ist alles wie gewohnt sichtbar.

    Kann mir bitte jemand sagen, wie ich die ControlBox wieder zurückbekomme (einige meiner Benutzer sind recht ungehalten...)?

    LG Peter

    Sonntag, 24. November 2013 07:44

Alle Antworten

  • Hallo,
    das Problem besteht also nur auf Windows 8.1 und zwar auf jedem (bisher getesteten), aber auch nur bei deinem Programm, oder?

    Handelt es sich um x64 oder x86 Systeme?
    Welche Art von Projektvorlage benutzt du? (WPF/MFC/WinForms/...)
    Welche Programmiersprache nutzt du?
    Machst du irgend etwas in der None-Client-Area (Im Rahmen)?
    Kannst du das Problem in einem neuen Projekt reproduzieren? Wenn ja, dann lade das Projekt bitte hoch. (Bspsw. auf Skydrive)

    PS: Poste bitte auch noch einen Screenshot des ganzen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Sonntag, 24. November 2013 10:13
  • Hallo Koopakiller,

    Danke für die schnelle Reaktion an einem WE! Hier die Antworten:

    1. Es ist ein Lenovo W520 mit x64 System.
    2. Die Entwicklungsplattform ist VS 2012, .net 4.0, VB, Windows Forms
    3. Die Anwendung wurde für x86 Plattform erstellt
    4. Ich runde die Ecken des Formulars ab.
    5. Bild:

    Die Frage nach Punkt 4 war entscheidend: wenn ich das Abrunden weglasse, schaut das Design zwar grindig aus, aber die ControlBox ist wieder da. Ich brauche also eine Möglichkeit, die Ecken des Forms abzurunden, und trotzdem die ControlBox zu haben! :-)

    Sonntag, 24. November 2013 12:24
  • Zeige mal bitte deinen Code, mit dem du den Rahmen abrundest.

    Wird denn noch irgend ein besonderes Windows Design "vorausgesetzt"? Der Rahmen sieht nach dem klassischen Design aus, welches es unter Windows 8 nicht mehr gibt.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 24. November 2013 13:58
  • Naja, außer Abrunden wird nichts vorausgesetzt... Welche Änderung ist denn notwendig, wenn es das klassische Design nicht mehr gibt??

    Der Code sieht wie folgt aus:

    
            Private Sub Form_Resize() Handles Me.Resize
                TraceLog("Form Resize event: width={0}, height={1}", Me.Width, Me.Height)
                If (Me.WindowState = FormWindowState.Minimized) Then
                    If (Options.ClearClipbdOnClose) Then Call ClearClipboard()
                Else
                    abrunden(Me, 0, 0, Me.Width, Me.Height, 20)
                End If
            End Sub
    
        Public Sub abrunden(ByVal was As Form, _
                ByVal x As Integer, ByVal y As Integer, _
                ByVal width As Integer, ByVal height As Integer, _
                ByVal radius As Integer)
    
            Dim gp As System.Drawing.Drawing2D.GraphicsPath = _
              New System.Drawing.Drawing2D.GraphicsPath()
    
            gp.AddLine(x + radius, y, x + width - radius, y)
            gp.AddArc(x + width - radius, y, radius, radius, 270, 90)
            gp.AddLine(x + width, y + radius, x + width, y + height - radius)
            gp.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90)
            gp.AddLine(x + width - radius, y + height, x + radius, y + height)
            gp.AddArc(x, y + height - radius, radius, radius, 90, 90)
            gp.AddLine(x, y + height - radius, x, y + radius)
            gp.AddArc(x, y, radius, radius, 180, 90)
            gp.CloseFigure()
    
            was.region = New System.Drawing.Region(gp)
            gp.Dispose()
        End Sub
    
    

    Sonntag, 24. November 2013 15:04
  • Durch das zuweisen einer Region wird dem Fenster der klassische Stil zugewiesen (Themes werden also entfernt). Dadurch entsteht u.a. auch der Farbverlauf in der Titelleiste.

    Unter Windows 8.1 kann ich den Fehler reproduzieren, unter Windows 8 aber nicht. Darum glaube ich nicht, das es an einem Fehlerhaften API Aufruf liegt. Also auch nicht am fehlenden Design. (Intern gibt es das bestimmt noch, ist bloß nicht mehr in der Systemsteuerung verfügbar)

    Warum sich das geändert hat weiß ich leider auch nicht. Ich würde nun dazu gehen den Rahmen entweder komplett von Windows übernehmen zu lassen  und nichts daran zu ändern oder alles selbst zu machen. Zum selbst zeichen gibt es hier ein Projekt das auch unter Windows 8.1 funktioniert.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 24. November 2013 17:51
  • Danke Koopakiller.

    Ich werde mir das Projekt ansehen, es scheint aber beim ersten Hinschauen, dass ich jetzt anstatt einer 10-Zeilen Routine einen Haufen fremden Code brauchen werde, um eine harmlose, bis jetzt funktionierende Sache wieder zum Laufen zu bringen, so wie es die User gewohnt waren.

    Die Frage stellt sich nun: warum machen die das von Microsoft? Es wird schön langsam ziemlich unwirtschaftlich, unter MS Betriebssystemen Software zu entwickeln, weil die Nebenkosten, die durch solche sinnlose und vor allem durch uns Entwickler nicht beeinflussbare Änderungen entstehen, kaum noch in einem Projekt bzw. in den entsprechenden Wartungseinnahmen unterzubringen sind. Ganz zu schweigen davon, dass das nirgendwo angekündigt wird und somit jedes Mal unweigerlich zum Ärger mit dem Kunden führt. Die drängen uns ja richtig zu Android!

    Sonntag, 24. November 2013 18:14