初めまして。
以前はBorland C++ Builder 5、VC6(中途半端)及びVB6を使用していましたが
今回、C#を使用することになりました。
C#の勉強をすべく思いつくままにアプリを作成しています。
しかし、新しいヘルプにまだなれていないのとC#のクラス、.NET SDKのAPI(?)
をまだ解っていない及び知らないため四苦八苦しています。
現在は下記の点で悩んでいます。
開発環境:
Microsoft Visual Studio .NET 2002
Windows 2000 SP2
プロジェクトの新規作成にてC#プロジェクトのWindowsアプリケーションを選択。
Formは最初に作成されたFormが1つだけです。
目的:
Formの位置をランダムに移動したい。
ただし位置はデスクトップに表示できる範囲内としたい。
不明点:
1.デスクトップの範囲を取得する方法。
VC6ではGetDesktopWindowでハンドルを取得しGetWindowRectで範囲を
取得できます。
C#でも同様に可能と思いますが、C#及び.NET FrameWork SDKにある
クラスor関数で行いたいのです。
2.rand()に変わる関数が解りません。
上記と同様にC#及び.NET FrameWork SDKにあるクラスor関数で
行いたいと思っています。
よろしくお願いします。
public class MainForm : System.Windows.Forms.Form
{
private System.ComponentModel.IContainer components;
public MainForm()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加し
てください。
//
WindowPosRand();
}
----- 自動生成された関数、コメントのため中略 -----
private void WindowPosRand()
{
Rectangle DeskTopRect;
int iLeft, iTop;
DeskTopRect = new Rectangle( 0, 0, 1, 1 ); //これでいいのか?後で調査
//------ 1.デスクトップ範囲を取得したい
//とりあえず固定値
DeskTopRect.X = 0;
DeskTopRect.Y = 0;
DeskTopRect.Height = 500;
DeskTopRect.Width = 500;
//位置設定
//*現状ではiLeftとiTopを一度に求めているので時間かかりそう
while( true ){
//----- 2.ランダム値で移動先を生成したい
//とりあえず固定値
iLeft = 0;
iTop = 0;
//範囲外ならもう一度求める
if( DeskTopRect.Contains( iLeft, iTop ) == false ||
DeskTopRect.Contains( (iLeft + Width), (iTop + Height) ) ==
false )
continue;
Left = iLeft;
Top = iTop;
break;
}
}
}
自己レスです。
2.ランダム値で移動先を生成したいについては解決しました。
System.Randomというクラスを見つけました。
.NETのヘルプ・・・難しい。
System.Screen クラス
System.Random クラス
たぶん、このあたりかと。
suzukaさんありがとうございます。
System.Windows.Forms.Screenでできました。
Screen・・・思い浮かばなかった・・・。
//画面の位置をランダムに移動
private void WindowPosRand()
{
Rectangle DeskTopRect;
Random Rand;
int iLeft, iTop;
DeskTopRect = System.Windows.Forms.Screen.GetWorkingArea( this ); //これ
でいいのか?後で調査
Rand = new System.Random( System.DateTime.Now.Millisecond );
//位置設定
while( true ){
iLeft = Rand.Next() % DeskTopRect.Width;
iTop = Rand.Next() % DeskTopRect.Height;
if( DeskTopRect.Contains( iLeft, iTop ) == false ||
DeskTopRect.Contains( (iLeft + Width), (iTop + Height) ) == false )
continue;
Left = iLeft;
Top = iTop;
break;
}
}
マルチディスプレイ環境の場合だったらプライマリディスプレイの解像度取得は
Rectangle rec = System.Screen.PrimaryScreen.Bounds;
セカンダリ以降は
Screen.AllScreens[i]・・・
位置設定はこれのほうが簡単かも
this.Location=new Point(x,y);
>マルチディスプレイ環境の場合だったらプライマリディスプレイの解像度取得は
>Rectangle rec = System.Screen.PrimaryScreen.Bounds;
>セカンダリ以降は
>Screen.AllScreens[i]・・・
ありがとうございます。
私はマルチディスプレイを使ったことがないので思い至りませんでした。
>位置設定はこれのほうが簡単かも
>this.Location=new Point(x,y);
そういえばPointなんてありましたね。
勉強になります。