HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0413
コタツツリービューとリストビューの特定行のみを太文字にしたい。4解決


コタツ

リンク

2011/4/13(Wed) 21:34:18|NO.38374

メーラーソフト等で良くある、リストに表示されてるメールのうち新着メールのみを太字にするような事をしたく思っています。
全体を太字にする事は下のように書けばできたのですが、特定行のみを太字にするやり方が、調べても良く分からず、つまっています。
どうすれば出来るでしょうか?よろしくお願いします。


#define LVM_INSERTITEM $1007 #define LVM_INSERTCOLUMN $101B #define LVM_SETEXTENDEDLISTVIEWSTYLE $1036 #define WM_SETTEXT $30 #define TVM_INSERTITEM $1100 //バッファ画面を用意(フォントを設定) buffer 1 font "MS UI Gothic", 15, 16 | 1 mref BMSCR, 67 hFont = BMSCR.38 //描画先をメインウィンドウに戻す gsel //リストビュー作成 winobj "syslistview32", "", $200, $50000001, 320, 200 hListview = objinfo(stat, 2) repeat 2 szText = ""+cnt+"" LVCOLUMN = $F, 0, 150, varptr(szText), 0, 0 sendmsg hListview, LVM_INSERTCOLUMN, cnt, varptr(LVCOLUMN) loop repeat 20 pszText = "ああああああああああ" LVITEM = 1, 0, 0, 0, 0, varptr(pszText) sendmsg hListview, LVM_INSERTITEM, , varptr(LVITEM) loop sendmsg hListview, WM_SETTEXT, hFont ;フォント適用 //ツリービュー作成 winobj "SysTreeView32", "", 0, $50800027, 320, 240 hTreeview = objinfo(stat, 2) szText = "親アイテム1" tvinsertstruct = 0, 0, $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.0 = stat szText = "子アイテム1" tvinsertstruct = hItem.0, 0, $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.1 = stat szText = "子アイテム2" tvinsertstruct = hItem.0, hItem.1, $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.2 = stat sendmsg hTreeview, WM_SETTEXT, hFont ;フォント適用



この記事に返信する


backdrop

リンク

2011/4/14(Thu) 00:21:42|NO.38386

リストボックスもどきみたいなのを組めばよろし
マウス座標を調べて重なったらふと文字を再描画
で離れたら普通の文字に再描画とか?



コタツ

リンク

2011/4/15(Fri) 00:49:46|NO.38405

backdropさん
回答どうもありがとうございます。

Let's HSP!さんというサイトに、リストビューの項目の文字色、背景色の変更方法に関しては解説があり、
メーラー等のソフトウェアで同じような挙動をしているものが多くあることから、
トピックタイトルのような事は、技術的にはそんなに難しいことをしなくても、出来るのでは?という認識でいるのですが・・・。
http://lhsp.s206.xrea.com/hsp_object6.html#7


自作でリストボックスのような物を作る以外に方法は無いのでしょうか?
引き続き、回答を募集します。どうかよろしくお願いします。



Cookies

リンク

2011/4/15(Fri) 18:55:19|NO.38416

そんな簡単にはできないと思うな。

http://lhsp.s206.xrea.com/hsp_object4.html#7の中の「リストボックスの文字色変更」の一番下にあるように、
>ちなみに、項目別に異なる文字色を指定したい場合は「オーナードロー」という処理が必要です。
>リストボックスの項目描画をすべて自前で行わないといけないので、かなりメンドーなことになります。
です。
項目別はオーナードローをしないと駄目、というのはリストビューにも当てはまるんじゃないかな。


リストビューはなかったので、リストボックスのオーナードローサンプル。
http://hspdev-wiki.net/?OwnerDraw%2FODListBox

上のは色変更なので、太さは……これ?第五引数あたりに…
http://msdn.microsoft.com/ja-jp/library/cc428368.aspx
それでできたフォントのハンドルをSelectObjectに渡せばできるのではないかな。



コタツ

リンク

2011/4/17(Sun) 16:17:50|NO.38484

Cookiesさん
回答どうもありがとうございました。

提示してくださったURLやSelectObjectなどのキーワードを元にいろいろ調べて、「Let's HSP!」さんや「猫でもわかる〜」さんなどのサイトを参考にさせていただいて、数日頭を抱えながらようやく出来ました。(^_^;)
詳しいことは良く分からないのですが、恐らくオーナードローではなくカスタムドローというやり方で出来ました。

ツリービューに関しては、文字が欠けたり、選択時に色が反転しなかったりと、まだ改良が必要みたいですが・・・。

これで、ツール作成の方がが捗りそうで良かったです。どうもありがとうございました。



//リストビューの太字 #uselib "gdi32" #cfunc CreateFont "CreateFontA" int,int,int,int,int,int,int,int,int,int,int,int,int,str #func SelectObject "SelectObject" int,int #func SetGraphicsMode "SetGraphicsMode" int,int #define LVM_SETITEM $00001006 #define LVM_INSERTITEM $1007 #define LVM_INSERTCOLUMN $101B #define LVM_SETEXTENDEDLISTVIEWSTYLE $1036 oncmd gosub *notify, $4E //フォント作成 SetGraphicsMode hdc,2 ;グラフィックスモードをGM_ADVANCEDに変更 a = 0 ;角度(1/10度単位) s = 12 ;フォントサイズ f = "MS UI GOTHIC" ;フォント名 hFont = CreateFont(s,0,0,a,700,0,0,0,128,0,0,0,0,f) ;フォント作成 SelectObject hdc,hFont // winobj "syslistview32", "", $200, $50000001, 330, 200 hListview = objinfo(stat, 2) // 選択項目の場合にフォーカス外の背景色が消える?みたいなので // 項目全体フォーカス sendmsg hListview, LVM_SETEXTENDEDLISTVIEWSTYLE, , $20 szText = "ああああ" LVCOLUMN = $F, 0, 100, varptr(szText), 0, 0 sendmsg hListview, LVM_INSERTCOLUMN, 0, varptr(LVCOLUMN) szText = "いいいい" LVCOLUMN = $F, 0, 100, varptr(szText), 0, 0 sendmsg hListview, LVM_INSERTCOLUMN, 1, varptr(LVCOLUMN) szText = "うううう" LVCOLUMN = $F, 0, 100, varptr(szText), 0, 0 sendmsg hListview, LVM_INSERTCOLUMN, 2, varptr(LVCOLUMN) repeat 100 pszText = "AAAAAA" LVITEM = 1, cnt, 0, 0, 0, varptr(pszText) sendmsg hListview, LVM_INSERTITEM, , varptr(LVITEM) pszText = "BBBBBB" LVITEM = 1, cnt, 1, 0, 0, varptr(pszText) sendmsg hListview, LVM_SETITEM, , varptr(LVITEM) pszText = "CCCCCC" LVITEM = 1, cnt, 2, 0, 0, varptr(pszText) sendmsg hListview, LVM_SETITEM, , varptr(LVITEM) loop stop *notify #const global NM_OUTOFMEMORY -1 ;コントロールは、利用できるメモリが十分になかったため操作を完了できなかった #const global NM_CLICK -2 ;ユーザーがコントロール内で左クリックした #const global NM_DBLCLK -3 ;ユーザーがコントロール内で左ダブルクリックした #const global NM_RETURN -4 ;コントロールが入力フォーカスを持った状態でユーザーがリターンキーを押した #const global NM_RCLICK -5 ;ユーザーがコントロール内で右クリックした #const global NM_RDBLCLK -6 ;ユーザーがコントロール内で右ダブルクリックした #const global NM_SETFOCUS -7 ;コントロールが入力フォーカスを受け取った #const global NM_KILLFOCUS -8 ;コントロールが入力フォーカスを失った #const global NM_CUSTOMDRAW -12 ;描画動作に関する通知 #const global NM_HOVER -13 ;マウスがコントロールのアイテム上に停止した #const global NM_NCHITTEST -14 ;コントロールが WM_NCHITTEST メッセージを受け取った #const global NM_KEYDOWN -15 ;コントロールが入力フォーカスを持っているときに、ユーザーがキー入力をした #const global NM_RELEASEDCAPTURE -16 ;コントロールがマウスキャプチャを解放している #const global NM_SETCURSOR -17 ;コントロールが WM_SETCURSOR メッセージに応じて、カーソルを設定している。 #const global NM_CHAR -18 ;文字キーが押された // NMLVCUSTOMDRAW.3 dwDrawStage #define CDDS_PREPAINT $0001 ;描画サイクルが開始する前。 #define CDDS_POSTPAINT $0002 ;描画サイクルが完了した後。 #define CDDS_PREERASE $0003 ;消去サイクルが開始する前。 #define CDDS_POSTERASE $0004 ;消去サイクルが完了した後。 #define CDDS_ITEM $10000 ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 #define CDDS_ITEMPREPAINT $10001 ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 #define CDDS_ITEMPOSTPAINT $10002 ;アイテムが描画された後。(CDDS_ITEM | CDDS_POSTPAINT) #define CDDS_ITEMPREERASE $10003 ;アイテムが消去される前。(CDDS_ITEM | CDDS_PREERASE) #define CDDS_ITEMPOSTERASE $10004 ;アイテムが消去された後。(CDDS_ITEM | CDDS_POSTERASE) #define CDDS_SUBITEM $20000 ;サブアイテムが描画されているならば、フラグはCDDS_ITEMPREPAINTかCDDS_ITEMPOSTPAINTの組み合わせです。これは、CDDS_PREPAINTからCDRF_NOTIFYITEMDRAWが返される場合でのみ設定されます。 dupptr NMHDR, lparam, 12 if NMHDR.0 = hListview { ;リストビュー dupptr NMLVCUSTOMDRAW, lparam, 60 if NMHDR.2 = NM_CUSTOMDRAW { ;描画動作に関する通知 if NMLVCUSTOMDRAW.3 = CDDS_PREPAINT { ;描画サイクルが開始する前。 return $20 } if NMLVCUSTOMDRAW.3 = CDDS_ITEMPREPAINT { ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 if NMLVCUSTOMDRAW.9\2 = 1 { ;アイテムが偶数行なら適用 NMLVCUSTOMDRAW.12 = $000000 ;文字色 NMLVCUSTOMDRAW.13 = $BBBBBB ;背景色 SelectObject NMLVCUSTOMDRAW.4,hFont ;フォント適用 } } } } return




//ツリービューの太字 #uselib "gdi32" #cfunc CreateFont "CreateFontA" int,int,int,int,int,int,int,int,int,int,int,int,int,str #func SelectObject "SelectObject" int,int #func SetGraphicsMode "SetGraphicsMode" int,int oncmd gosub *notify, $4E //フォント作成 SetGraphicsMode hdc,2 ;グラフィックスモードをGM_ADVANCEDに変更 a = 0 ;角度(1/10度単位) s = 12 ;フォントサイズ f = "MS UI GOTHIC" ;フォント名 hFont = CreateFont(s,0,0,a,700,0,0,0,128,0,0,0,0,f) ;フォント作成 SelectObject hdc,hFont // #define TVM_INSERTITEM $1100 //ツリービュー作成 winobj "SysTreeView32", "", 0, $50800027, 320, 240 hTreeview = objinfo(stat, 2) repeat 10 szText = "親アイテム"+cnt+"" tvinsertstruct = 0, 0, $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.hoge = stat hoge++ szText = "子アイテム"+cnt+"_1" tvinsertstruct = hItem.(hoge-1), 0, $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.hoge = stat hoge++ szText = "子アイテム"+cnt+"_2" tvinsertstruct = hItem.(hoge-2), hItem.(hoge-1), $1, 0, 0, 0, varptr(szText) sendmsg hTreeview, TVM_INSERTITEM, 0, varptr(tvinsertstruct) hItem.hoge = stat hoge++ loop stop *notify #const global NM_OUTOFMEMORY -1 ;コントロールは、利用できるメモリが十分になかったため操作を完了できなかった #const global NM_CLICK -2 ;ユーザーがコントロール内で左クリックした #const global NM_DBLCLK -3 ;ユーザーがコントロール内で左ダブルクリックした #const global NM_RETURN -4 ;コントロールが入力フォーカスを持った状態でユーザーがリターンキーを押した #const global NM_RCLICK -5 ;ユーザーがコントロール内で右クリックした #const global NM_RDBLCLK -6 ;ユーザーがコントロール内で右ダブルクリックした #const global NM_SETFOCUS -7 ;コントロールが入力フォーカスを受け取った #const global NM_KILLFOCUS -8 ;コントロールが入力フォーカスを失った #const global NM_CUSTOMDRAW -12 ;描画動作に関する通知 #const global NM_HOVER -13 ;マウスがコントロールのアイテム上に停止した #const global NM_NCHITTEST -14 ;コントロールが WM_NCHITTEST メッセージを受け取った #const global NM_KEYDOWN -15 ;コントロールが入力フォーカスを持っているときに、ユーザーがキー入力をした #const global NM_RELEASEDCAPTURE -16 ;コントロールがマウスキャプチャを解放している #const global NM_SETCURSOR -17 ;コントロールが WM_SETCURSOR メッセージに応じて、カーソルを設定している。 #const global NM_CHAR -18 ;文字キーが押された // NMLVCUSTOMDRAW.3 dwDrawStage #define CDDS_PREPAINT $0001 ;描画サイクルが開始する前。 #define CDDS_POSTPAINT $0002 ;描画サイクルが完了した後。 #define CDDS_PREERASE $0003 ;消去サイクルが開始する前。 #define CDDS_POSTERASE $0004 ;消去サイクルが完了した後。 #define CDDS_ITEM $10000 ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 #define CDDS_ITEMPREPAINT $10001 ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 #define CDDS_ITEMPOSTPAINT $10002 ;アイテムが描画された後。(CDDS_ITEM | CDDS_POSTPAINT) #define CDDS_ITEMPREERASE $10003 ;アイテムが消去される前。(CDDS_ITEM | CDDS_PREERASE) #define CDDS_ITEMPOSTERASE $10004 ;アイテムが消去された後。(CDDS_ITEM | CDDS_POSTERASE) #define CDDS_SUBITEM $20000 ;サブアイテムが描画されているならば、フラグはCDDS_ITEMPREPAINTかCDDS_ITEMPOSTPAINTの組み合わせです。これは、CDDS_PREPAINTからCDRF_NOTIFYITEMDRAWが返される場合でのみ設定されます。 dupptr NMHDR, lparam, 12 if NMHDR.0 = hTreeview { ;ツリービュー dupptr NMTVCUSTOMDRAW, lparam, 60 if NMHDR.2 = NM_CUSTOMDRAW { ;描画動作に関する通知 if NMTVCUSTOMDRAW.3 = CDDS_PREPAINT { ;描画サイクルが開始する前。 return $20 } if NMTVCUSTOMDRAW.3 = CDDS_ITEMPREPAINT { ;dwItemSpec、uItemState、lItemlParamの値が有効であることを示しています。 foreach hItem if NMTVCUSTOMDRAW.9 = hItem.cnt and cnt\2 = 1 { ;アイテムが偶数行なら適用 NMTVCUSTOMDRAW.12 = $000000 ;文字色 NMTVCUSTOMDRAW.13 = $BBBBBB ;背景色 SelectObject NMTVCUSTOMDRAW.4,hFont ;フォント適用 } loop } } } return



ONION software Copyright 1997-2023(c) All rights reserved.