質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

6834閲覧

イメージリストコントロール 選択アイテムの境界線の色づけ

TEC_S

総合スコア79

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/19 12:33

お世話になります。

使用環境:Visual Studio 2005pro
使用言語:C++ / MFC

リストコントロールのイメージリスト機能を使って、画像をリストに入れています。

やりたい事は、選択したイメージリストの境界を枠で囲う事です。
通常であれば、選択しただけで、選択枠が出てきますが、リストのソートを行った
後も、選択状態にしたい為、オリジナルで描写したいと考えています。
(この考え方もおかしいのかも知れませんが・・・)

現在、シングルクリックイベントの中に、下記コードを書き、動作させて見ましたが、
選択イメージの境界付近に、枠は描写されませんでした。

自分のやろうとしている事へのアプローチの仕方や、ソースコードへの指摘など
お願いいたします。

C++

1OnNMClicklistallview(NMHDR *pNMHDR, LRESULT *pResult) 2{ 3 LPNMITEMACTIVATE pItemAct=(LPNMITEMACTIVATE)pNMHDR; 4 5 LVHITTESTINFO hitTest; 6 memset(&hitTest,'\0',sizeof(LVHITTESTINFO)); 7 hitTest.pt=pItemAct->ptAction; 8 m_listView.SendMessage(LVM_SUBITEMHITTEST,0,(LPARAM)&hitTest); 9 10 m_listView.SetOutlineColor(0x000000ff); 11 m_listView.Update(hitTest.iItem); 12} 13 14 ※m_listlView リストビューの変数名

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2015/11/20 02:12

すいません。回答依頼を頂きましたが、MFCについは全く知識がないので私にはアドバイスできません。
TEC_S

2015/11/20 02:22

ご連絡頂き、ありがとうございます。 承知しました。 糸口すら見えずに、情報も無いので困っています。。 もう少し、情報を探してみます。
guest

回答1

0

ベストアンサー

VS6 時代にリストコントロール+以イメージリスト+オーナードロー
で、ドラッグ、ドロップのハーフトーンイメージがマウスドラッグで
移動するまで全部手作りしました。
物凄く大変だったのを薄っすら覚えています。オーナドローと、仮想リスト
の組み合わせは表示データ量に依存しないので実装はとても大変ですが
実現できるといいですね。
オーナードローを検索してみてください。

ソート前に選択したアイテムが、ソート後にそのアイテムが新しい並びのどこに位置するかを視覚的に確認できるんですね、ユーザーインターフェースとして普通の動作だと思います。
ソートするたびに、スクロールが先頭に戻り、選択がリセットされる、なんていう手抜きも甚だしい動作するアプリの方が多いように思えます。

投稿2015/11/20 03:16

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TEC_S

2015/11/20 03:27

ご回答、ありがとうございます。 オーナードローですね。検索してみます。 仰るとおり、ソート前の選択アイテムを、ソート後にも視覚的に確認出来る様に 実装したいと考えています。内部的には簡単ですが・・・。 UIにこれ程苦労する事になるとは、、、想定していませんでした。
TEC_S

2015/11/20 11:51

すみません。 一点、確認させて下さい。 調べた所、オーナーウィンドウのウィンドウプロシージャーにて、リストクリックイベントを感知して、リストビューに描写する・・・という流れで合っていますでしょうか?? 自分の記載していた、リストビューのシングルクリックイベントへの記載では駄目そうだという認識ですが・・・合っていますでしょうか。 ご教授、よろしくお願いいたします。
ipadcaron

2015/11/20 14:01

http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm カスタムドロー、オーナードローより敷居が低いらしい。 http://www.kumei.ne.jp/c_lang/sdk/sdk_41.htm イメージボタンを作るオーナードロー、 なんか、カスタムドローのやり方でいけそうな気がしてきましたが、 最近C++/MFC 全然触ってないのでなんとも・・・ クリックイベントじゃなくて、そのものずばりなイベントが飛んでくるみたいですね。 アイテムにマーカーを付けたり外したりする処理が呼ばれるタミングは、クリックがきっかけではあるのですがアイテムそのものを描画する直前のイベントがあるみたいです。
TEC_S

2015/11/21 10:03

ありがとうございます。大変助かっています。 実装した所、カスタムドローでいけそうですが、一点問題があります。 リストの描写時に、要素①のイメージだけアクセスできないように(クリックできない) なってしまいます。下記がコードです。 ==================== □ ■ □ □ □ □ □ □  ← ■だけクリックできない □ □ □ □ □ □ □ □  □ □ □ □ □ □ □ □  ※□は画像が入っている ==================== コード-------------------------------------------------------- case WM_NOTIFY: //カスタムドロー if(lpnm->dwDrawStage == CDDS_PREPAINT) //描写サイクル開始前 return CDRF_NOTIFYITEMDRAW; if(lpnm->dwDrawStage == CDDS_ITEMPREPAINT) //アイテムが描写される前 { if(ListView_GetCheckState(m_listlView.m_hWnd, lplvcd->nmcd.dwItemSpec)) { if(lplvcd->nmcd.dwItemSpec == 1) { lplvcd->clrTextBk = RGB(255, 0, 0); return CDRF_NEWFONT; } } } break; ---------------------------------------------------------------------- CDDS_PREPAINTは、0x00000001となっていますが、どうやらその数値の要素数が アクセスできなくなっている様です。 調査していますが、要素数に関係の無い数値を指定した場合、描写が行われません。。 頼りきりで申し訳ありまえんが、何かあればご教授をお願いいたします。
TEC_S

2015/11/21 11:35 編集

すみません。 出来ました。 lpnm->hdr.code == NM_CUSTOMDRAW ↑これが無いと、選択不可になるみたいです。 コーディングミスでした。ここまでくれば、後は大丈夫そうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問