;=====================================================================
;	オーナードロー リストボックス						for hsp3.0a
;
;	2006/01/06 ... kz3
;=====================================================================
#include "user32.as"
#include "gdi32.as"

// このサンプル用のヘッダファイル
#include "v3_042_OwnerDrawListBox_smp1.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
	}

	// 項目テキストを描画
	SetTextColor itemDC, RGB(0,0,0)
	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