Gå til innhold

Bruk av RTF utenom Rich Text Box


Anbefalte innlegg

Videoannonse
Annonse

Takk, da har jeg begynt med det.

Har RTF 2007 dokumentasjon

 

Og jeg har løst det ved å lage en Linked list for hver linje, og hver linje er en array med objekter, som kan være et stykke med Tekst med formatering, et bilde, eller en tabell.

Tabellen er ganske uferdig enda, jeg har ikke funnet noen god løsning på dette enda.

 

Takk for svar

Lenke til kommentar
Takk, da har jeg begynt med det.

Har RTF 2007 dokumentasjon

 

Og jeg har løst det ved å lage en Linked list for hver linje, og hver linje er en array med objekter, som kan være et stykke med Tekst med formatering, et bilde, eller en tabell.

Tabellen er ganske uferdig enda, jeg har ikke funnet noen god løsning på dette enda.

 

Takk for svar

7854519[/snapback]

 

Og dere post'er vel koden når den er ferdig? :D

Lenke til kommentar

Jeg har funnet svaret på mitt eget spørsmål:

Hvordan få tak i piltastene uten at scrollbarene kødder det til (inkludert tab)

protected override bool IsInputKey(Keys key)

 

Returner true i denne funksjonen hvis kontrollen din tar imot den tasten.

 

edit:

 

Lag en ny klasse som inheriter HScrollBar og VScrollBar og legg til dette, for å hindre scrollbar i å være latterlig irriterende.

Endret av GeirGrusom
Lenke til kommentar

Hehe, gir ut et skryte-screenshot av RtfEditor kontrollen min :)

Den er laget av en annen klasse, som heter RtfFile

 

Den firkanten på bildet er en tabell, men tabell er ganske uferdig enda.

 

Edit:

Enda en oppdatering, RtfTextBox kontrollen min kan nå lage Rtf tekst og filer, som kan leses av Word og Wordpad knirkefritt :D støtter unicode

Litt jobb enda med velging av tekst, men det kommer seg, bare Rtf parseren igjen.

post-31659-1171120932_thumb.png

Endret av GeirGrusom
Lenke til kommentar

Jeg laget en UserControl som overider IsInputKey() får å gjøre sånn at den kan ta imot Tab, Enter og Piltaster.

 

Resten blir tegnet med System.Drawing.Graphics.

Jeg bruker CreateGraphics for å tegne opp linjen man endrer (for å få opp hastigheten), mens resten blir tegnet i Paint event (for å slippe flimring)

Og scrollbarene bruker Graphics.ScreenCopy(eller hva den nå het igjen) også pga. hastighet :)

Lenke til kommentar

Huja! Jeg kan skrive Rtf dokumenter i min egen rtf edtitor som både Word 2007 og Wordpad leser!

Men parseren....

 

Vel, jeg har laget en klasse:

public class RtfSegment
{
 protected string m_controlword;
 protected bool m_value;
 protected bool m_parent;	// Will this be a list? ( e.g. fonttbl, colortbl )
 protected RtfSegmentFunction m_parser;	// Parser function delegate

 public bool IsParent { get { return m_parent; } }
 public bool IsValue { get { return m_value; } }
 public string ControlWord { get { return m_controlword; } }

 public RtfSegment(string controlword, bool parent, bool value, RtfSegmentFunction parser) (...)

 public RtfSegment(string controlword, bool parent, RtfSegmentFunction parser) (...)
 public RtfSegment(string controlword,  RtfSegmentFunction parser) (...)
 public override string ToString() (...)
}

Denne klassen inneholder iogforseg ingen parse kode, men hver definerer et controlword/controlcharacter og spesifiserer en funksjon i parseren som skal kalles, hver gang disse control word/char støtes på i filen... jeg får litt problemer med { } grunnet at jeg ikke heeeelt forstår hva i svarte de er til... det står "pushes the stack" eller noe sånt skit i dokumentasjonen, noen som vet? problemet ligger i om jeg må skrive en recursive funskjon read eller ikke, helst ikke, recursive funksjoner er fandens barn, og unngås hvis det er mulig.

Lenke til kommentar
Ok, nytt problem:

Når jeg nå trykker piltastene på min RichTextBox kontroll, så vil alltid ScrollBarene begynne å bevege seg, istedet for Caret... hvordan overrider jeg det?

7863059[/snapback]

 

Offtopic, men jeg spør allikevel.

Har .Net innebygde klasser for å tegne carets (tekstmarkør) i Graphics-objekter, eller tegner du den selv? Eller bruker du caret-funksjonene (CreateCaret SetCaretPos etc) i user32.dll?

Lenke til kommentar

Jeg har implementert Caret funksjonene, istedet, som du foreslo, så jeg gir ut en Caret klasse, hvis noen er interesert

public class Caret : IDisposable
{
 private uint m_ms;
 private int m_width;
 private int m_height;
 private Control m_target;
 private bool m_visible;
 private Bitmap m_bmp;
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int ShowCaret(IntPtr hWnd);
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int HideCaret(IntPtr hWnd);
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int DestroyCaret();
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int SetCaretPos(int x, int y);
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int GetCaretPos(ref Point p);
 [System.Runtime.InteropServices.DllImport("user32")]
 private static extern int SetCaretBlinkTime(uint ms);

 public Caret(Control target, Bitmap bmp)
 {
 	m_bmp = bmp;
 	m_target = target;
 	m_width = SystemInformation.BorderSize.Width;
 	m_height = SystemInformation.BorderSize.Height;
 	Create();
 }

 public Caret(Control target)
 {
 	m_target = target;
 	m_ms = (uint)SystemInformation.CaretBlinkTime;
 	Create();
 	
 }

 public void Destroy()
 {
 	DestroyCaret();
 }


 public void Create()
 {
 	CreateCaret(m_target.Handle, (m_bmp == null ? IntPtr.Zero : m_bmp.GetHbitmap()), m_width, m_height);

 	if (m_visible)
   Show();
 	else
   Hide();
 }

 public void Show()
 {
 	ShowCaret(m_target.Handle);
 	m_visible = true;
 }
 public void Hide()
 {
 	HideCaret(m_target.Handle);
 	m_visible = false;
 }

 public bool Visible { get { return m_visible; } set { if (value) Show(); else Hide(); } }

 public Point Position { get { Point p = new Point(); GetCaretPos(ref p); return p; } set { SetCaretPos(value.X, value.Y); } }
 public uint BlinkTime { get { return m_ms; } set { m_ms = value; SetCaretBlinkTime(value); } }

 public int Height { get { return m_height; } set { m_height = value; Create(); } }
 public int Width { get { return m_width; } set { m_width = value; Create(); } }

 #region IDisposable Members

 public void Dispose()
 {
 	DestroyCaret();
 	System.GC.SuppressFinalize(this);
 }

 #endregion

 ~Caret()
 {
 	DestroyCaret();
 }
}

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...