1

Windows Formsを使用して C# で小さなアプリケーションを作成しています。ユーザーがアプリケーション内でデータをコピー アンド ペーストできるようにしたいのですが、いくつかのカスタム コントロールがあります。たとえば、カラー ピッカーです。

一部のデフォルト コントロール (少なくとも TextBox) には、既にコピー アンド ペースト機能があります。カラーピッカーで同じことをしたいのですが、上部にある「編集」メニューでコピーして貼り付けたいです。

現時点では、これをうまく行う方法がわかりません。現在の方法は、Ctrl+CおよびCtrl+Vコマンドとメニューのクリックをキャッチし、 Win32呼び出しを使用してフォーカスされたコントロールを見つけてから関数を実行することです。コントロールとの間でデータをコピーまたは貼り付けます (ifフォーカスされたコントロールのタイプに応じて大量のステートメントを使用します)。

別の方法は、すべてのカスタム コントロールにキー処理を書き込むことのようですが、この方法では、[編集] メニュー機能を組み込む方法がわかりません。

これをエレガントまたはより「標準的な」方法で行うにはどうすればよいですか?

4

4 に答える 4

3

最も簡単な方法は、フォームでアクティブ化してから、イベントKeyPreviewでロジックに従うことです。KeyDown

しかし、別のアプローチが役立つ
場合があります: Win アプリケーションにメニューがある場合 (たとえば &Edit => コピー (貼り付け))。

そのメニューのキーボード ショートカットを有効にする

// 
// editToolStripMenuItem
// 
this.editToolStripMenuItem.DropDownItems.AddRange(new 
System.Windows.Forms.ToolStripItem[] {
this.copyToolStripMenuItem,
this.pasteToolStripMenuItem});
this.editToolStripMenuItem.Text = "Edit";
// 
// copyToolStripMenuItem
// 
**this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)
((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));**
this.copyToolStripMenuItem.Text = "&Copy";
// 
// pasteToolStripMenuItem
// 
**this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)
((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));**
this.pasteToolStripMenuItem.Text = "&Paste";

したがって、コピーペーストへのショートカットがあります。メニューのクリックだけを管理

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
    Image myData = this.ActiveControl.BackgroundImage;
    Clipboard.SetImage(myData);
}

private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
{
    Image myData = Clipboard.GetImage();
    this.ActiveControl.BackgroundImage = myData;
}

確かに、ユーザーに表示したくない場合は、メニューを非表示にすることができます。

================================================== ============================= 更新

複数のコントロールのコード:

    private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ICopyPasteable control = sender as ICopyPasteable;
        if (control != null)
        {
            control.CopyToClipboard();
        }
    }

    private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ICopyPasteable control = sender as ICopyPasteable;
        if (control != null)
        {
            control.PasteFromClipboard();
        }
    }
}


public interface ICopyPasteable
{
    void CopyToClipboard();
    void PasteFromClipboard();
}

public class MyTextBox : TextBox, ICopyPasteable
{

    #region ICopyPasteable Membres

    public void CopyToClipboard()
    {
        Clipboard.SetText(this.Text);
    }

    public void PasteFromClipboard()
    {
        if (Clipboard.ContainsText())
        {
            this.Text = Clipboard.GetText();
        }
    }

    #endregion
}
于 2009-12-02T11:52:49.767 に答える
0

KeyUpイベントは私の問題を解決しました!イベントKeyDownとコピーのために+をKeyPressキャッチしませんでした!CtrlC

StackOverflowの質問からテキストボックスでCtrl+Cをキャッチ

private void txtConsole_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyData == (Keys.C | Keys.Control))
    {
        _consolePort.Write(new byte[] { 3 }, 0, 1);
        e.Handled = true;
    }
}
于 2011-06-22T09:04:59.227 に答える
0

フォーカスされたコントロールを見つけるには:ContainerControl.ActiveControl。次に、コントロールの種類に応じて、値を設定できます(クリップボードの値を使用)。

于 2009-12-02T10:24:41.793 に答える
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 notep
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void b1_Click(object sender, RoutedEventArgs e)//copy
        {
            Clipboard.SetText(richTextBox1.Selection.Text);
            richTextBox1.Selection.Text = string.Empty;

        }

        private void b2_Click(object sender, RoutedEventArgs e)//cut
        {
            Clipboard.SetText(richTextBox1.Selection.Text);
        }

        private void b3_Click(object sender, RoutedEventArgs e)
        {

         richTextBox1.Selection.Text =richTextBox1.Selection.Text + Clipboard.GetText();//paste
        }
    }
}
于 2013-09-15T14:34:50.130 に答える