ab.com コミュニティ https://www.activebasic.com/forum/ |
|
複数行EditBoxでショートカットキーの登録 https://www.activebasic.com/forum/viewtopic.php?t=4572 |
ページ 1 / 1 |
作成者: | 水波形 [ 2015年3月25日(水) 04:10 ] |
記事の件名: | 複数行EditBoxでショートカットキーの登録 |
お世話になっています。 エディタを作っているのですが、複数行EditBoxで独自のショートカットキーを登録しようとしています。 今やっている方法として、EditBoxをサブクラス化し、キーのメッセージを受け取って、それに応じて処理を行うといった形にしているのですが、 この方法をすると、最初から登録されているショートカットキー以外の物を入力すると、 ビープ音がなってしまいます。 これを無くしたいのですが、どのようにすればいいのでしょうか。 ご存じの方がいらっしゃいましたら、ご教授ください。 よろしくお願いいたします。 |
作成者: | 7 [ 2015年4月14日(火) 18:22 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
サブクラス内でキーを判別して独自の処理をした後に、デフォルトのコールバックに戻らず return 0 してみてはどうでしょう 動作確認もしてないですしサブクラス内がどうなってるのかも分からないので当てずっぽうですが |
作成者: | 淡幻星 [ 2015年4月25日(土) 22:06 ] |
記事の件名: | 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:両手たぶメモ、ってソフトです(宣伝)。 |
作成者: | 水波形 [ 2015年5月24日(日) 04:24 ] |
記事の件名: | 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 |
作成者: | 淡幻星 [ 2015年7月12日(日) 15:49 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
(だいぶ間が空いてしまったので、見てないかもしれませんが) 引用: こちらなのですが、実際試してもやはりビープ音がなってしまいます
んー、Ctrl+Aが押されたときに正しくExit Functionで抜けて入れば、ビープ音はならない筈なので、、、 期待したとおりにExit Functionで抜けているか、あたりを 見てみてはいかがでしょうか? |
作成者: | 水波形 [ 2015年7月19日(日) 03:45 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
淡幻星 様 ご返信有難うございます! たまにチェックさせて頂いております。 サブクラス化の設定なのですが、 コード: SetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long)こんなかんじで大丈夫でしょうか? この辺りから間違っていたら大変なので、お先に質問させていただきます |
作成者: | たかせ [ 2015年7月30日(木) 11:02 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
サブクラスについてあまりよく理解してませんが、 上記のコードで問題ないと思います。 念のためですが上記のコードの直前に下記のようなコード記載されてますか? OldEditProc = GetWindowLong(GetDlgItem(hMainWnd,EditBox1),GWL_WNDPROC,AddressOf(Edit1WndProc) As Long) これは元々のこのクラスのプロシージャのアドレスを取得する処理です。 ちなみに私はサブクラスについて下記のトピックを参考にしました。 ボタンの右クリック処理方法は? 問題なく動作します。 よろしくお願いいたします。 |
作成者: | 水波形 [ 2015年8月04日(火) 00:50 ] |
記事の件名: | 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)としてみました。 よろしくお願いいたします。 |
作成者: | 淡幻星 [ 2015年8月17日(月) 00:23 ] |
記事の件名: | 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 |
作成者: | 水波形 [ 2015年9月05日(土) 02:57 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
淡幻星 様 ご回答有り難うございます。 引用: 大変間が空いてしまってすみません。
お忙しい中対応していただきありがとうございます><(なかなか来れませんでした・・・) 感謝感激でございます! 引用: ビープ音を消すには、WM_DOWNでExit Functionするだけでは不十分でした。
こちらを実行したところ、ビープ音が消えました!ありがとうございます!!WM_CHARを捉まえて、これに対してもExit Functionしてあげてください。 これで、求めていたものはできました!! ……のですが…… Ctrl+Z、つまり、「戻す」機能が思ったように実行できません。 適当に文字を書き、Ctrl+Zを押すと、 普通なら文字が消える(または、以前の文字に置き換わる)はずなのですが、 一番最初の文字に戻ってしまうだけになります。 少しわかりにくいので、以下に詳細の図をば…… この現象は……何故なのでしょうか? なお、「戻る」は コード: SendMessage(hEdit,WM_UNDO,0,0)※hEdit = GetDlgItem(hMainWnd, EditBox1) を利用しています。 よろしければご教授ください。 |
作成者: | 淡幻星 [ 2015年9月05日(土) 19:35 ] |
記事の件名: | 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で設定したフォントの縦幅になります。 以上です。 |
作成者: | 水波形 [ 2015年11月11日(水) 01:53 ] |
記事の件名: | Re: 複数行EditBoxでショートカットキーの登録 |
淡幻星 様 ご返信遅れてしまい申し訳ありません! 最近研究に追われていて、ろくにプログラミングをしていない…… まず、行番号の件、解決しました! >K2さんのコードの場合は、hFont_MainWndを設定しているので 完全にこれでした…指定し直すとできました! 戻るの方は……まだ謎です。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |