都道府県穴埋めゲーム

作成手順
1) IDC_SCROLLBAR1として、リソースエディタで適当な位置に配置

2) 右クリック 「変数の追加」で、コントロール変数の追加
CForm1View に、 CScrollBar m_sbHorz; として、追加される

3) CForm1View::InitialUpdate() で、
// スクロールバーの設定
this->m_sbHorz.SetParent(this);
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::ShowWindow( hWndSb, SW_SHOW );
CRect rectSb;
::GetClientRect( hWndSb, &rectSb );

4) CForm1View::OnDraw() で、
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::SetScrollRange( hWndSb, SB_CTL, this->m_ScMinVal, this->m_ScMaxVal, FALSE );
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );
::ShowWindow( hWndSb, SW_SHOW );
※ m_ScMinVal: 最小値、m_ScMaxVal = 最大値、m_ScPos=現在値 の変数

5) CFomr1View::OnSize()で、
// FormViewのScrollBarを表示させない
SetScrollSizes( MM_TEXT, CSize(cx,cy) );
CWnd::OnSize(nType, cx, cy );

// スクロールバーの位置調整
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::GetClientRect( hWndSb, &rect );
::MoveWindow( hWndSb, 0, cy, cx, rect.Height(), FALSE );
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );

6) CFomr1View::OnHScroll() で、
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );


とやると、スクロールバーが表示されません。
何かアドバイスいただけませんか?


また、今、スクロールバーの表示位置調整や、ScrollPosのセットなんかを
Win32API関数使ってますが、MFCで(というか、CScrollBar m_sbHorz; を使って)
できないものなのでしょうか?

よろしくお願いします。

A 回答 (1件)

スクロールバーを何処の設置したいのでしょう?



フォームビューの下端であれば
CFornView::OnSizeにおいて

if ( m_sbHoriz.m_hWnd ) {
  CRect rc;
  m_szHorz.GetWindowRect( &rc );
  m_szHorz.MoveWindow( 0, cy - rc.Height(), cx, rc.Height());
}
といった具合に コントロールのハンドルをチェックして APIを使いましょう

m_szHrzは CFormView::OnInitialUpdate()などでコントロールとリソースが結合されたあとならビュークラスの中で使えますよ
OnSizeはコントロールが初期化される前のビュークラスの生成時にも呼ばれるのでハンドルのチェックが必要です

WinAPIで行っているほとんどの関数はCScrollBarクラスにあると思います
引数の HWNDを省力した形の引数をとると思います
    • good
    • 0
この回答へのお礼

できました!
ありがとうございます。とっても助かりました。

最下端に配置したかったのですが、私のコードでは、スクロールバーの上端が、Viewの最下端になってしまっていたようですね。
ご指南にしたがって修正したところ、目的の動作ができました。

また、MFC化の方法も理解したので、これから移植を進めたいと思います。

また何かありましたらよろしくお願いいたします。

お礼日時:2008/12/01 23:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報