質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

受付中

ピクチャコントロール内で図形を跳ね返らせる処理を教えてください。

don
don

総合スコア10

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

1回答

0リアクション

0クリップ

178閲覧

投稿2022/08/18 13:16

前提

VC++のMFC(ダイアログベース)にて、ピクチャコントロール内で図形を動かし、ピクチャコントロールの四方の壁に当たると図形を跳ね返らせるプログラムを書いています。

ピクチャコントロールの壁に描画した図形が衝突する判定までは出来ているようなのですが、
そこから方向を変えて次に当たる壁まで移動させることができていません。

改善点、アドバイス等、よろしくお願いいたします。

該当のソースコード

C++

// ダイアログのクラス // 図形とピクチャコントロールの壁の当たり判定をする関数 BOOL CPolygonViewerDlg::isBounds() { CRect rect; GetDlgItem( IDC_IMAGE )->GetWindowRect( rect ); ScreenToClient( &rect ); rect.Width(); rect.Height(); double dMinX, dMinY, dMaxX, dMaxY; m_Rect.MaxFrame( &dMinX, &dMinY, &dMaxX, &dMaxY ); if( rect.right - rect.left < dMaxX ){ return TRUE; } else if( rect.left - rect.left > dMinY ){ return TRUE; } else if( rect.top - rect.top > dMinY ){ return TRUE; } else if( rect.bottom - rect.top < dMaxY ){ return TRUE; } else{ return FALSE; } } // OnTimerの関数 void CPolygonViewerDlg::OnTimer( UINT_PTR nIDEvent ) { // TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。 // 移動量(方向) int nMoveX = 1; int nMoveY = 0; if( 1 == nIDEvent ){ if( FALSE == isBounds() ){ nMoveX *= 1; } else{ nMoveX *= -1; } } m_Rect.Move( nMoveX, nMoveY ); m_Rect.Rotate( 30 ); Invalidate(); CDialogEx::OnTimer( nIDEvent ); } // ダイアログの派生クラス // ピクチャコントロール内に描画した図形の最大フレーム(四角)を求める関数 BOOL CArea::MaxFrame( double *Xmin, double *Ymin, double *Xmax, double *Ymax ) // 最大枠 { //if( ){ // return FALSE; //} double MinX = m_arrPoint.GetAt( 0 ).X; for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ if( MinX > m_arrPoint.GetAt( i ).X ){ MinX = m_arrPoint.GetAt( i ).X; } } *Xmin = MinX; double MinY = m_arrPoint.GetAt( 0 ).Y; for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ if( MinY > m_arrPoint.GetAt( i ).Y ){ MinY = m_arrPoint.GetAt( i ).Y; } } *Ymin = MinY; double MaxX = m_arrPoint.GetAt( 0 ).X; for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ if( MaxX < m_arrPoint.GetAt( i ).X ){ MaxX = m_arrPoint.GetAt( i ).X; } } *Xmax = MaxX; double MaxY = m_arrPoint.GetAt( 0 ).Y; for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ if( MaxY < m_arrPoint.GetAt( i ).Y ){ MaxY = m_arrPoint.GetAt( i ).Y; } } *Ymax = MaxY; return TRUE; } // 図形を移動させる関数 BOOL CArea::Move( double Dx, double Dy ) // 移動 { //if( ){ // return FALSE; //} for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ m_arrPoint.GetAt( i ).X = m_arrPoint.GetAt( i ).X + Dx; m_arrPoint.GetAt( i ).Y = m_arrPoint.GetAt( i ).Y + Dy; } return TRUE; }

補足情報(FW/ツールのバージョンなど)

Visual Studio C++ MFCアプリケーション ダイアログベース
を使っています。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。