10代と話して驚いたこと

eMbedded Visual C++ 4.0 、MFC 、ダイアログベースでプログラミングをしています。
リストビューのスクロールバーを非表示にしてCListCtrl::Scrollを使い別のプログラムからスクロールさせたく、
「EnableScrollBarCtrl」や「ShowScrollBar」を使ってみたりしましたが非表示にできません。
リストビューのプロパティで「スクロールさせない」にチェックすると、CListCtrl::Scrollによるスクロールができなくなってしまいます。
非表示でCListCtrl::Scrollでスクロールできる方法をご存知でしたら教えてください。

なぜ別のプログラムでスクロールさせたいのかといいますと複数のリストビューを連動させてスクロールさせたいためです。
eMbedded Visual C++ 4.0はVC++6.0と似ているようですのでそのあたりに詳しい方アドバイスをください。

A 回答 (2件)

 こんにちは。

実験してみた所、実現できましたのでご報告いたします。

・VC++6.0, MFC, にて行いました。
・リストビューのスクロールをしないにチェックします(消したいようですので)
・単独のスクロールバー(IDC_SCROLLBAR1)をダイアログに貼り付けて、リストビューをスクロールさせています。

以下参考程度に。

void CKaiketuDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください

//テスト用のスクロールバーに対して何かされた
if(::GetDlgCtrlID(pScrollBar->GetSafeHwnd()) == IDC_SCROLLBAR1)
{
//縦の移動量を示す変数
int vScroll = 0;

//何の操作か
switch(nSBCode)
{
//下方向関係が押された
case SB_LINEDOWN:
case SB_PAGEDOWN:vScroll = -10; break;

//上方向関係が押された
case SB_LINEUP:
case SB_PAGEUP:vScroll = 10;
}

//リストビューのクライアント領域をスクロールさせる
::ScrollWindowEx(m_listCtrl.GetSafeHwnd(), 0, vScroll, 0, 0, 0, 0, SW_SCROLLCHILDREN | SW_INVALIDATE);

//リストビュー内の全てのアイテムをスクロールさせる
for(int i = 0; i < m_listCtrl.GetItemCount(); ++i)
{
POINT ptPos = {0};
//アイテムの位置を取る
m_listCtrl.GetItemPosition(i, &ptPos);

//縦方向に向かって移動量を加算する
ptPos.y += vScroll;

//アイテム位置を設定する
m_listCtrl.SetItemPosition(i, ptPos);
}
}

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
    • good
    • 0

 こんにちは。


 訂正です。
 ScrollWindowEx()は必要ありませんでした。
 アイテム位置を変更するだけでスクロール出来ます。
    • good
    • 0
この回答へのお礼

ありがとうございます。御礼が遅くなりすみません。
試したところ、うまくいきませんでした。
どううまくいかなかったかは・・・すみません忘れました。
スクロールバーが表示されてしまったような気がします。

プロパティの「スクロールさせない」はアイテムがすべて収まるのが前提なのかもしれません。
また、リストビューのアイテムには高さ調整用のイメージを貼り付けているのでそれが関係していたかもしれません。

とりあえず「スクロールさせない」はチェックせず、表示されてしまうスクロールバーの部分は他のコントロールで隠すことで一応の解決を見ました。

ほかにいい方法があれば教えていただけるとたすかります。
テストできるかは分かりませんが。

お礼日時:2008/08/22 15:08

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報