CListViewのオーナードローはレポート表示の時しか出来ないのですか? – プログラミング – Home

CListViewのオーナードローはレ...
 
通知
すべてクリア

[解決済] CListViewのオーナードローはレポート表示の時しか出来ないのですか?


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

こんにちは
CListViewのオーナードローはレポート表示の時しか出来ないのですか?

void COwnerListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();

CListCtrl& wndList = GetListCtrl( );

// イメージリスト
m_ImgList.Create( 32, 32, ILC_COLOR24, 0, 1 );
CBitmap bitmap; bitmap.LoadBitmap( IDB_BITMAP );
for( int j = 0; j < 5; j++ ) m_ImgList.Add( &bitmap, RGB( 0, 0, 0 ) );
wndList.SetImageList( &m_ImgList, LVSIL_NORMAL );
// アイテム追加
wndList.InsertColumn(0, テスト, 150 );
wndList.InsertItem(0, あーーーーーー);
wndList.InsertItem(0, いーーーーーー);
wndList.InsertItem(0, うーーーーーー);
wndList.InsertItem(0, えーーーーーー);
wndList.InsertItem(0, おーーーーーー);
}

void COwnerListView::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
CListCtrl& wndList = GetListCtrl( ); //ここにブレークポイントを置いて
}
ヘッダーに
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
を追加してあります

PreCreateWindow内で
// スタイルの設定
cs.style |= ( LVS_ICON | LVS_OWNERDRAWFIXED ); ( A )
cs.style |= ( LVS_REPORT | LVS_OWNERDRAWFIXED ); ( B )

( A )の時はブレークポイントで停止しませんが、
( B )の時はブレークポイントで停止します

アイコン表示の時にオーナードローを行いたいのでどのようにすれば良いでしょう?

まだオーナードローの事がよくわかっていないので、
日本語のMFCのサンプル等の在処、知りませんか?

win2000 SP3
VC6.0 SP5
MFC使用

宜しくお願いします。


引用未解決
トピックタグ
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> CListViewのオーナードローはレポート表示の時しか出来ないのですか?

MSDNのCListCtrl::Createのところに、
「LVS_OWNERDRAWFIXED
 レポート ビューのアイテムをオーナー ウィンドウが描画できるようにします。」
とあります。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

カスタムドローならアイコン表示のときでも出来るようです。(Windows2000にて確認)

オーナードローに比べると自由度は低いですが、
目的によってはカスタムドローで十分です。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> オーナードローに比べると自由度は低いですが、

↑これは間違いかも。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

kazuma さん回答ありがとうございます。

オーナードローはできないんですね。

カスタムドローはよくわからないのですが、
日本語&MFCで詳しいサンプルありますか?
できればkazuma さんが試したソースを見ることは出来ないですか?

よろしくお願いします


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

私が試したのは以下のようなコードです。
前に作ったアプリの一部です。アイテムごとにテキスト部分の背景色を変えています。
元のアプリはレポート形式のリストビューでしたが、アイコン形式でもうまくいきました。

NM_CUSTOMDRAW通知を処理している部分のコードです。
(ON_NOTIFYマクロを使ってハンドラを設定しています。)

BOOL C*Dlg::OnListNotifyCustomDraw(NMHDR * pNotifyStruct, LRESULT * pResult)
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNotifyStruct;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
lplvcd->clrTextBk = (lplvcd->nmcd.dwItemSpec % 2) ? RGB(255,255,255) :
RGB(200,255,200);
lplvcd->clrText = RGB(0,0,0);
*pResult = CDRF_NEWFONT;
break;
default:
*pResult = CDRF_DODEFAULT;
break;
}
return FALSE;
}

カスタムドローに関する日本語の詳しい解説というのはあまり無いようです。
有名な「猫でも~」( http://www.kumei.ne.jp/c_lang/index.html)の261章に
そこそこ詳しい解説がありますが。
きちんとした解説は英語版のMSDNを読むしかないと思います。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます

OnListNotifyCustomDrawなどカスタムドローの関数はClassWizardでは
書いてくれないみたいですね。

勉強します。わからないことがあったらマタきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました