現在C#にてアプリを作っています。
そこで、フォーム上にあるボタンを押している間は
ある画像のスクロールさせる処理を行いたいのですが、
どういったイベント等の方法で行えばよいか教えてください。

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

A 回答 (2件)

Clickのイベントではなく、MouseDownとMouseUpの


イベントを利用すると良いと思います。

スクロールの処理については、別スレッドでやると
良いでしょう。

この説明だけでは分かり難いと思いますので、
サンプルプログラムを作ってみました。

C#のコードは、ほとんど書いた事が無いので、
あやしいところもあるかもしれませんが、
一応、参考までに・・・。
(サンプルは、参考URLからダウンロード出来ます。)

参考URL:http://psv.servehttp.com/programming_folder/win/ …
    • good
    • 0
この回答へのお礼

回答していただいてありがとうございます。しかもサンプルまでいただいて大変嬉しいです。サンプルを参考に作ってみたいと思います。またよろしくお願いいたします。

お礼日時:2005/04/02 22:34

こんにちは、じゃんぬねっと です。



MouseDown ~ MouseUp までスクロール処理を実装するだけでしょう。
    • good
    • 0

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

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

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

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

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

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

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

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

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

Aベストアンサー

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

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC#で角が丸いテキストボックス

C#で角が丸いテキストボックス

C#で角が丸いテキストボックスを作成したいと考えています。
グループ化されたラベルやテキストボックスを解り易くしたい為です。

どなたかアドバイスよろしくお願いします。

Aベストアンサー

 こんばんは。
 ん? リージョンの事ですかねえ。
 http://dobon.net/vb/dotnet/form/formregion.html

 RoundRectangleのリージョンは存在しないので、チョッと面倒みたいです。
 http://www.geekpedia.com/code112_Draw-Rounded-Corner-Rectangles-Using-Csharp.html

 上記のソースを御拝借して書くと、こんな感じです。かなり雑ですが、参考程度に。
 後はTextBoxのBorderStyleをNoneにしておいて、TextBox用のペイントハンドラで、RoundRectangleの枠を描いて見てください。

private void SetRoundRect(Control ctl, float radius)
{
int width = ctl.Width;
int height = ctl.Height;

System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();

gp.AddLine(radius, 0, width - (radius * 2), 0); // Line
gp.AddArc(width - (radius * 2), 0, radius * 2, radius * 2, 270, 90); // Corner
gp.AddLine(width, radius, width, height - (radius * 2)); // Line
gp.AddArc(width - (radius * 2), height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner
gp.AddLine(width - (radius * 2), height, radius, height); // Line
gp.AddArc(0, height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner
gp.AddLine(0, height - (radius * 2), 0, radius); // Line
gp.AddArc(0, 0, radius * 2, radius * 2, 180, 90); // Corner
gp.CloseFigure();
ctl.Region = new Region(gp);
}

private void Form1_Load(object sender, EventArgs e)
{
SetRoundRect(this.textBox1, 20.0F);
}

 こんばんは。
 ん? リージョンの事ですかねえ。
 http://dobon.net/vb/dotnet/form/formregion.html

 RoundRectangleのリージョンは存在しないので、チョッと面倒みたいです。
 http://www.geekpedia.com/code112_Draw-Rounded-Corner-Rectangles-Using-Csharp.html

 上記のソースを御拝借して書くと、こんな感じです。かなり雑ですが、参考程度に。
 後はTextBoxのBorderStyleをNoneにしておいて、TextBox用のペイントハンドラで、RoundRectangleの枠を描いて見てください。

private void S...続きを読む

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

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. ところが、アプリ...続きを読む

Q白い部分を透明にすることは可能ですか?

ペイントで白い部分を透明にすることは可能ですか?
やり方を教えてください。
ペイントじゃできないのかも教えてください。

Aベストアンサー

 残念ながらペイントでは、まわりが、白いままです。
 
 お使いのパソコンのOSが、一致するようでしたら
 
 無料のソフト「GIMP」(ギンプ)を使用することをおすすめします。

 ・Gimp2のダウンロードページ
 http://www.geocities.jp/gimproject2/download/gimp-download.html


 ・GIMP(ギンプ)の使い方
透過(透明な部分を作る技法)
 保存は、gifかpngの拡張子にして下さい

  http://www.geocities.jp/gimpmanual/manual.html

 ※jpgは、写真を構成するのが、目的な拡張子ですので
   まわりが、白くなり透明には、なりません。

Qc#でコマンドプロンプトを実行する方法

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
 ※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。

現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。

ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。


---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutput.htmlのコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();

//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)


//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";


//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();

//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコー...続きを読む

Aベストアンサー

>うまくいきません。

「なにが」「どう」「いまくいかない」んでしょうか?

プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?

参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)

cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Q押しっぱなしの処理

今Windows APIでゲームを作っています。
例えばキャラクターがマスを移動するときに左ボタンを押すと左に動き
押し続けると一定時間あいたあとにある速さで連続して左に動きます。
case WM_KEYDOWN:
if(wParam == VK_LEFT){
Move(LEFT);
}
現状のプログラムはこんな感じです。

それを押し続けて時間があいてからではなくすぐに左に動くようにしたいです。
それとその後の左に行き続ける速さもできれば調節したいです。
そうするにはどうすればよいのでしょうか?

Aベストアンサー

>左ボタンを押すと左に動き
>押し続けると一定時間あいたあとにある速さで連続して左に動きます。

WM_KEYDOWNメッセージで処理している…ということは、「キーリピート」に反応しているのでしょう。
# マウスのボタンでもキーリピート効くんですねぇ……試したこと無かったですが。

>それを押し続けて時間があいてからではなくすぐに左に動くようにしたいです。

メッセージで処理している場合は…無理じゃないでしょうかね?
スレッド作って、GetKeyState()で自分で状態を見る。ということになるかと。

>それとその後の左に行き続ける速さもできれば調節したいです。

スレッド内でのGetKeyState()のコール頻度などで制御…でしょうかね。
あとは…DirectInput使うとか。
…使ったことないんですけど。
「DirectInput マウス ボタン」辺りで検索すればみつかるんじゃないでしょうか。

Qテキストボックスからフォーカス外す

 editBox = CreateWindow(
  "EDIT",
  "あああ",
  SS_CENTER | WS_CHILD | WS_VISIBLE,
  0,0,100,20,
  hWnd,
  NULL,
  hInstance,
  NULL);


テキストボックスのフォーカスを外すにはどうしたら
いいんですか?
ESCキーでフォーカスを外そうと思ったら、
テキストボックスにフォーカスがあるせいで
case WM_KEYDOWN が動作しません。
フォーカスを外すというソース自体も分かっていません。


 case WM_KEYDOWN:
  if( wParam == VK_ESCAPE )
   ?
 break;

Aベストアンサー

WM_KILLFOCUS というメッセージがあります。これをエディットボックスのウィンドウに
送ってあげれば、フォーカスが外れると思います。

# WIN32 API なんて、久しぶりなので、ちょっと自信無し


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

人気Q&Aランキング

おすすめ情報