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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1230
こいるリストボックスで項目ごとに文字色を変える方法6解決


こいる

リンク

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を勉強したいと思います。



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