学校の課題の為VB6.0でマウスを使用したプログラムを作成しているのですが、
MouseDownイベントとMouseMoveイベントで解らないことがあるので、
知っているかた、お願いします。

マウスの右ボタンと左ボタンの区別をつけるにはどうしたらいいのでしょうか?
例えば「左の時は描画し、右の時は描画しない」と言う感じで…

わからなくて困っています。ぜひ、お願いします。

A 回答 (2件)

マウスイベントの引数Buttonにボタンの種類の情報が入っています。


これで良かったと思います。

Select Case Button
Case vbLeftButton
'左ボタン処理
Case vbRightButton
'右ボタン処理
Case vbMiddleButton
'中ボタン処理
End Select
    • good
    • 0
この回答へのお礼

大変、参考になりました。月曜日の提出に間に合いそうです。
どうも、ありがとうございました。

お礼日時:2001/02/18 00:04

補足を。


MouseDown の際は qwerty 様の回答どおりなのですが、 MouseMove の際には複数のボタンが押されている場合がありますので、それを考慮する必要があるなら、考慮しましょう。
たとえば、
If Button and vbLeftButton Then
で、左ボタンが押されている状態
If Button and vbRightButton Then
で、右ボタンが押されている状態
で、
If Button and (vbLeftButton or vbRightButton) Then
で、左右のボタンが押されている状態
になります。

参考URL:http://www.asia.microsoft.com/japan/developer/li …
    • good
    • 0
この回答へのお礼

回答ありがとうございました。参考にさせて頂きます。

お礼日時:2001/02/18 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qボタンをマウスで押し続けたときのイベント

VB2005,Frameworks2を使用しています。

フォームに設置したButtonは、通常マウスをクリックする度にイベントが発生しますが、これをボタンをマウスで押している間だけイベントを発生されたいのですがその様なイベントやボタンの設定が見つかりません。

やはりタイマー等を使わないと再現できないのでしょうか?
よろしくお願いします。

Aベストアンサー

繰り返し処理ならMouseDownでタイマースタート、MouseUpでタイマー停止、がシンプルだと思われます。
ボタンを押している間だけ何らかの処理が進行するようなものなら、マルチスレッドですかね。MouseDownでスレッドスタート、MouseUpでスレッドを停止させるようなフラグをONにするか、スレッド強制終了させるか。。。
どちらにしても、イベントのプロシージャからは即座に脱出しないとパフォーマンスに影響します。

QExcel VBAでマウスの左クリックのイベントを検知するには

お世話になります。

ExcelのVBAを利用して、マウスが左クリックされた際、そのイベントを
検知する方法はありますでしょうか?

使用しているExcelは2003です。

よろしくお願いします。

Aベストアンサー

■ マウスやキーボードのイベントを取得する
http://home.att.ne.jp/zeta/gen/excel/c04p07.htm

こちらが参考になりそうです。

Qコマンドボタンやイメージにマウスをのせるとボタン名を表示したい

Excel97,Windows98SEを使用しています。

エクセルのシートに、コントロールツールボックスで作成したコマンドボタンやイメージを配置して、クリックするとマクロを実行させるようにしています。

そのボタンやイメージに、ツールバーのボタンの上にマウスをのせるとボタンの説明が出てくるのと同じような機能を付けたいのですが、可能でしょうか?

ボタンの下のセルにコメントを入れてみたのですが上手くいきませんでした…。

ご存知の方、どうぞよろしくお願いいたします。

Aベストアンサー

#3さんのおっしゃるように、MouseMoveイベントを使う方法があります。

ボタンの上にテキストボックスを置きます。
ボタンのMouseMoveイベントでテキストボックスのVisibleプロパティ を True にします。
ボタンの下に、ボタンより一回り大きなイメージコントロールなどを置いて、そのコントロールのMouseMoveイベントで、テキストボックスの Visible を Falseにします。
イメージコントロールのBachStyleプロパティとBorderStyleで、イメージコントロールを透明にできます。

Qform上のMouseMoveを受け取りたい

教えて頂けますか?
現在pictureBox上でのMouseMoveのイベントを受け取っていますが、
pictureBoxの子のコントロールの上にマウスが来ると、MouseMoveエベントが途絶えてしまいます。途絶えなくする方法はありますか?
もしくはform上のMouseMoveをどんなコントロールの上からでも受ける方法はありますか?マウスの座標が欲しいだけです。
スミマセン。よろしくお願いします。

Aベストアンサー

コントロールのCaptureプロパティで制御でそうですよ

FormのLoadイベントなど適切なイベントで
PictureBox1.Capture = True
などを実行してみましょう

# VB2005ならコントロールのコンテナにはPanelを使ったほうが
# いいように思いますよ ...
# 開発・実行環境などの情報も投稿しましょう

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QExcelVBAのコントロールの種類の取得方法

ExcelVBAのフォームについての質問です。
コントロールの種類(TextBox,ComboBox等)を取得するプログラムがあれば教えて下さい。
何をしたいかと言うと、Enabledを切り替えるサブルーチンを作りたいのですが、
TextBox等のwindow型のコントロールの場合は、BackColorも変えたいので、条件分岐させたいのです。
ちなみに今は、コントロール名にtxtやcmb等をつけて判断させています。
何か良い方法があれば教えて下さい。

Aベストアンサー

TypeName関数を使ってみてください。

'-------------------------------------- 
Private Sub CommandButton1_Click()
  Dim myCtrl As Control
  For Each myCtrl In Me.Controls
    Select Case TypeName(myCtrl)
     Case "TextBox"
       myCtrl.BackColor = RGB(255, 0, 0)
     Case "Label"

     Case "ListBox"
       myCtrl.BackColor = RGB(0, 255, 0)
     Case "CheckBox"

     Case "ComboBox"

     Case "CommandButton"

    End Select
  Next myCtrl
End Sub
'------------------------------------------
 
勘違いでしたらご容赦願います。
以上ここまで。
 

TypeName関数を使ってみてください。

'-------------------------------------- 
Private Sub CommandButton1_Click()
  Dim myCtrl As Control
  For Each myCtrl In Me.Controls
    Select Case TypeName(myCtrl)
     Case "TextBox"
       myCtrl.BackColor = RGB(255, 0, 0)
     Case "Label"

     Case "ListBox"
       myCtrl.BackColor = RGB(0, 255, 0)
     Case "CheckBox"

     Case "ComboBox"

     Case "CommandBu...続きを読む

Qvb.net 画像の透過について

背面画像Aと前面画像Bがあります。
画像Bは画像A上をファイルから読み込んだ
X,YのLocationを任意に移動します。

Bの画像の白色の部分を透過にして、背面の画像Bが見えるように
表示したいのですが、うまくいきません。

PictureBoxコントロールのimageプロパティに
画像Bを設定して、backColorにTransparentを指定しても
親コントロール(画像Bを表示しているPictureBox)の
BackColorで表示されるだけでした。

vb6だとimageコントロールを使用すればできました。

vb.netで何か良い方法はないでしょうか?

Aベストアンサー

PictureBoxで透過処理を行うのであれば BackColorプロパティを Color.TransParentに変更します
次に 設定する画像を Bitmapオブジェクトで構築して
MakeTransparentメソッドで 何色を透明にしたいか設定します

次に 透過画像の背景になるコントロールの ControlsコレクションにAddします
PictureBoxの Locationを適切な位置に変更すれば 希望の動作になるかと …

' 透過画像を用意
Dim bmp as new Bitmap("透過画像のパス")
' 透過色を設定
bmp.MakeTransparent(bmp.GetPixel(0,0))
' コントロールの背景色を透過に設定
PictureBox2.BackColor = TransParent
' 透過画像を設定
PictureBox2.Image = bmp
' ここまでが初期設定


' 背景になるPictureBoxに 前景のコントロールを追加
if PictureBox1.Controls.Contains(PictureBox2) = false then
  PictureBox1.Controls.add(PictureBox2)
End if
' 前景の描画位置を設定
PictureBox2.Location = new Point( PictureBox1.Width / 2, PictureBox1.Height / 2)

といった具合です

PictureBoxで透過処理を行うのであれば BackColorプロパティを Color.TransParentに変更します
次に 設定する画像を Bitmapオブジェクトで構築して
MakeTransparentメソッドで 何色を透明にしたいか設定します

次に 透過画像の背景になるコントロールの ControlsコレクションにAddします
PictureBoxの Locationを適切な位置に変更すれば 希望の動作になるかと …

' 透過画像を用意
Dim bmp as new Bitmap("透過画像のパス")
' 透過色を設定
bmp.MakeTransparent(bmp.GetPixel(0,0))
' コントロールの背景色を透過...続きを読む

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

Qコマンドボタンの長押し

コマンドボタンのクリック処理についてです。

コマンドボタンのクリックは取得できると思うのですが、
長押しを行った場合、それを認識することなんてできるのでしょうか?

コマンドボタンによる数値入力を行いたく、
長押しができれば、任意の数値が入力できると思いまして。

すいませんが、どなたかお願いいたします。

Aベストアンサー

sienna>多分、MouseDown・MouseUpの事だと思います。

すみません、そのとおりです。

関数ローカルではなく、フォームローカルなBoolean変数を用意しておいて、MouseDownイベントでその変数にTrueを、MouseUpイベントでその変数にFalseをセットします。

もしくは、タイマーコントロールのEnableを、MouseDown時にTrueに、MouseUp時にFalseに設定するのもいいでしょう。
Timerイベントに

Text1.Text = Text1.Text + 1

とか書いておいて、インターバルを500とかにすれば、0.5秒ごとに数値がアップするカウンタの出来上がりです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング