|
 |
|
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 ;フォント適用

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

| |
|