2013-03-10 4 views
10

A mio parere, MS Office Smooth Typing è una funzionalità molto innovativa in Office Suite e vorrei sapere se questa funzione è disponibile per i programmatori in .NET Framework, in particolare nel linguaggio C#.C'è un modo per integrare MS Office Smooth Typing in un'applicazione C#?

Se è così, la prego di inviare in risposta un link alla documentazione e potrebbe anche un esempio di utilizzo ?

Grazie.

+2

Si prega di spiegare che cosa questa caratteristica "tipizzazione Smooth" è. Ti riferisci agli effetti animati del caret? – Dai

+2

@Dai Mi riferisco all'animazione di battitura, che fa scorrere il cursore durante la digitazione. Può essere facilmente notato quando si digita qualcosa in MS Office Word 2010 e quindi si passa a MS Office Word 2013. – Zignd

risposta

11

Non sono proprietario di Office, quindi non riesco a guardare la funzione, ma avevo bisogno di giocherellare con il caret in RichTextBoxes qualche tempo fa e ho deciso che non ne valeva la pena. Fondamentalmente sei da solo. Nessuna funzione di supporto da .NET, ma tutto viene gestito dal controllo Win32 di supporto. Avrai difficoltà a sconfiggere ciò che già accade sotto il cofano. E probabilmente finiscono per intercettare messaggi di finestre e un sacco di codice brutto.

Quindi il mio consiglio di base è: non farlo. Almeno per i controlli di base dei moduli come TextBox o RichTextBox. Potresti avere più fortuna nel tentativo di accedere in remoto a un ufficio in esecuzione da .NET, ma è una lattina totalmente diversa dai worm.

Se proprio insisti in corso le SetCaretPos - percorso, qui è un codice di farti installato e funzionante con una versione base in cui è possibile migliorare su:

// import the functions (which are part of Win32 API - not .NET) 
[DllImport("user32.dll")] static extern bool SetCaretPos(int x, int y); 
[DllImport("user32.dll")] static extern Point GetCaretPos(out Point point); 

public Form1() 
{ 
    InitializeComponent(); 

    // target position to animate towards 
    Point targetCaretPos; GetCaretPos(out targetCaretPos); 

    // richTextBox1 is some RichTextBox that I dragged on the form in the Designer 
    richTextBox1.TextChanged += (s, e) => 
     { 
      // we need to capture the new position and restore to the old one 
      Point temp; 
      GetCaretPos(out temp); 
      SetCaretPos(targetCaretPos.X, targetCaretPos.Y); 
      targetCaretPos = temp; 
     }; 

    // Spawn a new thread that animates toward the new target position. 
    Thread t = new Thread(() => 
    { 
     Point current = targetCaretPos; // current is the actual position within the current animation 
     while (true) 
     { 
      if (current != targetCaretPos) 
      { 
       // The "30" is just some number to have a boundary when not animating 
       // (e.g. when pressing enter). You can experiment with your own distances.. 
       if (Math.Abs(current.X - targetCaretPos.X) + Math.Abs(current.Y - targetCaretPos.Y) > 30) 
        current = targetCaretPos; // target too far. Just move there immediately 
       else 
       { 
        current.X += Math.Sign(targetCaretPos.X - current.X); 
        current.Y += Math.Sign(targetCaretPos.Y - current.Y); 
       } 

       // you need to invoke SetCaretPos on the thread which created the control! 
       richTextBox1.Invoke((Action)(() => SetCaretPos(current.X, current.Y))); 
      } 
      // 7 is just some number I liked. The more, the slower. 
      Thread.Sleep(7); 
     } 
    }); 
    t.IsBackground = true; // The animation thread won't prevent the application from exiting. 
    t.Start(); 
} 
+0

Quello. È. Stupefacente. Grazie mille. –

+0

Codice molto sorprendente! come dice @newStackExchangeInstance, ma c'è un problema che si verifica quando premi enter per entrare in una nuova riga, il cursore prende lo stesso tempo impiegato per andare oltre pensi di poterlo aggiustare in modo che il cursore possa tornare indietro la velocità predefinita? Penso che questo risolva il problema e in tal caso ti do la taglia. – Zignd

+0

Grazie. Se questo è l'unico problema che vedi, allora va bene :). Direi che ci sono altre cose non piacevoli, come se digiti troppo velocemente, le lettere appaiono prima che il cursore "arrivi", e così via .. Ad ogni modo, ho aggiornato il codice in modo che non animi il cursore quando la distanza è troppo lontana, quindi dovrebbe "saltare" ora verso la linea successiva invece di muoversi lentamente lì. Divertiti con il codice;) – Imi

3

Utilizzare SetCaretPos con la propria funzione di temporizzazione dell'animazione. Crea un nuovo thread che interpola la posizione del cursore in base alla posizione precedente e alla nuova posizione desiderata.

Problemi correlati