Formの位置をランダムに移動したい – プログラミング – Home

Formの位置をランダムに移動したい
 
通知
すべてクリア

[解決済] Formの位置をランダムに移動したい


t2
 t2
(@t2)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

初めまして。
以前は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;
}
}
}


引用未解決
トピックタグ
t2
 t2
(@t2)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

自己レスです。
2.ランダム値で移動先を生成したいについては解決しました。
System.Randomというクラスを見つけました。
.NETのヘルプ・・・難しい。


返信引用
suzuka
 suzuka
(@suzuka)
ゲスト
結合: 22年前
投稿: 46
 

System.Screen クラス
System.Random クラス

たぶん、このあたりかと。


返信引用
t2
 t2
(@t2)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

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;
}
}


返信引用
scapos
 scapos
(@scapos)
ゲスト
結合: 22年前
投稿: 7
 

マルチディスプレイ環境の場合だったらプライマリディスプレイの解像度取得は
Rectangle rec = System.Screen.PrimaryScreen.Bounds;
セカンダリ以降は
Screen.AllScreens[i]・・・

位置設定はこれのほうが簡単かも
this.Location=new Point(x,y);


返信引用
t2
 t2
(@t2)
ゲスト
結合: 21年前
投稿: 16
Topic starter  

>マルチディスプレイ環境の場合だったらプライマリディスプレイの解像度取得は
>Rectangle rec = System.Screen.PrimaryScreen.Bounds;
>セカンダリ以降は
>Screen.AllScreens[i]・・・
ありがとうございます。
私はマルチディスプレイを使ったことがないので思い至りませんでした。

>位置設定はこれのほうが簡単かも
>this.Location=new Point(x,y);
そういえばPointなんてありましたね。
勉強になります。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました