- 締切済み
マウスでコントロールを移動させたくない
お世話になります。 客先の要望で、マウスで移動させたくないコントロールがありどのようにしたらよいか悩んでいます。 以下のような方法を考えていたのですが・・・ 1.移動元のコントロールを退避しておく 2.移動させたくないコントロールのMouseDownイベントで 元のコントロールにSetFocusする コンボボックスにMouseDownイベントが無く実現不可能となってしまいました。 何か良い方法はございませんでしょうか?
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- todo36
- ベストアンサー率58% (728/1234)
Private Sub Combo1_LostFocus() If (IsMouseDown()) Then Combo1.SetFocus End If End Sub Private Function IsMouseDown() As Boolean IsMouseDown = (GetKeyState(VK_LBUTTON) And &H80) Or (GetKeyState(VK_RBUTTON) And &H80) End Function
- 2ch
- ベストアンサー率51% (64/125)
コンボボックスのStyleプロパティによって、フックすべき場所が異なる。 Style=2なら、コンボボックスをフックするだけで、マウスイベントが拾えるが、2以外なら、コンボボックス内部にテキストボックスオブジェクトが創成される。 その内部オブジェクトのイベントも拾う必要がある。 下はマウスイベントの取得サンプル(for Style=2) これフォームモジュールにはる Option Explicit Private Sub Form_Load() Call setSubClass(Me.Combo1.hWnd) End Sub Private Sub Form_Unload(Cancel As Integer) Call freeSubClass(Me.hWnd) End Sub これ標準モジュールにはる Option Explicit Private Const GWL_WNDPROC = (-4) Public Const WM_LBUTTONDOWN = &H201 Public Const WM_LBUTTONUP = &H202 Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private pPlocWnd As Long Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case uMsg Case WM_LBUTTONDOWN Form1.List1.AddItem "マウスダウン:" & Now Case WM_LBUTTONUP Form1.List1.AddItem "マウスアップ:" & Now End Select PGMEND: WindowProc = CallWindowProc(pPlocWnd, hWnd, uMsg, wParam, lParam) End Function 'サブクラス化 Public Function setSubClass(inWnd As Long) As Long Call freeSubClass(inWnd) pPlocWnd = SetWindowLong(inWnd, GWL_WNDPROC, AddressOf WindowProc) End Function 'サブクラス化解除 Public Function freeSubClass(inWnd As Long) As Boolean If pPlocWnd <> 0 Then Call SetWindowLong(inWnd, GWL_WNDPROC, pPlocWnd) pPlocWnd = 0 End If freeSubClass = True End Function
- 2ch
- ベストアンサー率51% (64/125)
コンボボックスのスタイルは? VBのイベントに頼らずに、フックをしてやればよい
- happypoint
- ベストアンサー率36% (521/1422)
#2です。 >現行のCOBOLはオフコンで動いています。 >項目の移動をすべてハードタブまたは確定キーで移動しており、 >当然ながらマウスは使用していません。 これを忠実にシミュレートして、 マウスをハード的につながなければ良いのでは・・・。 そういう問題じゃないですね。 すいません。
- imogasi
- ベストアンサー率27% (4737/17069)
答えられそうもないですが、見た人が問題自身を理解できるのかとおもいまして。 >動きを少しでも忠実に再現して欲しいという要望 どういうケースでしょうか。 >マウスクリックでフォーカスを移したくないということです。 どういう弊害があるのでしょうか。 入力禁止と言うことではないでしょうね。 >EnableをFalseにすることも考えたのですが、それでは工数がかかりすぎるとのことで却下されてしまいました。 プログラム工数がそんなになぜ増えるのでしょうか。 >COBOL言語でのオペレーションをそのまま引き継げません(#3のご回答の一部) これで苦労されているのですか。 客先の現在のCOBOL言語でのオペレーションはどういう風のものですか。
補足
ありがとうございます。 >COBOLのオペレーション 現行のCOBOLはオフコンで動いています。 項目の移動をすべてハードタブまたは確定キーで移動しており、当然ながらマウスは使用していません。 マウスを使ってコントロール間の移動をさせたくないということです。 >弊害 確定時の入力チェックを強化すれば良いだけの話なので特にはあげられないのですが・・・・・。 >プログラム工数がそんなになぜ増えるのでしょうか。 実はこの動作をさせたいPGは350本あり、このオペレーション以外の部分では既に出来上がっています。納期もかなり近づいていますのでもう少し共通的に簡単にできないものかということでした。 このような補足でよろしいでしょうか?
- PAPA0427
- ベストアンサー率22% (559/2488)
なるほど、そうでしたか。 でも残念ながら、COBOLはノイマン型の逐次実行タイプの言語です。 引き換えVBは、イベントドブリンタイプになります。よってCOBOL言語でのオペレーションをそのまま引き継げません。というか言語仕様的にムリです。 ここは、お客様とのご相談になると思います。もしオペレーション的にCOBOL言語と同等に使用したいのであれば、前述した様にEnableを操作するしかないです。 コストを優先させるのであれば、操作系は変わらざるを得ません。つまり明細を入力して、登録ボタンを押したときに入力漏れや入力相関のチェックが動作して、完全にならないと登録できないようにするとかですね。 方法としたらこんなものです。言語仕様が違いすぎます。
お礼
PAPA0427さま アドバイスありがとうございます。 やはりそうですよね・・・・。 私もVB暦長いですがここまでこだわられるお客様も始めてなので正直戸惑っています。 もう少しがんばって上司、お客さまを説得してみます。
- happypoint
- ベストアンサー率36% (521/1422)
tomotomo0906さん、こんにちは。 ちょっとよくわからないのですが、 そのコントロールの種類は、コンボボックスですか? >マウスで移動させたくないコントロールがありどのようにしたらよいか 「マウスで移動させたくない」というのは、 マウスクリックでフォーカスを移したくないということなんでしょうか。 (つまり、タブキーでのフォーカスを移すのは許可するということ?) ・・・それとも、コントロールをユーザーが ドラッグ操作で移動できる仕様にしているのでしょうか。
補足
ありがとうございます。 言葉が足らず申し訳ありません マウスクリックでフォーカスを移したくないということです。 移動させたくないコントロールはテキストボックスとコンボボックスです。 よろしくお願いします。
- PAPA0427
- ベストアンサー率22% (559/2488)
う~~~ん。難しいですね。はじめからマウスを使うのが前提になっている言語仕様ですからね。 マウスでの移動をさせたくないという所を詳しく教えていただけないですか? 入力必須項目であれば、その項目が入力されないうちは全ての項目のEnableをFalseにしておくとか…。
補足
ありがとうございます。 今行っている作業がCOBOLプログラムをVB化という作業をしています。 動きを少しでも忠実に再現して欲しいという要望がでているのです。 ですのでマウスで移動させたくないということみたいです。 EnableをFalseにすることも考えたのですが、それでは工数がかかりすぎるとのことで却下されてしまいました。 マウス移動させたくない場所は 明細入力をする部分になります。 コンボボックスが1つテキストボックスが3つ並んで1行で、 それが10行分となります。 こんな情報でよろしいでしょうか?
お礼
いえいえ 私もそう思いました! 当然ながら却下されてしまいましたが・・・。