はじめまして、最近VC++を使い始めたmAroと申します。
早速ですが、MFCのMDIを使っていまして、
CFormViewのスクロールバーをスライドさせるたびに
他のCScrollViewウィンドウの再描画を行いたいのですが、不思議な動作をします。
まず、起動した直後はスクロールバーをスライドさせても、
再描画させる対象のウィンドウは反応しません。
しかし、一度、最小化、ウィンドウサイズの変更等の自動で再描画させる動作を
起こした後にスライドさせると普通に再描画されるのです。
実際の2つのクラス関係の記述は、以下のようになっています。
class A : public CFormView {
B tmp ;
void A::OnHScroll { tmp.ReDraw() ; }
}
class B : public CScrollView {
HWND hWndB=m_hWnd ;
void B::ReDraw(){
m_hWnd=hWndB ;
InvalidateRect( NULL, TRUE ) ;
}
}
クラスAでクラスBのReDraw()関数を呼び出したときに
ウィンドウハンドルが返っていなかったため、
強引にCWndのメンバ変数であるm_hWndをhWndBに代入して保持しています。
そして、ReDraw()が呼び出されたときに値を元に戻しています。
おそらくこのやり方はまずい気がしますが、
他にどのような記述したら正常に動作するようになるのでしょうか?
MFCのMDIということなのですが、上記のソースを見る限りでは構成がよくわかりません。こ
れらのビューはどこで生成されるのでしょう?
ドキュメントを新規作成するなり、開くなりして生成されるものではないのでしょうか?
違うのなら下記の記述は無視してください。
2つのビューは1つのドキュメントに属するものなのでしょうか?
それとも別々のドキュメントに属するものなのでしょうか? この場合、ドキュメント同士の
関連性は?
どちらの場合でも、ドキュメント経由で再描画する関数をコールすると簡単です。
例)1つのドキュメント(クラス:CHogeDoc)に属する場合
//////////////////////////////////////////////////////////////
class CHogeDoc : public CDoument
{
public:
class CViewB *m_viewB;
// ...... 省略
};
///////////////////////////////////////////////////////////////
class CViewB : public CScrollView {
public:
virtual void OnInitialUpdate(); // オーバーライド
// ...... 省略
void Redraw(){ InvalidateRect( NULL, TRUE ); };
};
void CViewB::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CHogeDoc* pDoc = (CHogeDoc*)GetDocument();
pDoc->m_viewB = this;
}
//////////////////////////////////////////////////////////////////
class CViewA : public CFormView {
protected:
void OnHScroll();
};
void CViewA::OnHScroll()
{
CHogeDoc* pDoc = (CHogeDoc*)GetDocument();
pDoc->m_viewB->Redraw();
}
//////////////////////////////////////////////////////////////////
別々のドキュメントに属するなら、一方のドキュメントからもう一方のドキュメントのポイン
タが得られるようにして、後は上の例と同様にすれば出来ます。
mAroです。
saraさんありがとうございます。
まだVC経験が未熟で説明が足らず申し訳ありません。
ドキュメントは新規作成、もしくはファイルをオープンすることによって生成されます。
そして2つのビューのドキュメントは同じドキュメントに属しています。
ドキュメントから2つのビューを関連つければよいのですね。
無事解決しました。
今までドキュメントを経由せず2つのビューのみでやろうとしていました。
おかげでかなりわかりづらいコード構造になっています。
これを機に少しドキュメントを使ったコードに書き直してみることにしてみます。
ありがとうございました。