ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月23日(木) 10:31

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2015年3月25日(水) 04:10 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
お世話になっています。

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

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

よろしくお願いいたします。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2015年4月14日(火) 18:22 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
住所: 新潟県
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう
動作確認もしてないですしサブクラス内がどうなってるのかも分からないので当てずっぽうですが


通報する
ページトップ
投稿記事Posted: 2015年4月25日(土) 22:06 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
上記の、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年5月24日(日) 04:24 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
返信遅くなってしまい申し訳ありません。
引用:
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず 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

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2015年7月12日(日) 15:49 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
(だいぶ間が空いてしまったので、見てないかもしれませんが)
引用:
こちらなのですが、実際試してもやはりビープ音がなってしまいます
んー、Ctrl+Aが押されたときに正しくExit Functionで
抜けて入れば、ビープ音はならない筈なので、、、
期待したとおりにExit Functionで抜けているか、あたりを
見てみてはいかがでしょうか?


通報する
ページトップ
投稿記事Posted: 2015年7月19日(日) 03:45 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
淡幻星 様

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

サブクラス化の設定なのですが、
コード:
SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
こんなかんじで大丈夫でしょうか?
この辺りから間違っていたら大変なので、お先に質問させていただきます

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2015年7月30日(木) 11:02 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
サブクラスについてあまりよく理解してませんが、
上記のコードで問題ないと思います。
念のためですが上記のコードの直前に下記のようなコード記載されてますか?
OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)
これは元々のこのクラスのプロシージャのアドレスを取得する処理です。
ちなみに私はサブクラスについて下記のトピックを参考にしました。
ボタンの右クリック処理方法は?
問題なく動作します。
よろしくお願いいたします。


通報する
ページトップ
投稿記事Posted: 2015年8月04日(火) 00:50 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
たかせ様

ご返信有難うございます。
コード:
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)
としてみました。

よろしくお願いいたします。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2015年8月17日(月) 00:23 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
大変間が空いてしまってすみません。
(なかなか来れませんでした・・・)

で、先の私の投稿、間違いがありました。大変申し訳ないです。
ビープ音を消すには、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年9月05日(土) 02:57 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
淡幻星 様

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

……のですが……

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

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

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

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

よろしければご教授ください。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2015年9月05日(土) 19:35 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
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年11月11日(水) 01:53 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
淡幻星 様

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

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

戻るの方は……まだ謎です。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[3人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke