ダイアログのサイズ変更について

[戻る]
you 2006/10/22(日) 14:37:41
VC 6.0MFCで開発しています.
作ったダイアログをWindows上でサイズ変更(小さく)する際,通常左上が残りますよね?
これを右側が残るようにしたいのですが可能でしょうか?

aharen [HomePage] 2006/10/22(日) 18:41:23
>これを右側が残るようにしたいのですが可能でしょうか?
操作でという意味ですかそれともプログラムでという意味ですか
プログラムでという意味ならエレガントな方法ではないが
たとえば右上を固定して横方向に100縦方向に200小さくしたかったら
下記例でもできることを確かめました

void CDtestDlg::OnButton1() 
{

    CRect Rect;
    CPoint Point1;
    CPoint Point2;
    int x1,y1,x2,y2;

    GetWindowRect(&Rect);
    Point1 = Rect.TopLeft();
    Point2 = Rect.BottomRight();
    x1 = Point1.x; y1 = Point1.y; x2 = Point2.x; y2 = Point2.y;

    Rect.SetRect(x1+100,y1,x2,y2-200);   //ここを希望にしたがって変える
    WINDOWPLACEMENT wp;
    wp.rcNormalPosition = Rect;
    SetWindowPlacement(&wp);
}

PATIO 2006/10/23(月) 13:16:33
ウインドウの位置を指定するときの基準位置はどこかとか
そういうところを考えれば、自前でやれば行けそうと言う事はわかりそうですが、
通常のAPIにそういう機能を持っているものがあるかと言う話なら多分ないと思います。
自分でサイズが変わった時に右下が動いていないように見せる為の計算等を
すればいいだけです。右下の位置が動かなかったかのように見せる為に
基準位置を移動すれば良いという話。
どの程度移動すればよいかは自分で図を書いて考えて見てください。
それほど難しい計算ではないはずです。

you 2006/10/23(月) 14:21:13
aharenさん
ご教授ありがとうございます.
ためしてみたのですが,上手くいきません..

例えば,ABCDEFG と書いてあるダイアログがあり,プログラム上でAB(左側)を消し
たい(隠したい)のですが,ABCDEが残ってFG(右側)が消えてしまいます.

右側を固定するとはどの処理で行っているのでしょうか?

you 2006/10/23(月) 15:57:25
PATIOさん
ご教授ありがとうございます.

>自分でサイズが変わった時に右下が動いていないように見せる為の計算等を
>すればいいだけです。右下の位置が動かなかったかのように見せる

上記のところの意味がよくわからないのですが,詳しく教えていただけないでしょうか?

NowNow 2006/10/23(月) 16:14:18
この質問って、もしかしたら、「ダイアログ上に配置されたコントロールを、ダイアログサ
イズの変更が発生した時に、左上のコントロールから見えなくなるようにしたい」というこ
とですか?
だとしたら外側にひとつウィンドウを用意して、その子ウィンドウとしてダイアログを作成
し、外側ウィンドウのリサイズのタイミングで、ダイアログの左下が外側ウィンドウの左下
に来るように移動させてあげればよいと思うのですが。

NowNow 2006/10/23(月) 16:16:39
ミスしました。すみません。

> ダイアログの左下が外側ウィンドウの左下に来る

「ダイアログの右端が外側ウィンドウの右端に来る」

aharen [HomePage] 2006/10/23(月) 21:00:15
私が示した処理はプログラムを作るということを除けば
四角形の位置や大きさに関する単なる算数にしかすぎないが
youさんの疑問を早合点してしまったかもしれません
>例えば,ABCDEFG と書いてあるダイアログがあり,プログラム上でAB(左
側)を消し
>たい(隠したい)のですが,ABCDEが残ってFG(右側)が消えてしまいます.
youさんがおこなったダイアログのサイズ変更の部分のソースをかいていただければ
youさんの疑問もそれだけわかりやすくなるとおもいますがいかがですか

you 2006/10/24(火) 13:55:21
返信遅くなりまして申し訳ありません.
現在のソースは以下です.

  ::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom - 
    rect.top,1);


しかし,これは100,100の位置に大きさ1/2のダイアログを表示するという命令であり,
これでは,右半分が消され,左半分の表示になってしまいます.
これを右半分が残るようにしたいのですが,可能でしょうか?

you 2006/10/24(火) 14:12:23
分かりにくかったかもしれませんので,追加します.
右半分というのは,位置の問題ではなく,「表示している右側」ということです.
例えばダイアログの左にピクチャA,右にピクチャBがあるとすると,ピクチャBのダイアログの
大きさで,ピクチャBを表示したいということです.

左側(ピクチャA)だけを表示するのは大きさを変えればできるのですが,
右側だけの表示というのが出来ないので,そこを教えていただきたく質問しました.

PATIO 2006/10/24(火) 15:02:21
えーと、最初の質問からでは言われているような事は多分理解できないと思います。

さておき、

コントロールにしても描画するときにしても基準になる位置と言うのがあります。
この考え方は対象がなんであれ同じ事です。

で、コントロールを配置したり、文字を描画したりする場合にその位置を決める
原点は何処になるでしょうか?
ウインドウにおける原点は、基本的に左上が原点(0,0)になります。
GDIで描画する場合はマッピングやヴューポートの変更で変わってくる事もありますが、
これは意識してやっているはずなので本人が間違う事はないでしょう。

で、原点が左上である以上普通にサイズを変更すれば、原点は動かないので
原点側の物が画面上に表示された状態になります。
言われているように右側のコントロールを表示した状態にしたのであれば、
サイズを変えた時に右下が原点であるかのように見せる為の計算を行い、
コントロールの位置を自前で調整する必要があります。

この辺は、自分で絵を書いてよく確認してください。
コントロールをどのように移動すれば、あたかも右下を原点に
サイズを変更しているかのように見せられるでしょう。

基本的にこれを簡単に実現する便利な関数はないと思います。
自分で移動すべき位置を計算で出してコントロールの位置を制御するしかありません。

多分、Windowsにおける座標系の理解が足りないのだと思います。
自分で色々なパターンを紙の上で書いてみて、サイズ変更前と変更後で
座標がどのようになっているのかを確認しましょう。

you 2006/10/24(火) 21:25:20
PATIOさん

アドバイスありがとうございます.サイズを変えた時に右下が原点であるかのように見せる為の
計算とは具体的にどのように行えばいいのでしょうか?

例えば大きさが300×300のダイアログが左上座標(100,100)にあるとすると,
右下は(400,400).
これを
::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom - 
rect.top,1);
として大きさを半分にすると,左半分が残り右下の座標は(250,400)となる.
これを(0,0)にするためには,引き算をすればいいんですが,
これをどう用いれば..

MoveWindowの引数は左上の座標と大きさだけだし...

と,考えてもよく分からないのですが...

aharen [HomePage] 2006/10/24(火) 21:48:30
>  ::MoveWindow(pWnd1,100,100, (rect.right - rect.left)/2, rect.bottom - 
    rect.top,1);

(1)これだとyouさんのいうとおりになると思います
(2)youさんの希望を既成のひとつの関数で実現するのはおそらくできないのでは
   ないでしょうか
   つまりMoveWindowをいくらいじったってできないと思います

>VC 6.0MFCで開発しています.
>作ったダイアログをWindows上
ということはプロジェクトは
 MFC AppWizard でつくったとかんがえてよいですか それとも
 Win32 Application でつくったのですか

you 2006/10/24(火) 21:59:53
MFC AppWizard でつくりました.
仮想的に右下を原点にする...どうすればいいのでしょうか(><)?

超初心者 2006/10/25(水) 09:13:39
何をやっているのか判らん。
各コントロールの座標を
ダイアログの右下からの距離が固定になるようにしたいのか。
ならば右下からの距離を求めればいいだけだと思う。


WM_INITDLGで:

ダイアログのクライアント領域の横幅と高さを求める。
これを(dlg.x, dlg,y)とする。
全子ウィンドウの相対座標を求める。
これを(children_pos[i].x, children_pos[i],y)とする。

以下が各子ウィンドウの右下からの距離になる。
children_rb[i].x = dlg.x - children_pos[i].x;
children_rb[i].y = dlg.y - children_pos[i].y;
これを覚えておく。



ダイアログのクライアント領域のサイズが変わったら:

WM_SIZEだっけ?
WM_SIZINGとかも処理する?
MoveWindowじゃなくて複数同時に移動できるやつの方がいいかな。
WM_SIZEやWM_SIZING中にウィンドウ移動ってうまくいくのかな?

ダイアログのクライアント領域の横幅と高さを求める。
これを(dlg.x, dlg,y)とする。

以下が各子ウィンドウの左上からの距離になる。
children_pos[i].x = dlg.x - children_rb[i].x;
children_pos[i].y = dlg.y - children_rb[i].y;
つまりこれが移動すべき座標だ。


以上
動作確認はしていません。



全子ウィンドウを云々は面倒だから
ダイアログの外枠になる親ウィンドウを作る。
ダイアログは子ウィンドウということになる。
外枠親ウィンドウのサイズが変わったら
ダイアログ1つの座標を動かすだけでいい。
でも元ダイアログより大きくした場合を考慮する必要があるか。

you 2006/10/25(水) 13:31:07
超初心者さん

たぶん伝わっていないと思うので,もう一度説明します.

私のやりたいことは,
例えばダイアログの左にピクチャA,右にピクチャBがあるとすると,ピクチャBのダイアログの
大きさで,ピクチャBだけを表示したいということです.

表示させる場所は関係なく,表示させる部分と大きさを指定したいのです.
ただ大きさを変えた(小さくした)だけでは,必然的にダイアログの左上部分がの表示されま
す.
これを例えばダイアログの右下部分が残るようにしたいのです.

PATIOさんが仮想的に右下の座標を原点とすれば出来るとアドバイスされていたのですが,
具体的な方法がわからないんです...

Kerry 2006/10/25(水) 14:41:00
やりたいことはすでに伝わってると思いますよ。
具体的には超初心者さんの方法で実現できると思います。

あと、もうひとつの方法としては、

OnInitDialog()にて、ダイアログのウィンドウサイズを記憶しておく。

OnSize()にて、ダイアログの新しいウィンドウサイズと以前のサイズから
変位量を求め、その分だけ各コントロールの位置をずらしてやれば良い。

アプローチが違うだけで、やってることは同じですが。

Kerry 2006/10/25(水) 15:31:35
…いや、違うのか?

> 表示させる場所は関係なく,表示させる部分と大きさを指定したいのです.

必ずしも右下というわけではないのですね。
そうであれば、やはりOnInitDialog()で各コントロールの位置を記憶する必要がある。

表示させる部分の左上座標を CPoint point;
大きさを CSize size;
コントロールの初期位置を CPoint m_ctrlPos;
とするならば、

void CXXXDialog::ShowArea(CPoint point, CSize size)
{
    // コントロールの移動
    ctrl->SetWindowPos(NULL,
        m_ctrlPos.x - point.x, m_ctrlPos.y - point.y,
        0, 0, SWP_NOSIZE|SWP_NOZORDER);

    ...

    // ダイアログのサイズ変更
    SetWindowPos(NULL, 0, 0, size.cx, size.cy, SWP_NOMOVE|SWP_NOZORDER);
}

つまり、こういうことがやりたい?

PATIO 2006/10/25(水) 16:58:08
要は、表示対象になっている物が大きな板の上に載っているとして
それをウインドウの大きさの窓から覗いていると考えればよいのでは?

任意の場所が表示されるようにする為には窓が覗く位置を任意に調整すれば、
良いわけですから、それを元に実際のクライアント座標上の位置を計算すれば良い。

ウインドウをコントロールする時の座標はクライアント座標系になるので
それを算出するわけです。
この辺の話って紙に書いてみれば直ぐにイメージが湧くと思うんだけどなぁ。

クライアント座標の原点が大きな板の上の座標系でどの位置になるかを考えて
それぞれのコントロールの位置をクライアント座標で表すとどうなるかっていう話です。

通常は大きな板の原点とウインドウ座標の原点は一致しているので
ウインドウサイズを変えれば、右下の方から画面外になりますよね。
何もしなければ、この関係は変わらないわけですからそうなるの当たり前です。
で、これを任意に動かすような便利な仕組みは用意されていないので
何とかしようすると自前で座標計算をしないと駄目と。
計算そのものは簡単な算数レベルの物なのでちゃんと概念が理解できていれば、
自分でもできるはずです。
逆に計算方法を聞かないとわからないというのは概念を理解できていないと言う事なので
概念の理解からかかった方がよいと思います。
概念の理解無しに計算方法だけわかっても応用が全く利かないので。

aharen [HomePage] 2006/10/25(水) 19:17:02
>やりたいことはすでに伝わってると思いますよ。
そう思います
基本的には超初心者さんの方法で実現できると思います。
youさん 仮にダイアログがクライアント領域になにもないのっぺらぼうなものだったら
なにも問題ないですよね 要するにコントロールがのっかっているから問題が
起こるわけです ダイアログを変形したとき隠れてしまったり希望の位置にならなくて
困るコントロールがあるならそれを希望の位置へ動的に配置換えすればよいわけです
その計算は座標の単なる加減算だということです

aharen [HomePage] 2006/10/26(木) 15:10:48
実例をつくってみました(私のシステムでは正常に動きます)
仮定
(1)ダイアログにはボタン(OKとBUTTON1,BUTTON2)とエディットボックスがある
(2)それぞれIDはIDOK IDC_BUTTON1 IDC_BUTTON2 IDC_EDIT1
(3)OKを押すとダイアログの幅が半分に変形する
(4)変形後OK,BUTTON1,BUTTON2はダイアログに残しEDIT1は外に隠す
コメント
(1)変形後残すものは変形前は左半分にあっても右半分にあってもよい
(2)コントロールが多数あるときは個別部分のところは
   WM_APPを使ってIDを連番にすればfor文が使用できます

void CDtestDlg::MoveOut(
    int ID,int NewX, int NewY, int NewWidth, int NewHeight,int d){
    CRect Ctrl;int x1, x2, y1, y2;
    CWnd* pWnd = GetDlgItem(ID);
    pWnd->GetWindowRect( Ctrl );
    x1 = Ctrl.left; x2 = Ctrl.right; y1 = Ctrl.top; y2 = Ctrl.bottom;
    if(x1 > NewX && x1<(NewX+NewWidth) ){
        pWnd->MoveWindow(NewX+10, y1,x2-x1,y2-y1,1);
    }
    
}

void CDtestDlg::MoveIn(
    int ID,int NewX, int NewY, int NewWidth, int NewHeight,int d){
    CRect Ctrl;int x1, x2, y1, y2, jd;
    CWnd* pWnd = GetDlgItem(ID);
    pWnd->GetWindowRect( Ctrl );
    x1 = Ctrl.left; x2 = Ctrl.right; y1 = Ctrl.top; y2 = Ctrl.bottom;
    if(x1>(NewX+NewWidth)){jd = x1 - (NewX+NewWidth);}else{jd = x1 - 
NewX;}
    pWnd->MoveWindow(jd-3, y1-NewY-(d - 3),x2-x1,y2-y1,1);    
    
}

void CDtestDlg::OnOK() 
{
    //共通部分(ダイアログ変形)
    CRect Dlog,Client;
    int x1, x2, y1, y2, ID,NewX,NewY,NewWidth,NewHeight,d;
    GetWindowRect( Dlog ); GetClientRect( Client );
    x1 = Dlog.left; x2  = Dlog.right; y1  = Dlog.top;  y2 = Dlog.bottom;
    NewX = x1; NewY = y1; NewWidth = (x2-x1)/2; NewHeight = y2-y1;
    MoveWindow(NewX, NewY, NewWidth, NewHeight, TRUE);
    d = y2 - y1 - Client.bottom;

    //個別部分(コントロールの移動)
    ID = IDOK;
    MoveIn(ID,NewX, NewY, NewWidth, NewHeight,d);
    ID = IDC_BUTTON1;
    MoveIn(ID,NewX, NewY, NewWidth, NewHeight,d);
    ID = IDC_BUTTON2;
    MoveIn(ID,NewX, NewY, NewWidth, NewHeight,d);
    ID = IDC_EDIT1;
    MoveOut(ID,NewX, NewY, NewWidth, NewHeight,d);

    //CDialog::OnOK();
}

you 2006/10/26(木) 16:02:39
aharenさん

ありがとうございます!
これを参考にプログラムを組んでみます!

結果は出来次第報告いたします.

aharen [HomePage] 2006/10/26(木) 19:17:43
改良版です
変形用のボタンOKが右上にあるとの仮定で右上を基準に
すべてのコントロールを平行移動する例です
変形はどんな変形でもOKです
個別部分の手数の節約については改良の余地が大です

void CDtestDlg::MoveCtrl(
    int ID,int NewX, int NewY, int NewWidth, int NewHeight,
    int OldX, int OldY, int OldWidth,int OldHeight,int d){
    CRect Ctrl;int x1, x2, y1, y2, DiffX,DiffY;
    CWnd* pWnd = GetDlgItem(ID);
    pWnd->GetWindowRect( Ctrl );
    x1 = Ctrl.left; x2 = Ctrl.right; y1 = Ctrl.top; y2 = Ctrl.bottom;
    DiffX = NewX + NewWidth - (OldX + OldWidth);
    DiffY = NewY - OldY;
    //右下基準の場合は DiffY = NewY + NewHeight - (OldY + OldHeight);
    pWnd->MoveWindow(x1 - OldX + DiffX -3, y1 - OldY + DiffY -(d - 3),
         x2-x1,y2-y1,1);    
    
}


void CDtestDlg::OnOK() 
{
    //共通部分(ダイアログ変形)
    CRect Dlog,Client;
    int x1, x2, y1, y2, ID,NewX,NewY,NewWidth,NewHeight,
        OldX,OldWidth,OldY,OldHeight,d;
    GetWindowRect( Dlog ); GetClientRect( Client );
    x1 = Dlog.left; x2  = Dlog.right; y1  = Dlog.top;  y2 = Dlog.bottom;
    NewX = x1; NewY = y1; NewWidth = (x2-x1)/2; NewHeight = y2-y1;
    OldX = x1; OldWidth = x2-x1; OldY = y1; OldHeight = y2-y1;
    MoveWindow(NewX, NewY, NewWidth, NewHeight, TRUE);
    d = y2 - y1 - Client.bottom;

    //個別部分(コントロールの移動)
    ID = IDOK;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth,
                  OldHeight, d);
    ID = IDCANCEL;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_EDIT1;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_EDIT2;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_BUTTON1;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_BUTTON2;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_BUTTON3;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);
    ID = IDC_BUTTON4;
    MoveCtrl(ID,NewX, NewY, NewWidth, NewHeight, OldX, OldY, OldWidth, 
OldHeight, d);

    //CDialog::OnOK();
}

aharen [HomePage] 2006/10/26(木) 20:06:27
追)
(1)pWnd->MoveWindow(x1 - OldX + DiffX -3, y1 - OldY + DiffY -(d - 3),
         x2-x1,y2-y1,1);
     ここにある 3  は線の太さに相当します(この表現適切かどうかはわからない)
(2)d = y2 - y1 - Client.bottom;
   タイトルバーの高さです
(3)NewX, NewY, NewWidth, NewHeightと
    OldX, OldY, OldWidth,OldHeightとこの例では一致する部分ありますが
   どんな変形にも対応できるようにNewとOld両方もうけました

aharen [HomePage] 2006/10/27(金) 02:56:39
追)
スタッティクメッセージは放っておくとIDは一律IDC_STATICになりますが
これは適当に
IDC_STATIC1
IDC_STATIC2
・・・・
などと個別特定できるように変えます
もちろんもっとわかりやすいID名でもよいです

aharen [HomePage] 2006/10/27(金) 10:49:06
追)
起動後に変位量の自由な設定について
たとえばgooの地図サイトで地図の上のポイントをダブルクリックすると
そこが中心になるように画面が移動します この手法をもとに
つぎの三つがかんがえられます
(1)上記のようにダブルクリックする点が中心になる(ダイアログは位置も大きさも不
変)
(2)ダブルクリックする点が右下の角の点になる
(3)ダブルクリックする点を通る直線が右辺になる
そこで(1)の実例を作ってみました(2)(3)は必要なら応用してできると思います

void CDtestDlg::MoveCtrl(){
    CRect Ctrl;int x1, x2, y1, y2, DiffX,DiffY;
    CWnd* pWnd = GetDlgItem(ID);
    pWnd->GetWindowRect( Ctrl );
    x1 = Ctrl.left; x2 = Ctrl.right; y1 = Ctrl.top; y2 = Ctrl.bottom;
    DiffX = (BottomRightX-TopLeftX)/2  - DbClickX;    //コントロールの
変位量                
    DiffY = (BottomRightY-TopLeftY)/2 - 
        (TbarHeight - 3 + DbClickY);            
    //コントロールの変位量
    pWnd->MoveWindow(x1 - TopLeftX + DiffX -3, 
        y1 - TopLeftY + DiffY -(TbarHeight - 3),x2-x1,y2-y1,1);
    
    
}

void CDtestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフ
ォルトの処理を呼び出してください
    //共通部分(ダイアログ変形)
    CRect Dlog,Client;
    GetWindowRect( Dlog ); GetClientRect( Client );
    TopLeftX = Dlog.left; BottomRightX  = Dlog.right;
    TopLeftY  = Dlog.top;  BottomRightY = Dlog.bottom;
    DbClickX = point.x; DbClickY = point.y;
    Invalidate();
    TbarHeight = BottomRightY - TopLeftY - Client.bottom;

    //個別部分(コントロールの移動)
    ID = IDOK;        MoveCtrl();
    ID = IDCANCEL;    MoveCtrl();

    for(ID = 1009;ID < 1021; ID++){    MoveCtrl();}
    
    CDialog::OnLButtonDblClk(nFlags, point);
}

引数を渡す方法でなくメンバー変数(データメンバーがC++の正式呼び名かな?)
ダイアログクラスの中でを定義しました
// 構築
public:
    int TopLeftX;        //ダイアログの左上X座標
    int TopLeftY;        //ダイアログの左上Y座標
    int BottomRightX;    //ダイアログの右下X座標
    int BottomRightY;    //ダイアログの右下Y座標
    int DbClickX;        //ダブルクリック点X座標
    int DbClickY;        //ダブルクリック点Y座標
    int TbarHeight;        //タイトルバーの高さ
    int ID;                //コントロールのID

void CDtestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
この関数はメニューにある 表示 から Classwizard をたどり
WM_LBUTTONDBCLK というイベントに関数をつけます

コントロールはOKとキャンセルのほかに
STATIC EDIT BUTTON COMBO をそれぞれ3個づつつくりました
システムが自動的に割り振った各コントロールのID値は
Resource.hのなかにあり

#define IDC_STATIC1                     1009
#define IDC_STATIC2                     1010
#define IDC_STATIC3                     1011
#define IDC_EDIT1                       1012
#define IDC_EDIT2                       1013
#define IDC_EDIT3                       1014
#define IDC_BUTTON1                     1015
#define IDC_BUTTON2                     1016
#define IDC_BUTTON3                     1017
#define IDC_COMBO1                      1018
#define IDC_COMBO2                      1019
#define IDC_COMBO3                      1020

なのでfor文は    for(ID = 1009;ID < 1021; ID++){    MoveCtrl();}
にしました ただしこれはビルド押す前に確認する必要があります
コントロールを途中で削除なんかすると連番でなく欠番が生じる
こともあります 事実私のシステムでも最初は1000からだったのですが
削除追加したので上記のようにかわってしまいました

you 2006/10/29(日) 16:01:09
[[解決]]
みなさんありがとうございます!
aharenさん お陰で無事システム完成することが出来ました.
僕はコントロールを動かせることを知らなかったのでこんなに悩んだのだと思います...

とても分かりやすい解説ありがとうございました!

古いスレッドには追加発言できません。