ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 19:32

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - 複数行EditBoxでショートカットキーの登録
作成者 メッセージ
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
淡幻星 様

ご返信遅れてしまい申し訳ありません!
最近研究に追われていて、ろくにプログラミングをしていない……

まず、行番号の件、解決しました!
>K2さんのコードの場合は、hFont_MainWndを設定しているので
完全にこれでした…指定し直すとできました!

戻るの方は……まだ謎です。
投稿記事 Posted: 2015年11月11日(水) 01:53
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
Beep音が消えたようで良かったです。

Ctrl+Zの件は、、、分かりません。
本件のWM_CHARに対する処理を追加してから、の現象でしょうか?
WM_CHARでCtrl+Zを捉まえては「いない」のですよね?

行番号の件は、、、フォントをうまく取得出来ていないんだと思います。
もし、私が投降したコードを利用しているのであれば、
SelectObject( hDC, SendMessage( hWnd, WM_GETFONT, 0, 0 ) )
の部分で、SendMessage( hWnd, WM_GETFONT, 0, 0 )の値が失敗していないか
確認してください。
※K2さんのコードの場合は、hFont_MainWndを設定しているので、
 RADで設定したフォントの縦幅になります。

以上です。
投稿記事 Posted: 2015年9月05日(土) 19:35
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
淡幻星 様

ご回答有り難うございます。
引用:
大変間が空いてしまってすみません。
(なかなか来れませんでした・・・)
お忙しい中対応していただきありがとうございます><
感謝感激でございます!
引用:
ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。
こちらを実行したところ、ビープ音が消えました!ありがとうございます!!
これで、求めていたものはできました!!

……のですが……

Ctrl+Z、つまり、「戻す」機能が思ったように実行できません。

適当に文字を書き、Ctrl+Zを押すと、
普通なら文字が消える(または、以前の文字に置き換わる)はずなのですが、
一番最初の文字に戻ってしまうだけになります。

少しわかりにくいので、以下に詳細の図をば……
画像

この現象は……何故なのでしょうか?
なお、「戻る」は
コード:
SendMessage(hEdit,WM_UNDO,0,0)
※hEdit = GetDlgItem(hMainWnd, EditBox1)
を利用しています。

よろしければご教授ください。
投稿記事 Posted: 2015年9月05日(土) 02:57
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
大変間が空いてしまってすみません。
(なかなか来れませんでした・・・)

で、先の私の投稿、間違いがありました。大変申し訳ないです。
ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。

自コードの場合は、WM_DOWNの処理に続いて、下記のように書いてました。
V~Gと記述しているキーとCtrl同時押しに対して、ビープ音とデフォルト動作を無効化しています。
コード:
Case WM_CHAR
	GetKeyboardState( buf )
	If( buf[VK_CONTROL] AND &H80 )Then
		'Ctrlキーの場合は、独自処理において、エラー音&Def操作を消す。
		If( (buf[ Asc("L") ] AND &H80) _
			or (buf[ Asc("V") ] AND &H80) _
			or (buf[ Asc("A") ] AND &H80) _
			or (buf[ Asc("S") ] AND &H80) _
			or (buf[ Asc("F") ] AND &H80) _
			or (buf[ Asc("H") ] AND &H80) _
			or (buf[ Asc("R") ] AND &H80) _
			or (buf[ Asc("T") ] AND &H80) _
			or (buf[ Asc("N") ] AND &H80) _
			or (buf[ Asc("B") ] AND &H80) _
			or (buf[ Asc("Q") ] AND &H80) _
			or (buf[ Asc("W") ] AND &H80) _
			or (buf[ Asc("J") ] AND &H80) _
			or (buf[ Asc("U") ] AND &H80) _
			or (buf[ Asc("E") ] AND &H80) _
			or (buf[ Asc(" ") ] AND &H80) _
			or (buf[ Asc("M") ] AND &H80) _
			or (buf[ Asc("G") ] AND &H80) _
		)Then
			MyEditWndProc = 0
			Exit Function
		End If
	End If
なお「行番号付き~」は当方も同じ実装をしているので、
そちらは関係ないと思います。

なお×2、GetAsyncKeyState()は、キーを同時押しが増えると検知できない時があります。
GetKeyboardState()の方がお勧めです。

参考サイト:
http://zahyou.6.ql.bz/cgame/key.htm
http://rina.jpn.ph/~rance/directx8/03/03.html
投稿記事 Posted: 2015年8月17日(月) 00:23
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
たかせ様

ご返信有難うございます。
コード:
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC)
を行ってみましたが変わりありませんでした。

そしてふと思ったのですが、k2様の「行番号付きエディットボックス」をEditBoxに適応しているのですが、
もしかしたらこれが原因なのでしょうか…?

とりあえず、変わってはいませんがサブクラス化したコールバック関数はこのようになっています
コード:
'EditBox1のサブクラス コールバック関数

Dim OldEditProc As WNDPROC

Function Edit1WndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	If dwMsg = WM_KEYDOWN Then
		If (GetAsyncKeyState(VK_CONTROL) And &H8000) Then
			If wParam = 65 Then
				'Ctrl+Aが押されたら、全て選択する
				MainWnd_IDM_SELECTALL_MenuClick()
			Else If wParam = 83 Then
				'Ctrl+Sが押されたら、保存する
				MainWnd_IDM_SAVE_MenuClick()
			Else If wParam = 79 Then
				'Ctrl+Oが押されたら、ファイルを開く
				MainWnd_IDM_OPEN_MenuClick()
			Else If wParam = 191 Then
				'Ctrl+/が押されたら、文字数カウント
				MainWnd_IDM_TEXTCOUNT_MenuClick()
			Else If wParam = 70 Then
				'Ctrl+Fが押されたら、検索置換
				MainWnd_IDM_TEXTSEARCH_MenuClick()
			Else If wParam = 188 Then
				'Ctrl+,が押されたら、環境設定
				MainWnd_IDM_SETTING_MenuClick()
			End If

		End If

		Exit Function
		debug

	End If
	
	Edit1WndProc=CallWindowProc(OldEditProc,hWnd,dwMsg,wParam,lParam)
End Function

またクリエイトイベントで
コード:
'EditBoxのサブクラス化
	OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC)
	SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
としてみました。

よろしくお願いいたします。
投稿記事 Posted: 2015年8月04日(火) 00:50
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
サブクラスについてあまりよく理解してませんが、
上記のコードで問題ないと思います。
念のためですが上記のコードの直前に下記のようなコード記載されてますか?
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
これは元々のこのクラスのプロシージャのアドレスを取得する処理です。
ちなみに私はサブクラスについて下記のトピックを参考にしました。
ボタンの右クリック処理方法は?
問題なく動作します。
よろしくお願いいたします。
投稿記事 Posted: 2015年7月30日(木) 11:02
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
淡幻星 様

ご返信有難うございます!
たまにチェックさせて頂いております。

サブクラス化の設定なのですが、
コード:
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
こんなかんじで大丈夫でしょうか?
この辺りから間違っていたら大変なので、お先に質問させていただきます
投稿記事 Posted: 2015年7月19日(日) 03:45
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
(だいぶ間が空いてしまったので、見てないかもしれませんが)
引用:
こちらなのですが、実際試してもやはりビープ音がなってしまいます
んー、Ctrl+Aが押されたときに正しくExit Functionで
抜けて入れば、ビープ音はならない筈なので、、、
期待したとおりにExit Functionで抜けているか、あたりを
見てみてはいかがでしょうか?
投稿記事 Posted: 2015年7月12日(日) 15:49
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
返信遅くなってしまい申し訳ありません。
引用:
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう
引用:
Q:ビープ音を無くすには?
A:サブクラス化したプロシージャ関数の戻り値に「0」を返せばOK。

以下、自コードからの抜粋です。
コード:
コード:
   'Editboxのサブクラス化プロシージャ。
   Function MyEditWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM)  As DWord
       Dim buf[255] As Byte

      Select Case dwMsg
         Case WM_KEYDOWN
            GetKeyboardState( buf )
            MyEditWndProc = 0 'デフォルトを「0」(FALSE)に指定。
            If( buf[VK_CONTROL] AND &H80 )Then
               'Ctrlキー
               If( buf[ VK_SHIFT ] AND &H80 )Then
                  'Shiftキー併用
                  If( buf[ Asc("S") ] AND &H80 )Then
                     '別名保存
                     SaveAsEditDlgTab()
                     Exit Function '◆ビープ音無しで抜ける。
                  End If
' ~中略~
               End If
            End If

      End Select

      '独自処理以外は、元プロシージャの戻り値をそのまま返す。
      MyEditWndProc = CallWindowProc( vptOrgEdit, hWnd, dwMsg, wParam, lParam )
   End Function

こちらなのですが、実際試してもやはりビープ音がなってしまいます。
淡幻星 様の「両手たぶメモ」をDLし、利用した場合ですとビープ音はなりませんでした。

私が書いているコードは以下のようになります。
コード:
Function Edit1WndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	If dwMsg = WM_KEYDOWN Then
		If (GetAsyncKeyState(VK_CONTROL) And &H8000) Then
			Edit1WndProc = 0
			If wParam = 65 Then
				'Ctrl+Aが押されたら、全て選択する
				MainWnd_IDM_SELECTALL_MenuClick()

			End If

			Edit1WndProc = 0
			Exit Function
		End If
	End If

	Edit1WndProc=CallWindowProc(OldEditProc,hWnd,dwMsg,wParam,lParam)
End Function
投稿記事 Posted: 2015年5月24日(日) 04:24
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
上記の、7さんのコメントで解決してるかもしれませんが、
「独自のショートカットキーを登録」は当方のエディタ(※1)でも
やってる処理なので参考までにコメントします。

Q:ビープ音を無くすには?
A:サブクラス化したプロシージャ関数の戻り値に「0」を返せばOK。

以下、自コードからの抜粋です。
コード:
	'Editboxのサブクラス化プロシージャ。
	Function MyEditWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM)  As DWord
	    Dim buf[255] As Byte

		Select Case dwMsg
			Case WM_KEYDOWN
				GetKeyboardState( buf )
				MyEditWndProc = 0 'デフォルトを「0」(FALSE)に指定。
				If( buf[VK_CONTROL] AND &H80 )Then
					'Ctrlキー
					If( buf[ VK_SHIFT ] AND &H80 )Then
						'Shiftキー併用
						If( buf[ Asc("S") ] AND &H80 )Then
							'別名保存
							SaveAsEditDlgTab()
							Exit Function '◆ビープ音無しで抜ける。
						End If
' ~中略~
					End If
				End If

		End Select

		'独自処理以外は、元プロシージャの戻り値をそのまま返す。
		MyEditWndProc = CallWindowProc( vptOrgEdit, hWnd, dwMsg, wParam, lParam )
	End Function
※1:両手たぶメモ、ってソフトです(宣伝)。
投稿記事 Posted: 2015年4月25日(土) 22:06
  記事の件名:  Re: 複数行EditBoxでショートカットキーの登録  引用付きで返信する
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう
動作確認もしてないですしサブクラス内がどうなってるのかも分からないので当てずっぽうですが
投稿記事 Posted: 2015年4月14日(火) 18:22
  記事の件名:  複数行EditBoxでショートカットキーの登録  引用付きで返信する
お世話になっています。

エディタを作っているのですが、複数行EditBoxで独自のショートカットキーを登録しようとしています。
今やっている方法として、EditBoxをサブクラス化し、キーのメッセージを受け取って、それに応じて処理を行うといった形にしているのですが、
この方法をすると、最初から登録されているショートカットキー以外の物を入力すると、
ビープ音がなってしまいます。
これを無くしたいのですが、どのようにすればいいのでしょうか。

ご存じの方がいらっしゃいましたら、ご教授ください。

よろしくお願いいたします。
投稿記事 Posted: 2015年3月25日(水) 04:10

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean