Aplikacja do notatek - jakich komponentów użyć?

0

Witajcie,

to mój pierwszy post na forum, więc się przy okazji przywitam: Cześć, jestem tu Nowy. :P

Chciałem napisać w C# prostą aplikację do notowania, ale nie mam pojęcia, jakich elementów do tego używać, dlatego proszę was o zasugerowanie co mógłbym wykorzystać, by osiągnąć oczekiwany efekt.

Programuję w VS2013 i początkowo chciałem wybrać WinForms, ale wydaje mi się, że będę musiał przenieść się na WPF.

To co chciałem uzyskać to appka do prostego tworzenia okien tekstowych z następującymi cechami:

  • tworzenie okna tekstowego poprzez przytrzymanie i puszczenie przycisków (jak w paincie, to mam)
  • zmienianie wielkości okna i jego polozenia poprzez wybranie go myszka (jak elementy w draw.io, grafice wektorowe, myslalem nad umieszczeniem textboxa w ContentControl i pomniejszac wlasnie ten element, a textboxa skalowac)
  • wielkosc czcionki zalezna od wielkosci textboxa i ilosci znakow (tak, aby tekst zawsze w pelni go wypelnial)
  • przybliżanie i oddalanie perspektywy (tutaj mi się kojarzy sposób działania Prezi albo Paint, z ta roznica, ze czcionka bylaby juz autoskalowana)

Wystarczy, że powiedzielibyście mi, które elementy do tego wykorzystać.

Z góry dziękuję!

1

Cześć Nowy :P

Co do tej pory zrobiłeś? :)

Na przykład tutaj zobacz na ten bajer: https://www.devexpress.com/Products/NET/Controls/WinForms/Rich_Editor/ możesz takie coś zastosować.
Ogólnie ja bym to zrobił z RichTextBox. Każde nowe okno możesz potraktować jak osobną formę - poszukaj "C# create new form".
To: "zmienianie wielkości okna i jego polozenia poprzez wybranie go myszka " masz od razu dostępne w Properties nowej formy.
Teraz to: "wielkosc czcionki zalezna od wielkosci textboxa i ilosci znakow " - wszystko z poziomu C# ustawiasz, poszukaj "C# set textbox size".

0

Póki co punkt pierwszy - Tworzenie okna tekstowego. :D

wszystko z poziomu C# ustawiasz, poszukaj "C# set textbox size".

Tutaj chodziło mi o to, by tekst się automatycznie skalował do okna, a nie okno do tekstu.

0

Hej, trochę popchnąłem temat do przodu i teraz mam następujące problemy:

  • jak zrobić, by w momencie zaznaczenia textboxa zmieniała się jego obwódka (tak by wskazać, który obecnie textbox jest używany)
    Tutaj próbowałem używać zmiany granicy przy OnGotFocus i OnLostFocus, ale to nie działa tak jak należy, wiec uznałem, że focus nie zmienia się wcale tak jak myślałem.
  • jak zrobić, by dało się skalować panel, w sensie, przybliżać i oddalać obiekty tak jak mamy to na przykładzie draw.io albo corela
0

Do zoomu tutaj masz ciekawy i dosc obszerny artykul: http://www.codeproject.com/Articles/85603/A-WPF-custom-control-for-zooming-and-panning
A co do tego zmieniania bordera to dokladnie tak powinno dzialac jak opisales, ongotfocus/onlostfocus. Mozesz wkleic twojego xamla ktory nie dziala?

0

Ostatecznie zdecydowałem się na WinForms. Ja to robię w oddzielnej klasie, z poziomu C# o tak:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;   //font


namespace AppNote
{
    public class TextField : TextBox
    {
        int border = 15;
        Point previousposition;
        public static bool ismousedown = false;
        
        TextField()
        {
            Multiline = true;            
            ShortcutsEnabled = true;
            TextAlign = HorizontalAlignment.Center;
        }

        protected void ModifyTextPosition(int bgpositionx, int bgpositiony, int endpositionx, int endpositiony)
        {
            if (bgpositionx < endpositionx && bgpositiony < endpositiony)
            {
                this.Left = bgpositionx;
                this.Top = bgpositiony;
                this.Size = new System.Drawing.Size(endpositionx - bgpositionx, endpositiony - bgpositiony);
            }

            if (bgpositionx < endpositionx && bgpositiony > endpositiony)
            {
                this.Left = bgpositionx;
                this.Top = endpositiony;
                this.Size = new System.Drawing.Size(endpositionx - bgpositionx, bgpositiony - endpositiony);
            }

            if (bgpositionx > endpositionx && bgpositiony < endpositiony)
            {
                this.Left = endpositionx;
                this.Top = bgpositiony;
                this.Size = new System.Drawing.Size(bgpositionx - endpositionx, endpositiony - bgpositiony);
            }

            if (bgpositionx > endpositionx && bgpositiony > endpositiony)
            {
                this.Left = endpositionx;
                this.Top = endpositiony;
                this.Size = new System.Drawing.Size(bgpositionx - endpositionx, bgpositiony - endpositiony);
            }
        }

        public static void AddNewTextField(Panel panel, int bgpositionx, int bgpositiony, int endpositionx, int endpositiony)
        {
            try
            {
                TextField txt = new TextField();
                panel.Controls.Add(txt);                
                txt.ModifyTextPosition(bgpositionx, bgpositiony, endpositionx, endpositiony);
                txt.Font = new Font(txt.Font.FontFamily, txt.Size.Height / 5);                
            }
            catch (Exception e)
            {

            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle)
            {
                this.Cursor = Cursors.SizeAll;
                this.Top += e.Y - previousposition.Y;
                this.Left += e.X - previousposition.X;                
            }

            ResizeTextField(e);
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            ismousedown = false;
        }

        
        protected void ResizeTextField(MouseEventArgs e)
        {
            int msg = -1; //if (msg == -1) at the end of this, then the mousedown is not a drag.

            if (e.Y < border)
            {
                if (e.X < border)
                {
                    this.Cursor = Cursors.SizeNWSE;
                }
                else if (e.X > Width - border)
                {
                    this.Cursor = Cursors.SizeNESW;
                }
                else
                {
                    this.Cursor = Cursors.SizeNS;
                }

                if (e.Button == MouseButtons.Left)
                {
                    msg = 12; //Top
                    if (e.X < 25) msg = 13; //Top Left
                    if (e.X > Width - 25) msg = 14; //Top Right
                }
            }
            
            else if (e.Y > Height - border)
            {
                if (e.X < border)
                {
                    this.Cursor = Cursors.SizeNESW;
                }
                else if (e.X > Width - border)
                {
                    this.Cursor = Cursors.SizeNWSE;
                }
                else
                {
                    this.Cursor = Cursors.SizeNS;
                }

                if (e.Button == MouseButtons.Left)
                {
                    msg = 15; //Bottom
                    if (e.X < 25) msg = 16;
                    if (e.X > Width - 25) msg = 17;
                }
            }

            else if (e.X < border)
            {
                this.Cursor = Cursors.SizeWE;

                if (e.Button == MouseButtons.Left)
                {
                    msg = 10; //Left
                    if (e.Y < 17) msg = 13;
                    if (e.Y > Height - 17) msg = 16;
                }
            }
            else if (e.X > Width - border)
            {
                this.Cursor = Cursors.SizeWE;

                if (e.Button == MouseButtons.Left)
                {
                    msg = 11; //Right
                    if (e.Y < 17) msg = 14;
                    if (e.Y > Height - 17) msg = 17;
                }
            }
            else
            {
                this.Cursor = Cursors.Default;
            }

            if (msg != -1)
            {
                UnsafeNativeMethods.ReleaseCapture(); //Release current mouse capture
                UnsafeNativeMethods.SendMessage(Handle, 0xA1, new IntPtr(msg), IntPtr.Zero);
                //Tell the OS that you want to drag the window.
            }

        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            this.BringToFront();
            if(e.Button == MouseButtons.Middle) previousposition = e.Location;

            if (e.Button == MouseButtons.Left)
            {
                ismousedown = true;
                ResizeTextField(e);               
            }            
        }

        protected override void OnGotFocus(EventArgs e)
        {
            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        }

        protected override void OnLostFocus(EventArgs e)
        {
            this.BorderStyle = BorderStyle.Fixed3D;
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1