フォームをなめらかに移動する方法はないでしょうか?
以下のコードのように、Locationで位置を変更すると、カクカク移動してしまいます。
ご存知の方おしえてください。どうぞよろしくお願いいたします。

Private Sub Form1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
Dim WorkingArea As Rectangle = Screen.PrimaryScreen.WorkingArea
Dim MousePos As Point = Me.PointToClient(Windows.Forms.Cursor.Position)
'上に移動
If Me.Size.Height * 0.8 < MousePos.Y And Me.Location.Y > 0 Then
Me.Location = New Point(Me.Location.X, Me.Location.Y - 20)
End If
'下に移動
If Me.Size.Height * 0.2 > MousePos.Y And (Me.Location.Y + Me.Size.Height) < WorkingArea.Height Then
Me.Location = New Point(Me.Location.X, Me.Location.Y + 20)
End If
'左に移動
If Me.Size.Width * 0.8 < MousePos.X And Me.Location.X > 0 Then
Me.Location = New Point(Me.Location.X - 20, Me.Location.Y)
End If
'右に移動
If Me.Size.Width * 0.2 > MousePos.X And (Me.Location.X + Me.Size.Width) < WorkingArea.Width Then
Me.Location = New Point(Me.Location.X + 20, Me.Location.Y)
End If
End Sub

このQ&Aに関連する最新のQ&A

.」に関するQ&A: OS Windows7 H.32Bitとは?

A 回答 (2件)

こんにちは



用途はわかりませんが逃げるフォーム
面白いプログラムですね~

既に解決していらっしゃるかもしれませんが

20を1にしてみてはいかがでしょうか
1.8GHz 2GB でもスムーズに動きましたよ

この回答への補足

作りたいイメージのソフトを見つけました。
mag4pという拡大鏡フリーソフトです。
こちらはスムーズに動きました。
スペックの問題ではないようです。

APIをつかうか、フォームをペイントで描いてみます。

補足日時:2011/05/27 18:00
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
20を1にすると、移動速度が遅いんです。。。

お礼日時:2011/04/21 10:29

>> 1.8GHz 2GB でもスムーズに動きましたよ


> 20を1にすると、移動速度が遅いんです。。。
スムーズには動いたのですか?
スペックの悪いPCでどうにかしようという話なのか、
1回の移動距離を20にしたい話なのかが分かりません
でした。

ただ、後者でも、1回のトリガーで1から20までの座標に
順番に移動させればいいだけに思えますけどね。
プログラム関係なく、小学生がなぞなぞ解くレベルの
発想にも思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
初めは移動距離を+1にしていたのですが、
ゆっくりいどうするので+20にしました。
そうするとカクカクしながら移動していくので、
なめらかに移動できないものか考えています。

お礼日時:2011/04/22 13:58

このQ&Aに関連する人気のQ&A

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

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

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

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

Qvb.netで画面のコントロールId名を変数で動的に制御し処理する方法

以下のような処理がしたいです。
実現方法をご存知でしたらご教授下さい。

画面のコントロールText1~Text3があります。
For~Nextでこのコントロールに値をセットしたいです。

For i = 1 To 3
  Texti.Text = i
  ※このiのTextの後ろのiの部分を1~3と動的に変更し、各Textに値を設定したいです。
Next

Aベストアンサー

こんにちは、webでは、findcontrolを使うみたいです。

いかに、参考URLから、引用すると
***********************************
Dim L, U, i As Integer
Dim tx As System.Web.UI.WebControls.TextBox
L = LBound(dat)
U = UBound(dat)
For i = L To U
'コントロール名を探し出す
tx = FindControl("TextBox" & CStr(i))
'見つかったコントロールのTextプロパティに代入
tx.Text = dat(i)
Next

******************引用終わり*******
このようにすると良いみたいです。
asp findcontrolで、検索すると、
結構ヒットするみたいです。

参考URL:http://natchan-develop.seesaa.net/

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QDATE型変数を初期化する方法

他の変数みたいに
ゼロや""では初期化は出来ないのでしょうか?

Aベストアンサー

初期化とはプログラムループに入る前にある値にプログラムコーディングで設定することですよね。
下記によると、「出来る」といえるのではないですか。
それとも例えば、INISIALIZE関数やメソッドがあるか
と言う質問ですか。
VB(VBAですか。そこをはっきり書かないと。)で
下記サンプルプログラムをやって見ました。
Private Sub Form_Click()
Dim d As Date
d = "0"
Form1.Print "ここを通りました"
Form1.Print d
Form1.Print Format(d, "yy/mm/dd")
MsgBox Year(d)
MsgBox Month(d)
MsgBox Day(d)
End Sub
Form1には00:00:00、89/12/30が表示され、MSGBOXでは1899、12,30(31で無い)と表示されました。
こう言うことはエクセルの日付に似ており、シリアル値
のスタート日を表示しているところから、その値でセットされているはず。したがってd+1とか整数的演算が可能と
言うことであり、表示する時だけyyyy/mm/ddほか書式に
したがってVBが表示してくれると思う。
ただこの利用法は思いつかないが。
""に付いてはやっていませんが。

初期化とはプログラムループに入る前にある値にプログラムコーディングで設定することですよね。
下記によると、「出来る」といえるのではないですか。
それとも例えば、INISIALIZE関数やメソッドがあるか
と言う質問ですか。
VB(VBAですか。そこをはっきり書かないと。)で
下記サンプルプログラムをやって見ました。
Private Sub Form_Click()
Dim d As Date
d = "0"
Form1.Print "ここを通りました"
Form1.Print d
Form1.Print Format(d, "yy/mm/dd")
MsgBox Year(d)
MsgBox Month(d)
MsgBox Da...続きを読む

Qラベル内の文字(Caption)を縦表示にする方法

フォームに作成したラベルの文字(Caption)
を縦に表示したいのですが、
お分かりの方がいらしたら、書き込み願います。

あと考えた方法として、
ラベルに一文字ずつ記入して縦に並べる、
と言う方法も考えたのですが、
これですとレイアウト編集で手間がかかるので、
一文字ずつ作成したラベルを結合して、
(イメージとして、Excelの図形結合みたいな感じ?)
一つのラベルにする、と言う方法は無いでしょうか?

Aベストアンサー

ラベルの形を縦長にすると、自動的に縦書きになりますが、
それじゃだめですか・・・?

QVB.NETのListBoxで指定した項目のValueを取得する方法

ListBoxで現在選択している項目のValueを取得する方法はわかるのですが、X個目のValueの値を参照、設定する方法がわかりません。教えてくださいー

Aベストアンサー

>選択した店舗の店舗番号を取得したいんです。
MSDN のListBox のサンプルをComboBox にして今回の質問に合わせて修正したものを以下に挙げておきます。
コマンドプロンプトで
vbc sample.vb
sample
でそのまま実行して試してみることができます。
要点は、DataSource でArrayListをつないでおくということです。
DataSource を使うとSelectedValue で取り出せるので便利ですね。

でもまあ、
こんなふうにしなくても、別にArrayListで保持しているのがわかっていれば、index で対応付けをして取り出したり設定したりできます。
'---------------------------------------------------------------
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Collections

Public Class Store

Private aStoreName As String
Private aStoreNo As Integer

Public Sub New(ByVal name As String, ByVal no As Integer)
MyBase.New()
Me.aStoreName = name
Me.aStoreNo = no
End Sub

Public ReadOnly Property StoreName() As String
Get
Return aStoreName
End Get
End Property

Public ReadOnly Property StoreNo() As Integer
Get
Return aStoreNo
End Get
End Property

Public Overrides Function ToString() As String
Return Me.aStoreName & " - " & Me.aStoreNo
End Function
End Class


Public Class ComboBoxSample
Inherits Form
Friend WithEvents cmbStoreList As ComboBox = New ComboBox()
Dim textBox1 As TextBox = New TextBox()

<System.STAThreadAttribute()> _
Public Shared Sub Main()
System.Windows.Forms.Application.Run(New ComboBoxSample())
End Sub

Public Sub New()
Me.AutoScaleBaseSize = New Size(5, 13)
Me.ClientSize = New Size(292, 181)
Me.Text = "ComboBox Sample"

cmbStoreList.Location = New Point(24, 16)
cmbStoreList.Name = "cmbStoreList"
cmbStoreList.Size = New Size(232, 130)


textBox1.Location = New Point(24, 160)
textBox1.Name = "textBox1"
textBox1.Size = New Size(40, 24)
Me.Controls.AddRange(New Control() {cmbStoreList, textBox1})

Dim Stores As New ArrayList()
Stores.Add(New Store("A店", 15))
Stores.Add(New Store("B店", 20))
Stores.Add(New Store("C店", 45))
Stores.Add(New Store("BLUE店", 99))

cmbStoreList.DataSource = Stores
cmbStoreList.DisplayMember = "StoreName"
cmbStoreList.ValueMember = "StoreNo"

End Sub

Private Sub InitializeComponent()

End Sub

Private Sub cmbStoreList_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbStoreList.SelectedValueChanged
If cmbStoreList.SelectedIndex <> -1 Then
textBox1.Text = cmbStoreList.SelectedValue.ToString()
End If
End Sub
End Class

>選択した店舗の店舗番号を取得したいんです。
MSDN のListBox のサンプルをComboBox にして今回の質問に合わせて修正したものを以下に挙げておきます。
コマンドプロンプトで
vbc sample.vb
sample
でそのまま実行して試してみることができます。
要点は、DataSource でArrayListをつないでおくということです。
DataSource を使うとSelectedValue で取り出せるので便利ですね。

でもまあ、
こんなふうにしなくても、別にArrayListで保持しているのがわかっていれば、index で対応付けをして取り出し...続きを読む

Qコントロールの絶対位置を取得したい

フォーム内の複数のコンテナ上にあるコントロールの絶対位置(フォーム左端からの位置)を簡単な方法で取得できないでしょうか(VB.NET)。
すべての親コンテナの相対位置を積算すればわかると思うのですが、もっと簡単な方法で取得できないでしょうか。

Aベストアンサー

★API レベルで計算すれば出来るとアドバイスしたのです。
・プロパティとかで
 親のメイン・ウインドウのハンドルをα、
 子のコントロール・ウインドウのハンドルをβとします。
 そしたら Win32 API の GetWindowRect() 関数を直接呼び出します。
 RECT rc1 ←αの位置変数
 RECT rc2 ←βの位置変数
 
 GetWindowRect( α, rc1 )
 GetWindowRect( β, rc2 )
 
 絶対位置(x)…(rc2.left - rc1.left)
 絶対位置(y)…(rc2.top - rc1.top)
 で計算できます。
・RECT 構造体は長方形領域を格納するものです。下の『参考URL』をどうぞ。
 これでフォームからの絶対位置が求められます。
 なお、私は C/C++ 言語が主要言語ですので、上記の構造体の変数定義はあれで
 あっていますか?注意して手直しなどを行って下さい。
・以上。API 関数を使えば簡単に計算できますよ。

参考URL:http://www.activebasic.com/help_center/Pages/API/GDI/Type/type_RECT.htm

★API レベルで計算すれば出来るとアドバイスしたのです。
・プロパティとかで
 親のメイン・ウインドウのハンドルをα、
 子のコントロール・ウインドウのハンドルをβとします。
 そしたら Win32 API の GetWindowRect() 関数を直接呼び出します。
 RECT rc1 ←αの位置変数
 RECT rc2 ←βの位置変数
 
 GetWindowRect( α, rc1 )
 GetWindowRect( β, rc2 )
 
 絶対位置(x)…(rc2.left - rc1.left)
 絶対位置(y)…(rc2.top - rc1.top)
 で計算できます。
・RECT 構造体は長方形領域を格納す...続きを読む

QVB2005 DataGridView上でクリックを無効にする方法はありますか?

いつもお世話になっています。
VB2005で開発中です。
DataGridViewの編集可能(readonly=false)のセルに対して、クリックを無効とする方法がありますでしょうか?
そのセルに対して、ダブルクリックした時のみ、処理を行いたいのです。
よろしくお願いいたします。

Aベストアンサー

実際にやってみたことはないのですが、
・ダブルクリックのイベントをハンドルして、そのイベント ハンドラに処理を記述する。
・クリック イベントなど無効にしたいイベントは、そのイベント ハンドラに DataGridView の選択を解除するコードを記述する。
とすれば良いのではないでしょうか。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

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))
' コントロールの背景色を透過...続きを読む

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。


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

人気Q&Aランキング