Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Verfälschte Farben
CSharp79
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Verfälschte Farben

beantworten | zitieren | melden

Hallo zusammen,

ich habe ein Programm geschrieben, bei dem einfarbige Balken auf einem Canvas-Element gezeichnet werden.
Nun habe ich folgendes Problem: Wenn ich bei Width "1" einstelle, sehe ich, dass die Balken nicht schwarz/weiß sind, sondern
gräuliche Farben haben (das stelle ich fest, indem ich unter Windows 10 bspw. mit der Bildschirmlupe rein zoome). Hat jemand eine Idee, woran dies liegen könnte?

Visual Studio Express 2017 für Windows Desktop, Version 15.9.17
Windows 10

Vielen Dank und Gruß,
Noreeli
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von CSharp79 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15832
Herkunft: BW

beantworten | zitieren | melden

Bitte beachte [Hinweis] Wie poste ich richtig? und hänge Quellcode nicht als Dateien an, sondern poste die relevanten Dinge in die Code-Tags.
Habe die Dateien entfernt.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

WPF Tutorial: Draw lines excactly on physical device pixels sollte dir weiterhelfen.
private Nachricht | Beiträge des Benutzers
CSharp79
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen,
hier ist mein (abgespeckter) Code:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace OnePixLines
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int line_width = 4;

        public MainWindow()
        {
            InitializeComponent();
            DrawSomeLines();
        }

        private void DrawSomeLines()
        {
            canvas.Children.Clear();           

            for (int i = 0; i < 200; i++)
            {
                System.Windows.Point[] points = new System.Windows.Point[2]
                    {
                    new System.Windows.Point(line_width*i,  0),
                    new System.Windows.Point(line_width*i , 500)
                    };
                points[0].X = line_width * i;
                points[0].Y = 0;
                points[1].X = line_width * i;
                points[1].Y = 500;
                DrawLine(points,i);
            }
        }

        private void DrawLine(System.Windows.Point[] points, int color)
        {
            Polyline line = new Polyline();
            PointCollection collection = new PointCollection();
            foreach (System.Windows.Point p in points)
            {
                collection.Add(p);
            }

            line.Points = collection;

            if (color % 2 == 0)
                line.Stroke = new SolidColorBrush(Colors.Black);
            else
                line.Stroke = new SolidColorBrush(Colors.White);
            
            line.StrokeThickness = line_width;
            canvas.Children.Add(line);
        }
    }
}





<Window x:Class="OnePixLines.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OnePixLines"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Background="Transparent">
    <Grid>
        <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="420" VerticalAlignment="Top" Width="784"/>

    </Grid>
</Window>



Ich habe mir den Link zum WPF-Drawing durchgelesen. Ich verwende kein "Pen", hier ist mir nicht klar, wie ich das auf meine Verwendung von "Point" übertragen kann. Außerdem frage ich mich, wie und wo ich die Funktion "OnRender" verwenden kann/muss?

Vielen Dank für Eure Rückmeldungen.
Gruß, Noreeli
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

Intern werden die Komponenten Line, Polyline, ... auch mittels Pen (bzw. bei einem Muster mittels Brush) gezeichnet und standardmäßig wird Antialiasing benutzt.
Hast du denn mal SnapToDevicePixels=true ausprobiert?
Und was passiert, wenn du line_width = 1 setzt?

Und die OnRender-Methode dient nur als Beispiel zum direkten Zeichnen.

PS: Warum setzt du die points in der DrawSomeLines()-Methode doppelt?

Und das Setzen der line.Points kannst du verkürzen zu


line.Points = new PointCollection(points); // keine eigene Schleife nötig

private Nachricht | Beiträge des Benutzers
CSharp79
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Zitat
SnapToDevicePixels=true

Das ist die Lösung. Vielen Dank.

Gruß, Noreeli
private Nachricht | Beiträge des Benutzers