ダイアログベースで大量データを表示するには?


かーみー  2005-03-24 20:39:34  No: 56772

VC++ GUI勉強中です。
環境はWindowsXP + VC6++です。 
ダイヤログベースで大量(15万点)のデータの表示させようとしております。ダイヤログ上にCScrollViewを貼り付けて描画できるようにしたので
すが、さすがに遅すぎて使えませんでした。(間引いて表示したりしました
うまくいかず困っています)後でマウス選択で拡大縮小の機能を付け
加えようとしているので、この方法でいいか悩んでおります。
アドバイスをお願いします。


みい  2005-03-24 22:34:55  No: 56773

全部を表示させようとするとどうしても重くなるので、グリッドを貼り付けて見える範囲のみデータを表示。
画面サイズ変更やスクロールのイベントで新しい範囲のデータを表示更新。


かーみー  2005-03-28 18:26:12  No: 56774

返事が遅くなりました。
「グリッドを貼り付けて見える範囲のみデータを表示」の部分の
グリッド貼り付けの方法が思いつかず試行錯誤中です。
よろしくお願いいたします。


みい  2005-03-28 22:50:13  No: 56775

グリッドが見つからないということでしょうか?
[プロジェクト]-[プロジェクトへ追加]-[コンポーネント及びコントロール]で
ファイル選択ダイアログが開きます。
[Registered ActiveX Controls]フォルダ内にMicrosoft FlexGrid Control
(以下MSFlexGrid)があります。
見える範囲ですが、GetTopRow,GetLeftColで左上のセルが取得できるので
MSFlexGridの全体的なサイズを各セルのサイズで割り戻して何セル表示されて
いるか計算。
※MSFlexGridはTWIPS単位を使用しているので、要注意

なお、市販のグレープシティ社製VSFlexだと右下のセルを取得できる
GetBottomRow,GetRightColがあるので、計算の必要がなくて楽です。


かーみー  2005-03-29 00:32:57  No: 56776

みいさん  どうもありがとうございます。
TWIPS単位ですか、ISOTROPIC、LOMETRICでやってましたので変更して
行ってみます。
MSFlexGridの参考になるページ等はありますでしょうか?
よろしくお願いいたします。


みい  2005-03-29 05:54:36  No: 56777

> TWIPS単位ですか、ISOTROPIC、LOMETRICでやってましたので変更して
> 行ってみます。
私は単位系いじるのがめんどくさかったんで、MSFlexGridから取得した幅・高さ
を15で割ってPIXELに変換して使ってました(^_^;)

参考になるページですか。申し訳ないのですが、VBのしか知らないですね。
http://www.bcap.co.jp/hanafusa/VBHLP/MSFlexind.htm
設定    VB:MSFlexGrid.XXX = 数値or文字列
        VC:MSFlexGrid.SetXXX(数値or文字列)
取得    VB: = MSFlexGrid.XXX
        VC: = MSFlexGrid.GetXXX()
で置き換えて考えて下さい。


かーみー  2005-03-29 20:00:39  No: 56778

参考になるページを見て行っていましたが、始めの質問が分かりにくく申し
訳ありませんでしたが、主にグラフ作成(SetPixel)で描画していた
のとはちょっと異なってしまったようです。
そちらの方も検討してみます。(データ表示も作成しようと考えており
ました。)
よろしくお願いいたします。


みい  2005-03-29 20:27:02  No: 56779

ごめんなさい。グラフ表示だったんですね。
でしたら、スクロールバーを別に貼り付けてその位置で描画範囲を制御してみて下さい。


みい  2005-03-29 20:41:07  No: 56780

スクロールバーはスクロール位置のMIN-MAX差が32、767以下ですので、
1スクロールで10点分スクロールとして
・スクロール範囲を0〜(点数-描画点数)/10-1
・スクロールイベントが入ったらスクロール位置を取って描画更新
あとはCScrollViewのままスクロールイベント等でGetScrollPositionで
スクロール位置取得、スクロール位置から画面サイズ分だけ描画更新という手
もあり。


かーみー  2005-03-30 00:13:56  No: 56781

みいさん  どうもありがとうございます。
>あとはCScrollViewのままスクロールイベント等でGetScrollPositionで
>スクロール位置取得、スクロール位置から画面サイズ分だけ描画更新と
>いう手もあり。
とするとスクロール位置取得はできたのですが、上位のダイヤログへ
スクロール位置を渡そうとするとうまくいかなかったです。
>スクロールバーを別に貼り付けてその位置で描画範囲を制御してみて
下さい。
こちらの方法で行わなければならないでしょうか?


みい  2005-03-30 01:34:21  No: 56782

取得できたのなら、きちんと渡せるように修正した方が…。


かーみー  2005-03-30 18:04:42  No: 56783

プログラムを修正していたのですが、スクロールしたというメッセージが
渡らず、ダイヤログ上でスクロール位置をリアルタイムでの表示がうまくい
きません。スクロール位置のダイヤログ側からボタン押したときと表示する
ことはできました。
構成としては、ダイヤログ上にCScrollViewクラスの派生クラスを作成し
メンバとしてnew後にcreateで表示させています。グラフ描画は派生クラス内でさせています。
あと、CDocumentの派生ができないと警告を出すのですが対応法はあるので
しょうか?
(はじめからSDI,MDIにしてダイヤログを生成するようにしなければならない
?)


REE  2005-03-30 19:51:07  No: 56784

CScrollViewを使っているのなら、スクロールしたというメッセージを使う必要はありません。
スクロールのサイズや量を設定するためにCScrollView::SetScrollSizesを使用し、
CScrollViewのOnDrawでの描画でCDC:GetClipBoxかCDC:RectVisibleを併用すれば高速化も可能です。
拡大率によって、データを間引くのも有効でしょう。


かーみー  2005-04-02 00:46:11  No: 56785

REEさんどうもありがとうございます。
ダイアログ側にスクロールバーの位置を表示しなければならなくなりまして、View側でいろいろと試してみましたがうまくいかず困っています。
ステータスバー等に表示する方法を参考にしてみましたが、ダイアログのポインタが取得できないようでエラーとなりました。
ご助言お願いします。


REE  2005-04-04 20:08:26  No: 56786

>ステータスバー等に表示する方法を参考にしてみましたが、ダイアログのポインタが取得できないようでエラーとなりました。
>ご助言お願いします。

参考にしたサンプルも、あなたのコードも、エラー内容も不明ですので、
回答しようが有りません。


かーみー  2005-04-08 22:18:03  No: 56787

返事が遅くなりました。
スクロールバーの位置表示ではちょっと手間取りましたが、
一応自己解決しました。
View内から生成元のダイヤログのポインタを取り、ダイヤログベース側の使用予定のないメッセージ(OnMButtonDblClk等)を送って、表示させることができました。
>CScrollViewのOnDrawでの描画でCDC:GetClipBoxかCDC:RectVisibleを併用すれば高速化も可能です。
いろいろとためしています。CScrollViewではMM_ANISOTROPICとMM_ISOTROPIC
が設定できないようなので、描画方法を再検討中です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加