VB.NET2003 Windows2000環境です。
リッチボックステキストに適当な画像をコピーして貼り付けると張り付いてしまいます。
メニューボタンに「貼り付け」ボタンを(ShortCutはCtrl+V)作成しています。クリップボードをチェックしてテキスト以外だと張りつかないようにしているのですが、Ctrl+Vで張り付いてしまいます。OSのショートカットで張り付いていると思うのですが、どうすればOSのショートカットを無効にしてPG側のショートカットのみを有効にできるのでしょうか?
見当違いな見解でしたらすいません・・・
ご回答のほどよろしくお願い致します。
RichTextBox1のOLEDropModeをrtfOLEDropManualに設定して
ドラッグドロップの処理を
RichTextBox1_OLEDragDrop
に書けばいいのでは。
Private Sub RichTextBox1_OLEDragDrop _
(Data As RichTextLib.DataObject, _
Effect As Long, Button As Integer, _
Shift As Integer, x As Single, y As Single)
If Data.GetFormat(vbCFText) Then 'テキストかどうか判断
RichTextBox1.SelText = Clipboard.GetText
End If
End Sub
こんな具合に。
ねろさん返信ありがとうございます。
質問なんですが、
>RichTextBox1のOLEDropModeをrtfOLEDropManualに設定して
上記の設定方法が分かりませんでした。
RichTextBox1.OLEDropMode = 1
上記の記述方法だと思っていたのですが、ダメでした。(というより.打った際にOLE〜が出なかったです・・・)
色々調べたのですが、設定する方法がどうしても分からないので
教えていただけないでしょうか?
すいませんが、よろしくお願いいたします。
VB6と間違えました。(^^;
>Ctrl+Vで張り付いてしまいます。OSのショートカットで張り付いていると思うのですが
この意味がちょっとわかりませんが、とにかく張り付いているのなら、
Private Sub TextBox2_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) _
Handles TextBox2.DragEnter
If (e.Data.GetDataPresent(DataFormats.Text)) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
End Sub
こんなことをやってみたらどうですか。
>>Ctrl+Vで張り付いてしまいます。OSのショートカットで張り付いていると思うのですが
>この意味がちょっとわかりませんが、とにかく張り付いているのなら、
フォームの上部にメニューを用意して貼り付けボタンを作成しています。そのボタンのショートカットをCtrlVにしています。そのボタンでは、クリップボード内がテキスト形式の場合のみ貼り付けることができるようにしているのですが、クリップボードが画像の際にCtrlVを押すとなぜか貼り付けしまうのです。(ボタンを押した場合には張り付きません)PGとOSのショートカットを同じにしているためそのような現象がおきたのかと思ったんですが・・・それで上記の質問に至った訳です。
ねろさんが教えてくださったソース記述したのですが、CtrlVを押すことで画像がコピーされてしまいました(><;
何か方法はありませんでしょうか?
あ〜!
やっと解りました、ドラッグ・ドロップと勘違いしていました。
勘違いにつぐ勘違い申し訳ない。
KeyDownEventをフックしてClipBoardをテキストで無い場合、クリアーする位しか思いつきません。
Private Sub RichTextBox1_KeyDownEvent(ByVal eventSender As System.Object, ByVal eventArgs As _
AxRichTextLib.DRichTextEvents_KeyDownEvent) Handles RichTextBox1.KeyDownEvent
Static BkeyCode As Integer
Dim datobj As New System.Windows.Forms.DataObject()
If BkeyCode = 17 And eventArgs.keyCode = 86 And System.Windows.Forms.Clipboard.GetDataObject.GetDataPresent( _
System.Windows.Forms.DataFormats.Text) <> True Then
System.Windows.Forms.Clipboard.SetDataObject(datobj)
Else
BkeyCode = eventArgs.keyCode '一つ前の押されたキー
End If
End Sub
消したんじゃまずいかな。。。。。
横レス御免っ(ー人ー)
フックまで行かなくても無効にできるかも?
[VB.NET]
Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown
If e.Control AndAlso e.KeyCode = Keys.V Then
e.Handled = True
End If
End Sub
とりあえずこれで貼り付けされないようにできると思うので、
試してみて下さい。
あっ。ごめんなさい。上の方法は .NET Framework 1.0 では
正常に働かないそうです。ゴロベエさんは VB.NET2003 との
記述がありますので問題ないと思いますが、他の方でテストする
場合はバージョンも気にかけておいて下さい。
ねろさん・特攻隊長まるるうさん返答ありがとうございます。
Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown
If e.Control AndAlso e.KeyCode = Keys.V Then
e.Handled = True
End If
End Sub
上記の特攻隊長まるるうさんのソースで動くことができました。
ねろさんからのソースも動いたのは動いたのですが、ソースが長いので上記のソースで作成しました。ねろさん・特攻隊長まるるうさん、色々と教えて頂きありがとうございました。
ちなみにですが、CtrlVが押された時、PGで設定したショートカットは、有効のままで、OSのショートカットをキャンセルしているという意味でしょうか?
そのように動いていたように見えたのですが、合っていますでしょうか?
>ねろさんからのソースも動いたのは動いたのですが
あ…あれ?そんなに早く解析できた?…って改めてねろさんの
コードを見てちょっと訂正。ってゆーか、ねろさんのコードも
イベントの処理としてはボクのと同じですか?うちの[VB.NET]版
リッチテキストボックスちゃんに KeyDownEvent っていう
イベントが無かったのでローカルフックとかサブクラス化の
話に行ってると思ってソース解析しなかったけど…AxRichTextLib
ってもしかして[VB6.0]のアップグレードからやったコード
…でしたか(?)微妙に話が通じてないままレスしてしまいました。
考え方同じっぽいです、はい(^^;)。違うみたいに書いて
ごめんなさい。
>そのように動いていたように見えたのですが、合っていますでしょうか?
いや、かなり違うと思うけど…(^^;)。コードが分かってるん
だから『見えた』とか言わずにコードを選択状態にして[F1]キー
押せばヘルプに動作を書いてあるんじゃないデスカ?
>[VB6.0]のアップグレードからやったコード…でしたか
はい、はなからドラッグドロップと勘違いしてまして、
画像データーをドラッグ&ドロップできるのは、VB6の
コントロールに違いないとの早とちりからです。
そういえばRichTextそのまま変えずにやってました。
この件に関してはへろへろでした。
行きがかり上無理やりレスつけていたんで助かりました。
ねろさん、特攻隊長まるるうさんありがとうございました。
もう少し勉強が必要なようです。
本当に助かりましたありがとうございました。
ツイート | ![]() |