プロパティーシート上のプロパティページにリストコントロールを貼って使おうとしています。
リストコントロールはレポート形式です。
アイテム、サブアイテムの挿入はできました。
しかし、一番行いたいのが、サブアイテムの編集です。
このページの過去ログを調べて、以下のページを参考にしました。
http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php
/c1077
サンプルのプロジェクトもダウンロードして、動作も調べながら、同じ動作をするように組み込
んでみた所、ビルドは通りますが、結局うまくいきませんでした(編集どころか、アイテムの表
示もされない)。
いろいろ調べると、だいたい、アイテムの編集関係、フォーカスの処理(?)と、描写の処理の
3つに分かれているようです。
描写の処理が複雑なようで(OnPaint()の中の処理が複雑に書かれている)、ここを消して動か
してみると、編集を行うことができました。
ただし、その際、拡張スタイルのLVS_EX_FULLROWSELECTによる一行全体表示の青色が灰色に
なります(編集のラベル以外)。
また、サブアイテムを編集中は、左のメインのアイテムの表示が消えます(編集が終わると、表
示される)。
多分、編集とフォーカス関係の処理だけだと、変になるから、描写の処理が書かれているのでし
ょうが、その辺りがうまくいってないため、何も表示されなくなるんだと思います。
サンプルでは、リストコントロールではなく、リストビューだったためでしょうか。
頭に書いたとおり、プロパティーシート上のプロパティページにリストコントロールを貼って
使うため、ややこしいです。
どなたか、ラベルの編集のやり方を教えて頂けないでしょうか?
また、上記のように、ややこしい使い方で、うまく動いている方いましたら、ぜひ教えて下さ
い。
よろしくお願いします。
ご紹介のページ見てみました
そこに「example provided by MSVC 5.0」の記述があります
これはVisual C++5.0または
Visual STUDIO97 で作成したサンプルであることを
示していると思われます
MSDNには、開発バージョンが変わった際に記述内容が如実に変わる
サンプルが掲載されることがあります
1例としては、私がここで良く紹介するSWAP32と言うものです
開発環境、実行環境 を明記しておかないと回答者はVC5の回答で良いと
思い込んで回答する人もいます
最近の開発環境なのかそれとも、VC5としての回答で良いのか
明記したほうが良いと思います
誤解・回答によるトラブルを避けるために明記しましょう
サンプルの CListEditView を CListCtrl から派生するようにして、
GetEdcitCtrl を除く程度の変更で、普通に使えました。
もちろん、プロパティシート上のプロパティページに貼り付けた
リストコントロールをサブクラス化して。
紹介ページにもあるように、このサンプルは MFC サンプルの
ROWLIST をベースにしています。
ROWLIST は LVS_EX_FULLROWSELECT 相当の表示をオーナードローで
実現するサンプルです。
(LVS_EX_FULLROWSELECT は IE3 で追加された拡張スタイルで、
VC5 の MFC はこれに対応していませんでした)
リストコントロールに LVS_OWNERDRAWFIXED スタイルが付いているか
確認することをお勧めします。
なお、ダイアログのコントロールをサブクラス化する場合には
OnSize が呼ばれませんが、大きな問題は発生しません。
むしろその方が本当の LVS_EX_FULLROWSELECT に近くなります。
(サンプルの m_cx, OnPaint, OnSize は不要になります)
woodさん、申し訳ありませんでした。
開発環境は、windows2000で、VC++ .net 2003を使用しています。
言葉が足りなくてすみませんでした。
愚暗さん、試して頂いてありがとうございました。
参考にさして頂いて、再度、行ってみます。
一つ確認したいのですが、LVS_OWNERDRAWFIXEDは、付いていない方が良いのですね?
よろしくお願いします。
愚暗さん、すみません。
LVS_OWNERDRAWFIXEDスタイルを付けると、プロパティページが表示される際に、
winctrl2.cpp Line:599で、例外処理で落ちてしまいます。
かといって、これを付けていないと、LVS_EX_FULLROWSELECTのような一行選択は表示され
ず、サブアイテムの編集はできません。
これは、開発環境の違いのためでしょうか。
いろいろ変えて試してみました。以下の状態で、だいぶ良くなってきました。
が、まだ、うまくいかない点があります。
頭に書いた通り、下記のサンプルソースを基にしています。
http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php
/c1077
リストコントロールのスタイルは以下にしました。
ModifyStyle( LVS_TYPEMASK, LVS_REPORT | LVS_SINGLESEL | LVS_EDITLABELS );
SetExtendedStyle( GetExtendedStyle() | LVS_EX_FULLROWSELECT );
サンプルソース中に出てきたメンバ関数等は、使用せず
(愚暗さんのアドバイス通りLVS_EX_FULLROWSELECTを実現するためだけだったようで)
メッセージハンドラのOnLvnEndlabeledit()と、OnLvnBeginlabeledit()のみをサンプルソー
スそのままで、使用してみています。
この状態だと、編集が可能で、一行選択も変に表示はされません。
しかし、ある行のサブアイテム(2列目以降)を編集する際、その行のアイテム(1列目)の表示
が消えます。サブアイテムの表示は残っています。もちろん、編集中のサブアイテムも後ろに表
示が残っています。
考えたのですが、元々、リストコントロールでは、サブアイテムの編集は考えられていない(ア
イテムのみ編集可能)なため、編集中は、アイテムの表示が消えているのだと思います。
という事は、アイテムの表示を消す位置を編集中のサブアイテムに移動したら良いと思うのです
が・・・。
メッセージハンドラ、
OnLvnBeginlabeledit()内のどこかで消えているかと思い、調べましたが、消えているのは、
その後だったため、分かりませんでした。
OnLvnEndlabeledit()が呼ばれた時には、すでに消えていました。
解決策があれば、ぜひ、アドバイスを頂きたいです。
よろしくお願いします。
こちらこそ言葉足らずで混乱させてしまったようで申し訳ありません。
私が言いたかったのは、
ROWLIST サンプルでは LVS_EX_FULLROWSELECT 相当の表示を実現するために
オーナードローを使っている。
一方、CodeGURU のサンプルでは、サブアイテムのラベルエディット中に
一番左のカラムのアイテムの描画を行うことを主目的としてオーナードローを
使っている。
ですから、CodeGURU サンプルと同様に、きっちりオーナードローしてください。
(LVS_OWNERDRAWFIXED を付けて DrawItem をオーバーライドしてください)
ということでした。
CodeGURU のサンプルでは、そもそもは一番左のカラムのアイテムのラベルを
編集するために作られたエディットコントロールを、無理矢理所望の
サブアイテムの位置に移動しています。
リストビューのデフォルトの動作としては、エディットコントロールに
隠されているはずの部分を描画するのは無駄なので、一番左のカラムのアイテムは
描画されないのでしょう。
だったらオーナードローで描画してしまえ、というのが CodeGURU サンプルの
ポイントだと読みました。
> LVS_OWNERDRAWFIXEDスタイルを付けると、プロパティページが表示される際に、
> winctrl2.cpp Line:599で、例外処理で落ちてしまいます。
私の持っている MFC が古いので外れかもしれませんが、
void CListCtrl::DrawItem(LPDRAWITEMSTRUCT)
{
ASSERT(FALSE);
}
の部分ではないでしょうか?
LVS_OWNERDRAWFIXED スタイルを付けて DrawItem をオーバーライドしないと
(しかも親がオーナードローしないと)ここで Assertion Fail してしまいます。
愚暗さん、ありがとうございました!!
アドバイスの通りでした!!
言われたとおりする事で、うまく動いてくれました!!
本当に助かりました!!
また、困った時など、ぜひよろしくお願いします!!