お世話になってます、環境はWinXP VC7 MFC Doc/View です
ダイアログにリストコントロールを配置してレポート表示にしています
リストのアイテムが複数ありY軸にスクロールさせたとき、コラムが常に表示されてい
る様に
リストのコラムが複数ありX軸にスクロールさせたとき、アイテムの左端の項目だけは常
に表示される様に
したいのですが出来ますでしょうか?
感覚的にはExcelのB2セルでウインドウ→ウインドウ枠の固定を設定した状態です。
宜しくお願いします。
フラグ設定等ではできません。
次のような方法が考えられます。
案1) リストコントロールを2つ並べて、縦スクロールの同期を取る。
案2) オーナードローで何とかする。
案3) ヘッダーと同様の方法で、固定列コントロールを作って、
リストボックスの左側に埋め込む。
ありがとうございます
案1)をやってみようと思うのですが
リストコントロールのイベントハンドラで縦のスクロール座標の変更に
対応するのでしょうか?
また、CListCtrlのメンバ変数に縦のスクロール座標を意味する物があるのでしょうか?
よろしければ御教授願います。
>リストコントロールのイベントハンドラで縦のスクロール座標の変更に
>対応するのでしょうか?
>
>また、CListCtrlのメンバ変数に縦のスクロール座標を意味する物があるのでしょうか?
試しも、または良く調べも、しないで(少し調べれば分るような事を)訊(き)いちゃう
のは感心しません。(上に示す書き方では調べても分らなかったとは受取れなかった)
メンバー変数には無いと思いますが、メンバー函数(かんすう)には幾つかあると思います
(CListCtrl になくても基底クラスにあるでしょう)
すみません
>リストコントロールのイベントハンドラで縦のスクロール座標の変更に
>対応するのでしょうか?
スクロールしたという情報はイベントハンドラでしか受け取れないと思ったので
リソースエディタで
ダイアログに配置してあるリストコントロールを右クリックして
イベントハンドラの追加を選択し
イベントハンドラウィザードのメッセージの種類とハンドラの説明を
見ながらそれらしいイベントハンドラで試してみたのですが出来なかったため
質問させていただきました。
メンバー関数に幾つかあるとおっしゃられたので
リストコントロールはダイアログクラス内に
CListCtrl lc;
と宣言してあったのでそこを見てみるとCListCtrl::OnVScroll()
というのを見つけたのですが、恥ずかしながらこの関数の追加の仕方がわかりません。
CListCtrlの継承クラスが必要という事でしょうか?
それと、OnVScroll()等を上で言っているイベントハンドラの追加で
設定できないのはなぜでしょうか?
分かりづらい文で申し訳ないです、宜しくお願いします。
CListCtrlの縦スクロールイベントを捕まえるには、
CListCtrlの派生クラスを作って、WM_VSCROLLハンドラを追加します。
ありがとうございます。
OnVScroll()でスクロールバーのクリックには対応できたのですが
リストに表示されている表の縦座標を取得、設定するにはどうすればよいのでしょうか?
GetScrollInfo()、GetScrollBarCtrl()、GetScrollPos()等それらしい物はあるのですが
よく分かりません、SCROLLINFO構造体を使用する必要があるのでしょうか?
宜しくお願いします。
>リストに表示されている表の縦座標を取得、設定するにはどうすればよいのでしょうか?
>GetScrollInfo()、GetScrollBarCtrl()、GetScrollPos()等それらしい物はあるのですが
>よく分かりません、SCROLLINFO構造体を使用する必要があるのでしょうか?
そういうことはやってみて上手く行かなかった場合に訊(き)いても遅くない事ですね?
サムトラック(スクロールバー)を動かした場合、ボタンをクリックした場合、
ページ単位に動かした場合と、色々試してみれば MSDN の解説と併せて考えれば判る事だと
思います。これを使うと何が出来るのかという点から MSDN ライブラリーの解説を読んで
調べましょう
又、個々の意味や使い方が MSDN では分らないという事でしたら、具体的に訊いてください
CListCtrl::GetItemCount(), CListCtrl::GetCountPerPage(), CListCtrl::GetTopIndex
()
等も役に立つかもしれません
> GetScrollInfo()、GetScrollBarCtrl()、GetScrollPos()等それらしい物はあるのですが
> よく分かりません、SCROLLINFO構造体を使用する必要があるのでしょうか?
よく分からないとは、
1) 関数一覧でそれらしい名前を見つけた。説明を見ただけでやる気がなくなった。
2) 試すのが面倒だ。どれを使うかまず答えを聞きたい。
3) 説明を読んだが理解できない。引数に何を指定するのか分からない。
4) 説明を見ながらプログラムを組んでみたが、コンパイルエラー、
または実行時に失敗する。
5) プログラムを作成し、各関数を呼び出してみたが、
取得した値の利用方法が不明である。
6) プログラムを作成し、座標を取得することができた。
しかし、この方法でよいのか不安である。
のどれでしょう。
よく分からないという表現は曖昧なので使わないようにしましょう。
皆さんありがとうございます。
よく調べるべきでした、申し訳ありません。
以下にスクロールに関係ありそうな関数と島様に教えて頂いた関数を書きました。
CWnd::GetScrollBarCtrl
垂直スクロール バーの位置を取得。とありますが、値の取得の方法が分かりません(戻り
値?virtualの意味が分かりません)
CWnd::GetScrollBarInfo
'GetScrollBarInfo' は 'CListCtrl' のメンバではありません。と表示されます、メニ
ュー オブジェクトの意味が分かりません
CWnd::GetScrollInfo
この関数で垂直スクロールバーの位置を取得できました。
CWnd::GetScrollPos
この関数で垂直スクロールバーの位置を取得できました。
GetItemCount
アイテムの数取得(理解できました)
CListCtrl::GetCountPerPage
表示領域に入るアイテムの数(理解できました)
CListCtrl::GetTopIndex
一番上に表示されているアイテムのインデックス(理解できました)
この関数で垂直スクロールバーの位置を取得できました。
今回はCWnd::GetScrollPosかCListCtrl::GetTopIndexでやってみようと思います。
色々と貴重なヒントを有難うございます、最初から答を教えられていたら
よく理解しないまま続けていたと思います。
垂直スクロールバーの位置の取得はできたのですが設定の方が分かりません
リスト1の位置をリスト2に適用したく
lc2.SetScrollPos(SB_VERT,lc1.GetScrollPos(SB_VERT),TRUE);
としましたがリスト2の表示領域はスクロールせずにバーだけスクロールしました。
表示領域もスクロールさせようと
lc2.ScrollWindow(0,lc1.GetScrollPos(SB_VERT));
としてみましたがコラムまでスクロールしたりスクロール量がリスト1と
一致しない等、うまくいきません。
GetTopIndexのSet版があると期待していましたが見当たりませんでした。
どうすればよいのでしょうか?
>どうすればよいのでしょうか?
MSDN ライブラリーで CListCtrl のクラスメンバーについてチャンと真面目に調べましょう
何度も言いますが、調べれば分る事で一々泣きつくのは感心しません
(調べ方はもう何度もお教えしていますから、きつい事を言っているとは思いません)
lc2.SetScrollPos()
lc2.ScrollWindow()
それぞれ MSDN ライブラリーでどういう動きをするものなのか調べれば、何故思惑通りに
動作しないか分る事だと思いますが、どうですか?
それから、上手くいきませんという表現ではどういうところが上手くいかないのか他人に
分らせる事がいつも出来るというわけでは有りません。どのように上手くいかないのか
書かないと、上手くいかないことしか伝わらないでしょ?
(読み手に、余計な負担を強いている事に気付いて下さい---書けば済む事なんだから)
BOOL CListCtrl::Scroll(CSize size) っていうのが見えませんでしたか?
これでスクロール出来なかったら御免なさい
>BOOL CListCtrl::Scroll(CSize size) っていうのが見えませんでしたか?
Scrollという名のついてる関数は全部試したと思っていたのに本当に申し訳ないです
スクロールさせる事が出来ました。
まだバークリック以外のスクロールに対応できていないのでよく調べてみます。
何度も見てもらってありがとうございます。