|
|
2019/12/30(Mon) 16:30:48|NO.89133
リストボックスで、項目ごとに文字色を変える方法を教えてください!
|
|
2019/12/30(Mon) 20:49:15|NO.89138
こちらのソースに少し手を加えると可能です。
http://wiki.hsp.moe/OwnerDraw%EF%BC%8FODListBox.html
上記URLのソース109行目
SetTextColor itemDC, RGB(0,0,0)
このRGB値を変えると文字色が変わります。
項目毎に別の色にするのは少し面倒ですが、
上記ソースの109行目を下記に変更すると全ての項目の文字色が変更できます。
if(itemID == 0) {
SetTextColor itemDC, RGB(255,20,147)
}
else:if(itemID == 1) {
SetTextColor itemDC, RGB(240,128,128)
}
else:if(itemID == 2) {
SetTextColor itemDC, RGB(255,140,0)
}
else:if(itemID == 3) {
SetTextColor itemDC, RGB(218,165,32)
}
else:if(itemID == 4) {
SetTextColor itemDC, RGB(152,251,152)
}
else:if(itemID == 5) {
SetTextColor itemDC, RGB(124,252,0)
}
else:if(itemID == 6) {
SetTextColor itemDC, RGB(50,205,50)
}
else:if(itemID == 7) {
SetTextColor itemDC, RGB(60,179,113)
}
else:if(itemID == 8) {
SetTextColor itemDC, RGB(30,144,255)
}
else:if(itemID == 9) {
SetTextColor itemDC, RGB(65,105,225)
}
else:if(itemID == 10) {
SetTextColor itemDC, RGB(106,90,205)
}
else:if(itemID == 11) {
SetTextColor itemDC, RGB(0,0,205)
}
else:if(itemID == 12) {
SetTextColor itemDC, RGB(128,0,128)
}
else:if(itemID == 13) {
SetTextColor itemDC, RGB(148,0,211)
}
else:if(itemID == 14) {
SetTextColor itemDC, RGB(191,0,223)
}
else:if(itemID == 15) {
SetTextColor itemDC, RGB(221,160,221)
}
これはif、elseですが、もちろんswitchでも可です。

| |
|
2019/12/30(Mon) 22:09:45|NO.89139
返信ありがとうございます。
せっかく返信していただいて申し訳ないのですが、
私は「listbox」で同じようなことがしたいです。
始めたばかりで、そのソースの応用の仕方もわからないので。
|
|
2019/12/30(Mon) 22:39:32|NO.89140
標準命令のlistboxは無理だったような気がします。
あらやさんの説明そのままのソースコードだけ貼っておきますね。
#ifndef _OWNERDRAW_LISTBOX_SMP1_AS_
#define _OWNERDRAW_LISTBOX_SMP1_AS_
;=====================================================================
; v3_042_OwnerDrawListBox_smp1.hsp 用 ヘッダファイル for hsp3.0a
;
; 2006/01/07
;=====================================================================
// ウィンドウスタイル
#define WS_CHILD $40000000
#define WS_VISIBLE $10000000
#define WS_VSCROLL $00200000
#define WS_EX_CLIENTEDGE $00000200
// リストボックススタイル
#define LBS_NOTIFY $0001
#define LBS_OWNERDRAWFIXED $0010
#define LBS_OWNERDRAWVARIABLE $0020
#define LBS_HASSTRINGS $0040
// ウィンドウメッセージ
#define WM_MEASUREITEM $002C
#define WM_DRAWITEM $002B
#define WM_COMMAND $0111
// リストボックスメッセージ
#define LB_ADDSTRING $0180
#define LB_GETTEXT $0189
#define LB_GETCURSEL $0188
// リストボックス通知コード
#define LBN_ERRSPACE (-2)
#define LBN_SELCHANGE 1
#define LBN_DBLCLK 2
#define LBN_SELCANCEL 3
#define LBN_SETFOCUS 4
#define LBN_KILLFOCUS 5
// DrawEdge 用
#define BDR_RAISEDOUTER $0001 ; 外側凸
#define BDR_SUNKENOUTER $0002 ; 外側凹
#define BDR_RAISEDINNER $0004 ; 内側凸
#define BDR_SUNKENINNER $0008 ; 内側凹
#define BDR_SUNKEN (BDR_SUNKENOUTER | BDR_SUNKENINNER)
#define BF_RECT $000F ; 四辺
// hspマクロの短縮
#define dspx ginfo_dispx ; ディスプレイ幅
#define dspy ginfo_dispy ; ディスプレイ高さ
#define winx ginfo_winx ; クライアント幅
#define winy ginfo_winy ; クライアント高さ
// Owner Draw Status
#define ODS_SELECTED $0001 ; 選択
#define ODS_DISABLED $0004
#define ODS_FOCUS $0010 ; フォーカス
// Owner Draw Action
#define ODA_DRAWENTIRE $0001 ; コントロール全体の描画要求
#define ODA_SELECT $0002 ; アイテムの選択状態の変更通知
#define ODA_FOCUS $0004 ; コントロールフォーカスの変更通知
// SetBkMode()
#define TRANSPARENT 1 ; 背景残し
// サンプル用定数
#define MARGIN 50 ; 余白
#define IDC_LISTBOX $4000 ; リストボックスID
#define MAXSTRING 255 ; 項目の最大バイト数
#define ITEMNUMBER 16 ; リストに表示する項目数
#define ctype RGB(%1,%2,%3) (($FF & %1)|(($FF & %2) << 8)|(($FF & %3)<<16))
#endif
;=====================================================================
; オーナードロー リストボックス for hsp3.0a
;
; 2006/01/06 ... kz3
;=====================================================================
#include "user32.as"
#include "gdi32.as"
// リストデータの作成
sdim colname, MAXSTRING+1, ITEMNUMBER
colname.0 = "Deep Pink", "Light Coral", "Dark Orange", "Golden Rod"
colname.4 = "Pale Green", "Lawn Green", "Lime Green", "Medium Sea Green"
colname.8 = "Dodger Blue", "Royal Blue", "Slate Blue", "Medium Blue"
colname.12 = "Purple", "Dark Violet", "Copper", "Plum"
dim bgcolor, ITEMNUMBER
bgcolor.0 = RGB(255,20,147), RGB(240,128,128),RGB(255,140,0),RGB(218,165,32)
bgcolor.4 = RGB(152,251,152), RGB(124,252,0),RGB(50,205,50),RGB(60,179,113)
bgcolor.8 = RGB(30,144,255), RGB(65,105,225),RGB(106,90,205),RGB(0,0,205)
bgcolor.12 = RGB(128,0,128), RGB(148,0,211),RGB(191,0,223),RGB(221,160,221)
sdim szItem, MAXSTRING+1
// 320x240 のオーナーウィンドウを作る
screen 0, dspx, dspy, 0, dspx/2-160, dspy/2-120, 320, 240
hOwner = hwnd
cxOwner = ginfo_winx
cyOwner = ginfo_winy
cxList = cxOwner-MARGIN
cyList = cyOwner-MARGIN
syscolor 15: boxf
// リストボックスを作る前に割込み指定
oncmd gosub *On_Command, WM_COMMAND
oncmd gosub *On_MeasureItem, WM_MEASUREITEM
oncmd gosub *On_DrawItem, WM_DRAWITEM
// リストボックス作成
pos MARGIN/2, MARGIN/2
style = WS_CHILD | WS_VISIBLE | WS_VSCROLL
style |= LBS_NOTIFY | LBS_HASSTRINGS | LBS_OWNERDRAWFIXED
winobj "LISTBOX", "", WS_EX_CLIENTEDGE, style, cxList, cyList, IDC_LISTBOX, 0
hList = objinfo(stat,2)
// リストボックスにテキスト追加
sendmsg hList, WM_SETREDRAW, 0, 0
repeat ITEMNUMBER
sendmsg hList, LB_ADDSTRING, cnt, colname.cnt
loop
sendmsg hList, WM_SETREDRAW, 1, 0
stop
*On_MeasureItem
dupptr _mis, lparam, 24, 4
sign = _mis.4
return 1
*On_DrawItem
dupptr _dis, lparam, 48, 4
dup itemID, _dis.2: dup itemAct, _dis.3
dup itemSta, _dis.4: dup hCtrl, _dis.5
dup itemDC, _dis.6
dup rcLeft, _dis.7: dup rcTop, _dis.8
dup rcRight, _dis.9: dup rcBottom, _dis.10
sendmsg hList, LB_GETTEXT, itemID, varptr(szItem)
if itemID\2{
// AliceBlue
CreatePen 0, 0, RGB(240, 248, 255)
hPen = stat
CreateSolidBrush RGB(240, 248 ,255)
hBrush = stat
}else{
// LavenderBlush
CreatePen 0, 0, RGB(255, 240, 245): hPen = stat
CreateSolidBrush RGB(255, 240, 245): hBrush = stat
}
// 背景描画(後始末込み)
SelectObject itemDC, hPen: holdPen = stat
SelectObject itemDC, hBrush: holdBrush = stat
Rectangle itemDC, rcLeft, rcTop, rcRight, rcBottom
SelectObject itemDC, holdBrush
SelectObject itemDC, holdPen
DeleteObject hBrush
DeleteObject hPen
// 選択項目には●マークを描画(左右)
if itemSta & ODS_SELECTED{
CreatePen 0, 0, bgcolor(itemID): hPen = stat
CreateSolidBrush bgcolor(itemID): hBrush = stat
SelectObject itemDC, hPen: holdPen = stat
SelectObject itemDC, hBrush: holdBrush = stat
Ellipse itemDC, rcLeft, rcTop, rcLeft+sign, rcBottom
Ellipse itemDC, rcRight-sign, rcTop, rcRight, rcBottom
SelectObject itemDC, holdBrush
SelectObject itemDC, holdPen
DeleteObject hBrush
DeleteObject hPen
}
// 項目テキストを描画
if(itemID == 0) {
SetTextColor itemDC, RGB(255,20,147)
}
else:if(itemID == 1) {
SetTextColor itemDC, RGB(240,128,128)
}
else:if(itemID == 2) {
SetTextColor itemDC, RGB(255,140,0)
}
else:if(itemID == 3) {
SetTextColor itemDC, RGB(218,165,32)
}
else:if(itemID == 4) {
SetTextColor itemDC, RGB(152,251,152)
}
else:if(itemID == 5) {
SetTextColor itemDC, RGB(124,252,0)
}
else:if(itemID == 6) {
SetTextColor itemDC, RGB(50,205,50)
}
else:if(itemID == 7) {
SetTextColor itemDC, RGB(60,179,113)
}
else:if(itemID == 8) {
SetTextColor itemDC, RGB(30,144,255)
}
else:if(itemID == 9) {
SetTextColor itemDC, RGB(65,105,225)
}
else:if(itemID == 10) {
SetTextColor itemDC, RGB(106,90,205)
}
else:if(itemID == 11) {
SetTextColor itemDC, RGB(0,0,205)
}
else:if(itemID == 12) {
SetTextColor itemDC, RGB(128,0,128)
}
else:if(itemID == 13) {
SetTextColor itemDC, RGB(148,0,211)
}
else:if(itemID == 14) {
SetTextColor itemDC, RGB(191,0,223)
}
else:if(itemID == 15) {
SetTextColor itemDC, RGB(221,160,221)
}
SetBkMode itemDC, TRANSPARENT
rc = rcLeft+sign+1, rcTop, rcRight-signa-1, rcBottom
DrawText itemDC, szItem, -1, varptr(rc), $00008000
return 1
*On_Command
if (wparam & $FFFF) = IDC_LISTBOX{
if (wparam>>16&$FFFF) = LBN_SELCHANGE{
sendmsg hList, LB_GETCURSEL, 0, 0
sel = stat
if sel ! -1{
// 選択項目をタイトルバーに表示
sendmsg hList, LB_GETTEXT, sel, varptr(szItem)
title szItem
// オーナーウィンドウ塗りつぶし
col = bgcolor(sel)
color col&$FF, col>>8&$FF, col>>16&$FF
boxf
}
}
}
return 0

| |
|
2019/12/31(Tue) 15:12:30|NO.89143
ソラさん、返信ありがとうございます。
「listbox」では無理なのですか……残念です。
ソースコードありがとうございます。
実行してみて、確かに文字色は変わっていたのですが、
私は「listbox」のデザイン(選択すると青くなる)のままで、文字色を変えたいです。
選択すると、周りの色が変わったり、●がついてたりは不要です。
どうすればできるのでしょうか?
|
|
2019/12/31(Tue) 15:33:57|NO.89144
ブラシとかペンはあまり使ったことがないので勘ですがこんな感じでしょうか。
まず1つ1つの命令、関数の意味を理解しないとこれを応用して自分のプログラムに組み込むのは難しいと思います。
#ifndef _OWNERDRAW_LISTBOX_SMP1_AS_
#define _OWNERDRAW_LISTBOX_SMP1_AS_
;=====================================================================
; v3_042_OwnerDrawListBox_smp1.hsp 用 ヘッダファイル for hsp3.0a
;
; 2006/01/07
;=====================================================================
// ウィンドウスタイル
#define WS_CHILD $40000000
#define WS_VISIBLE $10000000
#define WS_VSCROLL $00200000
#define WS_EX_CLIENTEDGE $00000200
// リストボックススタイル
#define LBS_NOTIFY $0001
#define LBS_OWNERDRAWFIXED $0010
#define LBS_OWNERDRAWVARIABLE $0020
#define LBS_HASSTRINGS $0040
// ウィンドウメッセージ
#define WM_MEASUREITEM $002C
#define WM_DRAWITEM $002B
#define WM_COMMAND $0111
// リストボックスメッセージ
#define LB_ADDSTRING $0180
#define LB_GETTEXT $0189
#define LB_GETCURSEL $0188
// リストボックス通知コード
#define LBN_ERRSPACE (-2)
#define LBN_SELCHANGE 1
#define LBN_DBLCLK 2
#define LBN_SELCANCEL 3
#define LBN_SETFOCUS 4
#define LBN_KILLFOCUS 5
// DrawEdge 用
#define BDR_RAISEDOUTER $0001 ; 外側凸
#define BDR_SUNKENOUTER $0002 ; 外側凹
#define BDR_RAISEDINNER $0004 ; 内側凸
#define BDR_SUNKENINNER $0008 ; 内側凹
#define BDR_SUNKEN (BDR_SUNKENOUTER | BDR_SUNKENINNER)
#define BF_RECT $000F ; 四辺
// hspマクロの短縮
#define dspx ginfo_dispx ; ディスプレイ幅
#define dspy ginfo_dispy ; ディスプレイ高さ
#define winx ginfo_winx ; クライアント幅
#define winy ginfo_winy ; クライアント高さ
// Owner Draw Status
#define ODS_SELECTED $0001 ; 選択
#define ODS_DISABLED $0004
#define ODS_FOCUS $0010 ; フォーカス
// Owner Draw Action
#define ODA_DRAWENTIRE $0001 ; コントロール全体の描画要求
#define ODA_SELECT $0002 ; アイテムの選択状態の変更通知
#define ODA_FOCUS $0004 ; コントロールフォーカスの変更通知
// SetBkMode()
#define TRANSPARENT 1 ; 背景残し
// サンプル用定数
#define MARGIN 50 ; 余白
#define IDC_LISTBOX $4000 ; リストボックスID
#define MAXSTRING 255 ; 項目の最大バイト数
#define ITEMNUMBER 16 ; リストに表示する項目数
#define ctype RGB(%1,%2,%3) (($FF & %1)|(($FF & %2) << 8)|(($FF & %3)<<16))
#endif
;=====================================================================
; オーナードロー リストボックス for hsp3.0a
;
; 2006/01/06 ... kz3
;=====================================================================
#include "user32.as"
#include "gdi32.as"
// リストデータの作成
sdim colname, MAXSTRING+1, ITEMNUMBER
colname.0 = "Deep Pink", "Light Coral", "Dark Orange", "Golden Rod"
colname.4 = "Pale Green", "Lawn Green", "Lime Green", "Medium Sea Green"
colname.8 = "Dodger Blue", "Royal Blue", "Slate Blue", "Medium Blue"
colname.12 = "Purple", "Dark Violet", "Copper", "Plum"
dim bgcolor, ITEMNUMBER
bgcolor.0 = RGB(255,20,147), RGB(240,128,128),RGB(255,140,0),RGB(218,165,32)
bgcolor.4 = RGB(152,251,152), RGB(124,252,0),RGB(50,205,50),RGB(60,179,113)
bgcolor.8 = RGB(30,144,255), RGB(65,105,225),RGB(106,90,205),RGB(0,0,205)
bgcolor.12 = RGB(128,0,128), RGB(148,0,211),RGB(191,0,223),RGB(221,160,221)
sdim szItem, MAXSTRING+1
// 320x240 のオーナーウィンドウを作る
screen 0, dspx, dspy, 0, dspx/2-160, dspy/2-120, 320, 240
hOwner = hwnd
cxOwner = ginfo_winx
cyOwner = ginfo_winy
cxList = cxOwner-MARGIN
cyList = cyOwner-MARGIN
syscolor 15: boxf
// リストボックスを作る前に割込み指定
oncmd gosub *On_Command, WM_COMMAND
oncmd gosub *On_MeasureItem, WM_MEASUREITEM
oncmd gosub *On_DrawItem, WM_DRAWITEM
// リストボックス作成
pos MARGIN/2, MARGIN/2
style = WS_CHILD | WS_VISIBLE | WS_VSCROLL
style |= LBS_NOTIFY | LBS_HASSTRINGS | LBS_OWNERDRAWFIXED
winobj "LISTBOX", "", WS_EX_CLIENTEDGE, style, cxList, cyList, IDC_LISTBOX, 0
hList = objinfo(stat,2)
// リストボックスにテキスト追加
sendmsg hList, WM_SETREDRAW, 0, 0
repeat ITEMNUMBER
sendmsg hList, LB_ADDSTRING, cnt, colname.cnt
loop
sendmsg hList, WM_SETREDRAW, 1, 0
stop
*On_MeasureItem
dupptr _mis, lparam, 24, 4
sign = _mis.4
return 1
*On_DrawItem
dupptr _dis, lparam, 48, 4
dup itemID, _dis.2: dup itemAct, _dis.3
dup itemSta, _dis.4: dup hCtrl, _dis.5
dup itemDC, _dis.6
dup rcLeft, _dis.7: dup rcTop, _dis.8
dup rcRight, _dis.9: dup rcBottom, _dis.10
sendmsg hList, LB_GETTEXT, itemID, varptr(szItem)
//背景色の設定
if itemSta & ODS_SELECTED {//選択項目には別の色を描画
CreatePen 0, 0, RGB(0,0,255):hPen = stat
CreateSolidBrush RGB(0,0,255):hBrush = stat
}else{//未選択の項目は交互に適当に色を設定
if itemID\2{
// AliceBlue
CreatePen 0, 0, RGB(240, 248, 255):hPen = stat
CreateSolidBrush RGB(240, 248 ,255):hBrush = stat
}else{
// LavenderBlush
CreatePen 0, 0, RGB(255, 240, 245): hPen = stat
CreateSolidBrush RGB(255, 240, 245): hBrush = stat
}
}
// 背景描画(後始末込み)
SelectObject itemDC, hPen: holdPen = stat
SelectObject itemDC, hBrush: holdBrush = stat
Rectangle itemDC, rcLeft, rcTop, rcRight, rcBottom
SelectObject itemDC, holdBrush
SelectObject itemDC, holdPen
DeleteObject hBrush
DeleteObject hPen
//●の描画は無効にする。
// 選択項目には●マークを描画(左右)
/*
if itemSta & ODS_SELECTED {
CreatePen 0, 0, bgcolor(itemID): hPen = stat
CreateSolidBrush bgcolor(itemID): hBrush = stat
SelectObject itemDC, hPen: holdPen = stat
SelectObject itemDC, hBrush: holdBrush = stat
Ellipse itemDC, rcLeft, rcTop, rcLeft+sign, rcBottom
Ellipse itemDC, rcRight-sign, rcTop, rcRight, rcBottom
SelectObject itemDC, holdBrush
SelectObject itemDC, holdPen
DeleteObject hBrush
DeleteObject hPen
}*/
// 項目テキストを描画
if(itemID == 0) {
SetTextColor itemDC, RGB(255,20,147)
}
else:if(itemID == 1) {
SetTextColor itemDC, RGB(240,128,128)
}
else:if(itemID == 2) {
SetTextColor itemDC, RGB(255,140,0)
}
else:if(itemID == 3) {
SetTextColor itemDC, RGB(218,165,32)
}
else:if(itemID == 4) {
SetTextColor itemDC, RGB(152,251,152)
}
else:if(itemID == 5) {
SetTextColor itemDC, RGB(124,252,0)
}
else:if(itemID == 6) {
SetTextColor itemDC, RGB(50,205,50)
}
else:if(itemID == 7) {
SetTextColor itemDC, RGB(60,179,113)
}
else:if(itemID == 8) {
SetTextColor itemDC, RGB(30,144,255)
}
else:if(itemID == 9) {
SetTextColor itemDC, RGB(65,105,225)
}
else:if(itemID == 10) {
SetTextColor itemDC, RGB(106,90,205)
}
else:if(itemID == 11) {
SetTextColor itemDC, RGB(0,0,205)
}
else:if(itemID == 12) {
SetTextColor itemDC, RGB(128,0,128)
}
else:if(itemID == 13) {
SetTextColor itemDC, RGB(148,0,211)
}
else:if(itemID == 14) {
SetTextColor itemDC, RGB(191,0,223)
}
else:if(itemID == 15) {
SetTextColor itemDC, RGB(221,160,221)
}
SetBkMode itemDC, TRANSPARENT
rc = rcLeft+sign+1, rcTop, rcRight-signa-1, rcBottom
DrawText itemDC, szItem, -1, varptr(rc), $00008000
return 1
*On_Command
if (wparam & $FFFF) = IDC_LISTBOX{
if (wparam>>16&$FFFF) = LBN_SELCHANGE{
sendmsg hList, LB_GETCURSEL, 0, 0
sel = stat
if sel ! -1{
// 選択項目をタイトルバーに表示
sendmsg hList, LB_GETTEXT, sel, varptr(szItem)
title szItem
//周りの色はここで変更されてるのでこれを無効に
// オーナーウィンドウ塗りつぶし
/*
col = bgcolor(sel)
color col&$FF, col>>8&$FF, col>>16&$FF
boxf
*/
}
}
}
return 0

| |
|
2019/12/31(Tue) 21:46:38|NO.89145
ありがとうございました!
今の知識では理解するのは無理そうなので、もっとHSPを勉強したいと思います。
|
|