.. index:: 
	single: libui; はじめに

===================
RingLibUI 拡張機能
===================

この章では RingLibUI 拡張機能の用法を解説します。

この拡張機能は Libui の全機能を扱えます。

この拡張機能は Ring による軽量 GUI アプリケーションの開発と配布で使えます (1 MB 以下)。

ランタイムファイルとファイルサイズ (Ring 1.14)

* Ring.dll (448 KB)
* Libui.dll (210 KB)
* Ring_Libui.dll (633 KB)
* 圧縮前のファイル            - 合計 : 1,291 KB
* 圧縮後のファイル (ZIP 形式) - 合計 :   504 KB


.. index:: 
	pair: libui; Hello World

Hello World
===========

.. code-block:: ring

	load "libui.ring"

	oWindow = uiNewWindow( "Hello, World", 400, 400, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	btn1 = uiNewButton("SayHello")
	uiButtonOnClicked(btn1,"sayHello()")

	btn2 = uiNewButton("Close")
	uiButtonOnClicked(btn2,"closeApp()")

	g = uiNewGrid() uiGridSetPadded(g, 1) uiWindowSetChild(oWindow, g)
	uiGridAppend(g, btn1, 0, 0, 2, 1, 1, uiAlignFill, 0, uiAlignFill)
	uiGridAppend(g, btn2, 0, 1, 1, 1, 1, uiAlignFill, 0, uiAlignFill)

	uiControlShow( oWindow )
	uiMain()

	func sayHello 
		uiMsgBox(oWindow,"Hi","Hello")

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_1.png
	:alt: RingLibui スクリーンショット

.. image:: libui_2.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; あいさつをする

あいさつをする
==============

.. code-block:: ring

	load "libui.ring"

	oWindow = uiNewWindow( "Say Hello", 500, 80, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	lbl1 = uiNewLabel("Name: ")
	text1 = uiNewEntry()

	btn1 = uiNewButton("SayHello")
	uiButtonOnClicked(btn1,"sayHello()")

	btn2 = uiNewButton("Close")
	uiButtonOnClicked(btn2,"closeApp()")

	lbl2 = uiNewLabel("")

	g = uiNewGrid() uiGridSetPadded(g, 1) uiWindowSetChild(oWindow, g)
	uiGridAppend(g, lbl1, 0, 0, 2, 1, 1, uiAlignCenter, 0, uiAlignCenter)
	uiGridAppend(g, text1, 1, 0, 2, 1, 1, uiAlignFill, 0, uiAlignFill)
	uiGridAppend(g, btn1, 0, 1, 1, 2, 1, uiAlignFill, 0, uiAlignFill)
	uiGridAppend(g, btn2, 2, 1, 1, 1, 1, uiAlignFill, 0, uiAlignFill)
	uiGridAppend(g, lbl2, 0, 3, 2, 1, 1, uiAlignCenter, 0, uiAlignCenter)

	uiControlShow( oWindow )
	uiMain()

	func sayHello 
		uiLabelSetText(lbl2,"Hello " + uiEntryText(text1))

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_3.png
	:alt: RingLibui スクリーンショット

.. image:: libui_4.png
	:alt: RingLibui スクリーンショット

.. image:: libui_5.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; コントロールの見本帳

コントロールの見本帳
====================

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	# グローバル変数

		slider = NULL	
		spinbox = NULL
		pBar = NULL
		entryOpen = NULL
		entrySave = NULL

	# メインウィンドウ

		mainwin = uiNewWindow("libui Control Gallery", 640, 480, 1)
		uiWindowOnClosing(mainwin, "onClosing()")

		tab = uiNewTab()
		uiWindowSetChild(mainwin, tab)
		uiWindowSetMargined(mainwin, 1)

		uiTabAppend(tab, "Basic Controls", makeBasicControlsPage())
		uiTabSetMargined(tab, 0, 1)

		uiTabAppend(tab, "Numbers and Lists", makeNumbersPage())
		uiTabSetMargined(tab, 1, 1)

		uiTabAppend(tab, "Data Choosers", makeDataChoosersPage())
		uiTabSetMargined(tab, 2, 1)

		uiControlShow(mainwin)
		uiMain()

	func onClosing
		uiQuit()

	func makeDataChoosersPage 

		hbox = uiNewHorizontalBox()
		uiBoxSetPadded(hbox, 1)

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiBoxAppend(hbox, vbox, 0)

		uiBoxAppend(vbox,
			uiNewDatePicker(),
			0)
		uiBoxAppend(vbox,
			uiNewTimePicker(),
			0)
		uiBoxAppend(vbox,
			uiNewDateTimePicker(),
			0)

		uiBoxAppend(vbox,
			uiNewFontButton(),
			0)
		uiBoxAppend(vbox,
			uiNewColorButton(),
			0)

		uiBoxAppend(hbox,
			uiNewVerticalSeparator(),
			0)

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiBoxAppend(hbox, vbox, 1)

		grid = uiNewGrid()
		uiGridSetPadded(grid, 1)
		uiBoxAppend(vbox, grid, 0)

		button = uiNewButton("Open File")
		entryOpen = uiNewEntry()
		uiEntrySetReadOnly(entryOpen, 1)
		uiButtonOnClicked(button, "onOpenFileClicked()")
		uiGridAppend(grid, button,
			0, 0, 1, 1,
			0, uiAlignFill, 0, uiAlignFill)
		uiGridAppend(grid, entryOpen,
			1, 0, 1, 1,
			1, uiAlignFill, 0, uiAlignFill)

		button = uiNewButton("Save File")
		entrySave = uiNewEntry()
		uiEntrySetReadOnly(entrySave, 1)
		uiButtonOnClicked(button, "onSaveFileClicked()")
		uiGridAppend(grid, button,
			0, 1, 1, 1,
			0, uiAlignFill, 0, uiAlignFill)
		uiGridAppend(grid, entrySave,
			1, 1, 1, 1,
			1, uiAlignFill, 0, uiAlignFill)

		msggrid = uiNewGrid()
		uiGridSetPadded(msggrid, 1)
		uiGridAppend(grid, msggrid,
			0, 2, 2, 1,
			0, uiAlignCenter, 0, uiAlignStart)

		button = uiNewButton("Message Box")
		uiButtonOnClicked(button, "onMsgBoxClicked()")
		uiGridAppend(msggrid, button,
			0, 0, 1, 1,
			0, uiAlignFill, 0, uiAlignFill)
		button = uiNewButton("Error Box")
		uiButtonOnClicked(button, "onMsgBoxErrorClicked()")
		uiGridAppend(msggrid, button,
			1, 0, 1, 1,
			0, uiAlignFill, 0, uiAlignFill)

		return hbox

	func makeNumbersPage

		hbox = uiNewHorizontalBox()
		uiBoxSetPadded(hbox, 1)

		group = uiNewGroup("Numbers")
		uiGroupSetMargined(group, 1)
		uiBoxAppend(hbox, group, 1)

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiGroupSetChild(group, vbox)

		spinbox = uiNewSpinbox(0, 100)
		slider = uiNewSlider(0, 100)
		pbar = uiNewProgressBar()
		uiSpinboxOnChanged(spinbox, "onSpinboxChanged()")
		uiSliderOnChanged(slider, "onSliderChanged()")
		uiBoxAppend(vbox, spinbox, 0)
		uiBoxAppend(vbox, slider, 0)
		uiBoxAppend(vbox, pbar, 0)

		ip = uiNewProgressBar()
		uiProgressBarSetValue(ip, -1)
		uiBoxAppend(vbox, ip, 0)

		group = uiNewGroup("Lists")
		uiGroupSetMargined(group, 1)
		uiBoxAppend(hbox, group, 1)

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiGroupSetChild(group, vbox)

		cbox = uiNewCombobox()
		uiComboboxAppend(cbox, "Combobox Item 1")
		uiComboboxAppend(cbox, "Combobox Item 2")
		uiComboboxAppend(cbox, "Combobox Item 3")
		uiBoxAppend(vbox, cbox, 0)

		ecbox = uiNewEditableCombobox()
		uiEditableComboboxAppend(ecbox, "Editable Item 1")
		uiEditableComboboxAppend(ecbox, "Editable Item 2")
		uiEditableComboboxAppend(ecbox, "Editable Item 3")
		uiBoxAppend(vbox, ecbox, 0)

		rb = uiNewRadioButtons()
		uiRadioButtonsAppend(rb, "Radio Button 1")
		uiRadioButtonsAppend(rb, "Radio Button 2")
		uiRadioButtonsAppend(rb, "Radio Button 3")
		uiBoxAppend(vbox, rb, 0)

		return hbox


	func makeBasicControlsPage

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)

		hbox = uiNewHorizontalBox()
		uiBoxSetPadded(hbox, 1)
		uiBoxAppend(vbox, hbox, 0)

		uiBoxAppend(hbox,
			uiNewButton("Button"),
			0)
		uiBoxAppend(hbox,
			uiNewCheckbox("Checkbox"),
			0)

		uiBoxAppend(vbox,
			uiNewLabel("This is a label. Right now, labels can only span one line."),
			0)

		uiBoxAppend(vbox,
			uiNewHorizontalSeparator(),
			0)

		group = uiNewGroup("Entries")
		uiGroupSetMargined(group, 1)
		uiBoxAppend(vbox, group, 1)

		entryForm = uiNewForm()
		uiFormSetPadded(entryForm, 1)
		uiGroupSetChild(group, entryForm)

		uiFormAppend(entryForm,
			"Entry",
			uiNewEntry(),
			0)
		uiFormAppend(entryForm,
			"Password Entry",
			uiNewPasswordEntry(),
			0)
		uiFormAppend(entryForm,
			"Search Entry",
			uiNewSearchEntry(),
			0)
		uiFormAppend(entryForm,
			"Multiline Entry",
			uiNewMultilineEntry(),
			1)
		uiFormAppend(entryForm,
			"Multiline Entry No Wrap",
			uiNewNonWrappingMultilineEntry(),
			1)

		return vbox


	func onSpinboxChanged
		s = uiEventSpinBox()
		uiSliderSetValue(slider, uiSpinboxValue(s));
		uiProgressBarSetValue(pbar, uiSpinboxValue(s));

	func onSliderChanged
		s = uiEventSlider()
		uiSpinboxSetValue(spinbox, uiSliderValue(s));
		uiProgressBarSetValue(pbar, uiSliderValue(s));


	func onOpenFileClicked
		filename = uiOpenFile(mainwin)
		if ISNULL(filename)
			uiEntrySetText(entryOpen, "(cancelled)")
			return
		ok
		uiEntrySetText(entryOpen, filename)
		uiFreeText(filename)

	func onSaveFileClicked
		filename = uiSaveFile(mainwin)
		if ISNULL(filename)
			uiEntrySetText(entrySave, "(cancelled)")
			return
		ok
		uiEntrySetText(entrySave, filename)
		uiFreeText(filename)

	func onMsgBoxClicked
		uiMsgBox(mainwin,
			"This is a normal message box.",
			"More detailed information can be shown here.")

	func onMsgBoxErrorClicked
		uiMsgBoxError(mainwin,
			"This message box describes an error.",
			"More detailed information can be shown here.")

スクリーンショット:

.. image:: libui_6.png
	:alt: RingLibui スクリーンショット

.. image:: libui_7.png
	:alt: RingLibui スクリーンショット

.. image:: libui_8.png
	:alt: RingLibui スクリーンショット

.. image:: libui_9.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; なにか言ってみる

なにか言ってみる
================

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	w = uiNewWindow("Hello", 320, 240, 0)
	uiWindowSetMargined(w, 1)

	b = uiNewVerticalBox()
	uiBoxSetPadded(b, 1)
	uiWindowSetChild(w, b)

	e = uiNewMultilineEntry()
	uiMultilineEntrySetReadOnly(e, 1)

	btn = uiNewButton("Say Something")
	uiButtonOnClicked(btn, "saySomething()")
	uiBoxAppend(b, btn, 0)

	uiBoxAppend(b, e, 1)

	uiTimer(1000, "sayTime()")

	uiWindowOnClosing(w, "onClosing()")
	uiControlShow(w)
	uiMain()

	func saySomething
		uiMultilineEntryAppend(e, "Saying something"+nl)

	func sayTime 
		uiMultilineEntryAppend(e, Time()+nl)

	func onClosing
		uiQuit()

スクリーンショット:

.. image:: libui_10.png
	:alt: RingLibui スクリーンショット

.. image:: libui_11.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; メニューバーの用法

メニューバーの用法
==================

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	# メニューバーの作成

		fileMenu = uiNewMenu("File")
		newItem = uiMenuAppendItem(fileMenu, "New")
		openItem = uiMenuAppendItem(fileMenu, "Open")
		uiMenuAppendSeparator(fileMenu)
		shouldQuitItem = uiMenuAppendCheckItem(fileMenu, "Should Quit")
		quitItem = uiMenuAppendQuitItem(fileMenu)
		
		editMenu = uiNewMenu("Edit")
		undoItem = uiMenuAppendItem(editMenu, "Undo")
		uiMenuItemDisable(undoItem)
		uiMenuAppendSeparator(editMenu)
		checkItem = uiMenuAppendCheckItem(editMenu, "Check Me\tTest")
		accelItem = uiMenuAppendItem(editMenu, "A&ccele&&rator T_es__t")
		prefsItem = uiMenuAppendPreferencesItem(editMenu)
		
		testMenu = uiNewMenu("Test")
		enabledItem = uiMenuAppendCheckItem(testMenu, "Enable Below Item")
		uiMenuItemSetChecked(enabledItem, 1)
		enableThisItem = uiMenuAppendItem(testMenu, "This Will Be Enabled")
		uiMenuItemOnClicked(enabledItem, "enableItemTest(enableThisItem)")
		forceCheckedItem = uiMenuAppendItem(testMenu, "Force Above Checked")
		uiMenuItemOnClicked(forceCheckedItem, "forceOn()")
		forceUncheckedItem = uiMenuAppendItem(testMenu, "Force Above Unchecked")
		uiMenuItemOnClicked(forceUncheckedItem, "forceOff()")
		uiMenuAppendSeparator(testMenu)
		whatWindowItem = uiMenuAppendItem(testMenu, "What Window?")
		uiMenuItemOnClicked(whatWindowItem, "whatWindow()")
		
		moreTestsMenu = uiNewMenu("More Tests")
		quitEnabledItem = uiMenuAppendCheckItem(moreTestsMenu, "Quit Item Enabled")
		uiMenuItemSetChecked(quitEnabledItem, 1)
		prefsEnabledItem = uiMenuAppendCheckItem(moreTestsMenu, "Preferences Item Enabled")
		uiMenuItemSetChecked(prefsEnabledItem, 1)
		aboutEnabledItem = uiMenuAppendCheckItem(moreTestsMenu, "About Item Enabled")
		uiMenuItemSetChecked(aboutEnabledItem, 1)
		uiMenuAppendSeparator(moreTestsMenu)
		checkEnabledItem = uiMenuAppendCheckItem(moreTestsMenu, "Check Me Item Enabled")
		uiMenuItemSetChecked(checkEnabledItem, 1)
		
		multiMenu = uiNewMenu("Multi")
		uiMenuAppendSeparator(multiMenu)
		uiMenuAppendSeparator(multiMenu)
		uiMenuAppendItem(multiMenu, "Item && Item && Item")
		uiMenuAppendSeparator(multiMenu)
		uiMenuAppendSeparator(multiMenu)
		uiMenuAppendItem(multiMenu, "Item __ Item __ Item")
		uiMenuAppendSeparator(multiMenu)
		uiMenuAppendSeparator(multiMenu)
		
		helpMenu = uiNewMenu("Help")
		helpItem = uiMenuAppendItem(helpMenu, "Help")
		aboutItem = uiMenuAppendAboutItem(helpMenu)
		
		uiMenuItemOnClicked(quitEnabledItem, "enableItemTest(quitItem)")
		uiMenuItemOnClicked(prefsEnabledItem, "enableItemTest(prefsItem)")
		uiMenuItemOnClicked(aboutEnabledItem, "enableItemTest(aboutItem)")
		uiMenuItemOnClicked(checkEnabledItem, "enableItemTest(checkItem)")

	# ウィンドウの作成
		
		oWindow = uiNewWindow( "Using the Menubar", 400, 400, True)
		uiWindowOnClosing(oWindow,"closeApp()")
		
		uiControlShow( oWindow )
		uiMain()
		
	func enableItemTest(data)
		item = uiEventMenuItem()
		if uiMenuItemChecked(item)
			uiMenuItemEnable(data)
		else
			uiMenuItemDisable(data)
		ok

	func forceOn
		uiMenuItemSetChecked(enabledItem, 1)

	func forceOff
		uiMenuItemSetChecked(enabledItem, 0)

	func whatWindow
		? "menu item clicked on window " 
		? oWindow

	func closeApp
		uiQuit()


スクリーンショット:

.. image:: libui_12.png
	:alt: RingLibui スクリーンショット

.. image:: libui_13.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; サンプル集の描画

サンプル集の描画
================

.. code-block:: ring

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 420, 450, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		Rectangle(0, 0, uiEventAreaWidth(), uiEventAreaHeight(), colorGray)
		Rectangle(0, 0, 400, 400, colorWhite)
		Rectangle(10, 10, 20, 20, colorRed)
		Rectangle(30, 30, 30, 30, colorGreen)
		Rectangle(60, 60, 40, 40, colorBlue)

	# Rectangle 関数は RingLibUI の uiRectangle() 関数に相当します。
	func Rectangle x,y,width,height,color
		oContext = uiEventContext()
		oBrush = uiNewSolidBrush(color)	
		oPath = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathAddRectangle(oPath, x, y, width, height)
		uiDrawPathEnd(oPath)
		uiDrawFill(oContext, oPath, oBrush)
		uiDrawFreePath(oPath)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_21.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; グラデーションの描画

グラデーションの描画
====================

.. code-block:: ring

	load "libui.ring"

	oWindow = uiNewWindow( "Draw Gradient", 500, 500, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()
		uiRectangle(0, 0, nWidth, nHeight, colorBlue)
		for y=0 to 255 step 2
			customColor = y
			uiRectangle(0, y, nWidth, y+1, customColor)
		next

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_22.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; ヒストグラム

ヒストグラム
============

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	datapoints	= list(10)
	currentPoint	= -1

	// メートル換算
	xoffLeft	= 20			/* ヒストグラムの余白 */
	yoffTop		= 20
	xoffRight	= 20
	yoffBottom	= 20
	pointRadius	= 5

	histogram	= NULL
	mainwin		= NULL
	colorButton	= NULL

	func pointLocations width, height, xs, ys
		xincr = width / 9		// 処理後に最終地点を 10 - 1 します
		yincr = height / 100
		for i = 1 to 10
			// 点の値を取得
			n = uiSpinboxValue(datapoints[i])
			// y=0 は上部ですが n=0 は下部であるため、反転処理が必要です。
			n = 100 - n;
			xs[i] = xincr * i
			ys[i] = yincr * n
		next

	func constructGraph width, height, extend
		xs = list(10)
		ys = list(10)
		pointLocations(width, height, xs, ys)
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, xs[1], ys[1])
		for i = 2 to 10
			uiDrawPathLineTo(path, xs[i], ys[i])
		next
		if extend
			uiDrawPathLineTo(path, width, height)
			uiDrawPathLineTo(path, 0, height)
			uiDrawPathCloseFigure(path)
		ok
		uiDrawPathEnd(path)
		return path


	func graphSize clientWidth, clientHeight
		graphWidth = clientWidth - xoffLeft - xoffRight
		graphHeight = clientHeight - yoffTop - yoffBottom
		return [graphWidth,graphHeight]

	func handlerDraw
		// 白色で領域を塗りつぶす
		Brush = uiNewSolidBrush(0)	
		setSolidBrush(brush, colorWhite, 1.0)
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathAddRectangle(path, 0, 0, uiEventAreaWidth(), uiEventAreaHeight())
		uiDrawPathEnd(path)
		uiDrawFill(uiEventContext(), path, brush)
		uiDrawFreePath(path)

		// 寸法の解決
		aOut = graphSize(uiEventAreaWidth(), uiEventAreaHeight())
		graphWidth = aOut[1]
		graphHeight = aOut[2]

		sp = new_managed_uiDrawStrokeParams()
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)
		set_uiDrawStrokeParams_Thickness(sp,2)
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)

		// 軸の描画
		setSolidBrush(brush, colorBlack, 1.0)
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path,
			xoffLeft, yoffTop)
		uiDrawPathLineTo(path,
			xoffLeft, yoffTop + graphHeight)
		uiDrawPathLineTo(path,
			xoffLeft + graphWidth, yoffTop + graphHeight)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, brush, sp)
		uiDrawFreePath(path)

		// 座標空間 (0, 0) はグラフの左上角へ変換します
		m = new_managed_uiDrawMatrix()
		uiDrawMatrixSetIdentity(m)
		uiDrawMatrixTranslate(m, xoffLeft, yoffTop)
		uiDrawTransform(uiEventContext(), m)

		// グラフの色を取得してブラシの設定を行います

		GraphR=0
		GraphG=0
		GraphB=0
		GraphA=0

		uiColorButtonColor(colorButton, :graphR,
			 :graphG, 
			 :graphB, 
			 :graphA)

		uiSetBrushType(brush,uiDrawBrushTypeSolid)
		uiSetBrushR(brush,graphR)
		uiSetBrushG(brush,graphG)
		uiSetBrushB(brush,graphB)

		// 以降の brush->A は塗りつぶしとストロークの値が異なる設定となります

		// 以降のグラフの線はグラフを塗りつぶしたものを作成します
		path = constructGraph(graphWidth, graphHeight, 1)

	  uiSetBrushA(brush, graphA / 2)
		uiDrawFill(uiEventContext(), path, brush)
		uiDrawFreePath(path)

		// ヒストグラムの線描
		path = constructGraph(graphWidth, graphHeight, 0)
		uiSetBrushA(brush,graphA)
		uiDrawStroke(uiEventContext(), path, brush, sp)
		uiDrawFreePath(path)

		// 描画先の点はカーソルと対応します。
		if currentPoint != -1
			xs = list(10)
			ys = list(10)
			pointLocations(graphWidth, graphHeight, xs, ys)
			path = uiDrawNewPath(uiDrawFillModeWinding)

			uiDrawPathNewFigureWithArc(path,
				xs[currentPoint], ys[currentPoint],
				pointRadius,
				0, 6.23,		// TODO: 円周率π
				0)
			uiDrawPathEnd(path)
			// ヒストグラムの線描に同じブラシを使います
			uiDrawFill(uiEventContext(), path, brush)
			uiDrawFreePath(path)
		ok

	func inPoint x, y, xtest, ytest
		// TODO: 変更に行列を使う
		x -= xoffLeft
		y -= yoffTop
		return (x >= xtest - pointRadius) &&
			(x <= xtest + pointRadius) &&
			(y >= ytest - pointRadius) &&
			(y <= ytest + pointRadius)

	func handlerMouseEvent
		xs = list(10)
		ys = list(10)

		aOut = graphSize(uiEventAreaWidth(), uiEventAreaHeight())
		graphWidth = aOut[1]
		graphHeight = aOut[2]

		pointLocations(graphWidth, graphHeight, xs, ys)

		e = uiEventAreaMouseEvent()
		eX = get_uiAreaMouseEvent_X(e)
		eY = get_uiAreaMouseEvent_Y(e)
		for i=1 to 10
			if inPoint(eX, eY, xs[i], ys[i])
				exit 
			ok
		next
		if i = 11		// 点ではありません
			i = -1
		ok

		currentPoint = i

		uiAreaQueueRedrawAll(histogram)

	func onDatapointChanged
		uiAreaQueueRedrawAll(histogram)

	func onColorChanged
		uiAreaQueueRedrawAll(histogram);

	func onClosing
		uiControlDestroy(uiControl(mainwin))
		uiQuit()
		return 0

	func shouldQuit
		uiControlDestroy(uiControl(mainwin))

	func main

		uiOnShouldQuit("shouldQuit()")

		mainwin = uiNewWindow("Histogram Sample", 800, 480, 1)
		uiWindowSetMargined(mainwin, 1)
		uiWindowOnClosing(mainwin, "onClosing()")

		Brush = uiNewSolidBrush(0)	

		hbox = uiNewHorizontalBox()
		uiBoxSetPadded(hbox, 1)
		uiWindowSetChild(mainwin, uiControl(hbox))

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiBoxAppend(hbox, uiControl(vbox), 0)

		srandom(clock());
		for i=1 to 10
			datapoints[i] = uiNewSpinbox(0, 100)
			uiSpinboxSetValue(datapoints[i], random() % 101)
			uiSpinboxOnChanged(datapoints[i], "onDatapointChanged()")
			uiBoxAppend(vbox, uiControl(datapoints[i]), 0)
		next

		colorButton = uiNewColorButton()

		setSolidBrush(brush, colorDodgerBlue, 1.0)

		uiColorButtonSetColor(colorButton,
			uiBrushR(brush),
			uiBrushG(brush),
			uiBrushB(brush),
			uiBrushA(brush))

		uiColorButtonOnChanged(colorButton, "onColorChanged()")
		uiBoxAppend(vbox, uiControl(colorButton), 0)

		oAreaHandler = uiNewAreaHandler("handlerDraw()","handlerMouseEvent()","","","")
		histogram = uiNewArea(oAreaHandler)
		uiBoxAppend(hbox, uiControl(histogram), 1)

		uiControlShow(uiControl(mainwin))
		uiMain()

スクリーンショット:

.. image:: libui_14.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; テキストの描画

テキストの描画
==============

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	# グローバル変数
		mainwin		= NULL
		area		= NULL
		handler		= NULL
		fontButton	= NULL
		alignment	= NULL
		attrstr		= NULL

	func appendWithAttribute what, attr, attr2
		nStart = uiAttributedStringLen(attrstr)
		nEnd = nStart + len(what)
		uiAttributedStringAppendUnattributed(attrstr, what)
		uiAttributedStringSetAttribute(attrstr, attr, nStart, nEnd)
		if ! ISNULL(attr2)
			uiAttributedStringSetAttribute(attrstr, attr2, nStart, nEnd)
		ok

	func makeAttributedString

		attrstr = uiNewAttributedString("Drawing strings with libui is done with the uiAttributedString and uiDrawTextLayout objects."+nl+
			"uiAttributedString lets you have a variety of attributes: ")

		attr = uiNewFamilyAttribute("Courier New")
		appendWithAttribute("font family", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewSizeAttribute(18)
		appendWithAttribute("font size", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewWeightAttribute(uiTextWeightBold)
		appendWithAttribute("font weight", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewItalicAttribute(uiTextItalicItalic)
		appendWithAttribute("font italicness", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewStretchAttribute(uiTextStretchCondensed)
		appendWithAttribute("font stretch", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewColorAttribute(0.75, 0.25, 0.5, 0.75)
		appendWithAttribute("text color", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		attr = uiNewBackgroundAttribute(0.5, 0.5, 0.25, 0.5)
		appendWithAttribute("text background color", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")


		attr = uiNewUnderlineAttribute(uiUnderlineSingle)
		appendWithAttribute("underline style", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, ", ")

		uiAttributedStringAppendUnattributed(attrstr, "and ")
		attr = uiNewUnderlineAttribute(uiUnderlineDouble)
		attr2 = uiNewUnderlineColorAttribute(uiUnderlineColorCustom, 1.0, 0.0, 0.5, 1.0)
		appendWithAttribute("underline color", attr, attr2)
		uiAttributedStringAppendUnattributed(attrstr, ". ")

		uiAttributedStringAppendUnattributed(attrstr, "Furthermore, there are attributes allowing for ")
		attr = uiNewUnderlineAttribute(uiUnderlineSuggestion)
		attr2 = uiNewUnderlineColorAttribute(uiUnderlineColorSpelling, 0, 0, 0, 0)
		appendWithAttribute("special underlines for indicating spelling errors", attr, attr2)
		uiAttributedStringAppendUnattributed(attrstr, " (and other types of errors) ")

		uiAttributedStringAppendUnattributed(attrstr, "and control over OpenType features such as ligatures (for instance, ")
		otf = uiNewOpenTypeFeatures()
		uiOpenTypeFeaturesAdd(otf, ASCII('l'), ASCII('i'), ASCII('g'), ASCII('a'), 0)
		attr = uiNewFeaturesAttribute(otf)
		appendWithAttribute("afford", attr, NULL)
		uiAttributedStringAppendUnattributed(attrstr, " vs. ")
		uiOpenTypeFeaturesAdd(otf, ASCII('l'), ASCII('i'), ASCII('g'), ASCII('a'), 1)
		attr = uiNewFeaturesAttribute(otf)
		appendWithAttribute("afford", attr, NULL)
		uiFreeOpenTypeFeatures(otf)
		uiAttributedStringAppendUnattributed(attrstr, ").\n")

		uiAttributedStringAppendUnattributed(attrstr, "Use the controls opposite to the text to control properties of the text.")

	func handlerDraw

		defaultfont = new_uiFontDescriptor()
		params = new_uiDrawTextLayoutParams()

		set_uiDrawTextLayoutParams_String(params,attrstr)
		uiFontButtonFont(fontButton, defaultFont)
		set_uiDrawTextLayoutParams_DefaultFont(params,defaultFont)
		set_uiDrawTextLayoutParams_Width(params,uiEventAreaWidth())
		set_uiDrawTextLayoutParams_Align(params,uiComboboxSelected(alignment))
		textLayout = uiDrawNewTextLayout(params)
		uiDrawText(uiEventContext(), textLayout, 0, 0)
		uiDrawFreeTextLayout(textLayout)
		uiFreeFontButtonFont(defaultFont)

	func onFontChanged
		uiAreaQueueRedrawAll(area)

	func onComboboxSelected
		uiAreaQueueRedrawAll(area)

	func onClosing
		uiControlDestroy(mainwin)
		uiQuit()

	func shouldQuit
		uiControlDestroy(mainwin)

	func main

		uiOnShouldQuit("shouldQuit()")

		makeAttributedString()

		mainwin = uiNewWindow("libui Text-Drawing Example", 640, 480, 1)
		uiWindowSetMargined(mainwin, 1)
		uiWindowOnClosing(mainwin, "onClosing()")

		hbox = uiNewHorizontalBox()
		uiBoxSetPadded(hbox, 1)
		uiWindowSetChild(mainwin, hbox)

		vbox = uiNewVerticalBox()
		uiBoxSetPadded(vbox, 1)
		uiBoxAppend(hbox, vbox, 0)

		fontButton = uiNewFontButton()
		uiFontButtonOnChanged(fontButton, "onFontChanged()")
		uiBoxAppend(vbox, fontButton, 0)

		form = uiNewForm()
		uiFormSetPadded(form, 1)
		uiBoxAppend(vbox, form, 0)

		alignment = uiNewCombobox()
		uiComboboxAppend(alignment, "Left")
		uiComboboxAppend(alignment, "Center")
		uiComboboxAppend(alignment, "Right")
		uiComboboxSetSelected(alignment, 0)		//左列から開始
		uiComboboxOnSelected(alignment, "onComboboxSelected()")
		uiFormAppend(form, "Alignment", alignment, 0)

		oAreaHandler = uiNewAreaHandler("handlerDraw()","","","","")
		area = uiNewArea(oAreaHandler)
		uiBoxAppend(hbox, area, 1)

		uiControlShow(mainwin)
		uiMain()
		uiFreeAttributedString(attrstr)

スクリーンショット:

.. image:: libui_15.png
	:alt: RingLibui スクリーンショット

.. image:: libui_16.png
	:alt: RingLibui スクリーンショット

.. image:: libui_17.png
	:alt: RingLibui スクリーンショット

.. index:: 
	pair: libui; 追加サンプル集の描画

追加サンプル集の描画
====================

用例 (1):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 400, 400, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()
		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()
		source = uiNewSolidBrush(colorBlue)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	
		set_uiDrawStrokeParams_Thickness(sp,40.96)	

		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 76.8, 84.48)
		uiDrawPathLineTo(path, 76.8 + 51.2, 84.48 -51.2)
		uiDrawPathLineTo(path, 76.8 + 51.2 + 51.2, 84.48 - 51.2 + 51.2)
		uiDrawPathEnd(path)
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 76.8, 161.28)
		uiDrawPathLineTo(path, 76.8 + 51.2, 161.28 -51.2)
		uiDrawPathLineTo(path, 76.8 + 51.2 + 51.2, 161.28 - 51.2 + 51.2)
		uiDrawPathEnd(path)
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinBevel)	
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 76.8, 238.08)
		uiDrawPathLineTo(path, 76.8 + 51.2, 238.08 -51.2)
		uiDrawPathLineTo(path, 76.8 + 51.2 + 51.2, 238.08 - 51.2 + 51.2)
		uiDrawPathEnd(path)
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinRound)	
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_20.png
	:alt: RingLibui スクリーンショット

用例 (2):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 400, 400, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()
		source = uiNewSolidBrush(colorBlack)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	
		set_uiDrawStrokeParams_Thickness(sp,30)	

		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 64.0, 50.0)
		uiDrawPathLineTo(path, 64.0, 200.0)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapRound)	
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 128.0, 50.0)
		uiDrawPathLineTo(path, 128.0, 200.0)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapSquare)	
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 192.0, 50.0)
		uiDrawPathLineTo(path, 192.0, 200.0)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		// 補助線の描画
		// 正方形の上限を守るためにウェブサイトに掲載されている基準画像と一致させる。
		uiCrSourceRGBA(source, 1, 0.2, 0.2, 1)
		set_uiDrawStrokeParams_Thickness(sp,2.56)	
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, 64.0, 50.0)
		uiDrawPathLineTo(path, 64.0, 200.0)
		uiDrawPathNewFigure(path, 128.0, 50.0)
		uiDrawPathLineTo(path, 128.0, 200.0)
		uiDrawPathNewFigure(path, 192.0, 50.0)
		uiDrawPathLineTo(path, 192.0, 200.0)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_19.png
	:alt: RingLibui スクリーンショット

用例 (3):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 260, 300, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()

		x         = 25.6
		y         = 25.6
		width         = 204.8
		height        = 204.8
		aspect        = 1.0
		corner_radius = height

		radius = corner_radius / aspect
		degrees = uiPi / 180.0

		source = uiNewSolidBrush(colorBlue)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	
		set_uiDrawStrokeParams_Thickness(sp,30)	

		path = uiDrawNewPath(uiDrawFillModeWinding)

		// 右上角
		uiDrawPathNewFigureWithArc(path,
			x + width - radius, y + radius,
			radius,
			-90 * degrees, uiPi / 2,
			0)
		// 右下角
		uiDrawPathArcTo(path,
			x + width - radius, y + height - radius,
			radius,
			0 * degrees, uiPi / 2,
			0)
		// 左下角
		uiDrawPathArcTo(path,
			x + radius, y + height - radius,
			radius,
			90 * degrees, uiPi / 2,
			0)
		// 左上角
		uiDrawPathArcTo(path,
			x + radius, y + radius,
			radius,
			180 * degrees, uiPi / 2,
			0)
		uiDrawPathCloseFigure(path)
		uiDrawPathEnd(path)

		uiCrSourceRGBA(source, 0.5, 0.5, 1, 1)
		uiDrawFill(uiEventContext(), path, source)
		uiCrSourceRGBA(source, 0.5, 0, 0, 0.5)
		set_uiDrawStrokeParams_Thickness(sp,10)	
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_26.png
	:alt: RingLibui スクリーンショット

用例 (4):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 300, 300, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()

		source = uiNewSolidBrush(colorBlue)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	

		path = uiDrawNewPath(uiDrawFillModeWinding)

		uiDrawPathNewFigure(path, 50.0, 75.0)
		uiDrawPathLineTo(path, 200.0, 75.0)

		uiDrawPathNewFigure(path, 50.0, 125.0)
		uiDrawPathLineTo(path, 200.0, 125.0)

		uiDrawPathNewFigure(path, 50.0, 175.0)
		uiDrawPathLineTo(path, 200.0, 175.0)
		uiDrawPathEnd(path)

		set_uiDrawStrokeParams_Thickness(sp,30)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapRound)	
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_18.png
	:alt: RingLibui スクリーンショット

用例 (5):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 260, 300, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()
		m = new_uiDrawMatrix()
		source = uiNewSolidBrush(colorBlue)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	
		set_uiDrawStrokeParams_Thickness(sp,6)	

		path = uiDrawNewPath(uiDrawFillModeAlternate)
		uiDrawPathAddRectangle(path, 12, 12, 232, 70)
		uiDrawPathNewFigureWithArc(path,
			64, 64,
			40,
			0, 2*uiPi,
			0)
		uiDrawPathNewFigureWithArc(path,
			192, 64,
			40,
			0, -2*uiPi,
			1)
		uiDrawPathEnd(path)

		uicrsourcergba(source, 0, 0.7, 0, 1)
		uiDrawFill(uiEventContext(), path, source)
		uicrsourcergba(source, 0, 0, 0, 1)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		uiDrawMatrixSetIdentity(m)
		uiDrawMatrixTranslate(m, 0, 128)
		uiDrawTransform(uiEventContext(), m)

		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathAddRectangle(path, 12, 12, 232, 70)
		uiDrawPathNewFigureWithArc(path,
			64, 64,
			40,
			0, 2*uiPi,
			0)
		uiDrawPathNewFigureWithArc(path,
			192, 64,
			40,
			0, -2*uiPi,
			1)
		uiDrawPathEnd(path)

		uicrsourcergba(source, 0, 0, 0.9, 1)
		uiDrawFill(uiEventContext(), path, source)
		uicrsourcergba(source, 0, 0, 0, 1)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_25.png
	:alt: RingLibui スクリーンショット

用例 (6):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 260, 300, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()
		source = uiNewSolidBrush(colorBlue)	
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	

		path = uiDrawNewPath(uiDrawFillModeWinding)

		uiDrawPathNewFigure(path, 128.0, 25.6)
		uiDrawPathLineTo(path, 230.4, 230.4)
		uiDrawPathLineTo(path, 230.4 - 102.4, 230.4 + 0.0)
		uiDrawPathBezierTo(path, 51.2, 230.4, 51.2, 128.0, 128.0, 128.0)
		uiDrawPathCloseFigure(path)

		uiDrawPathNewFigure(path, 64.0, 25.6)
		uiDrawPathLineTo(path, 64.0 + 51.2, 25.6 + 51.2)
		uiDrawPathLineTo(path, 64.0 + 51.2 -51.2, 25.6 + 51.2 + 51.2)
		uiDrawPathLineTo(path, 64.0 + 51.2 -51.2 -51.2, 25.6 + 51.2 + 51.2 -51.2)
		uiDrawPathCloseFigure(path)

		uiDrawPathEnd(path)

		set_uiDrawStrokeParams_Thickness(sp,10)	
		uicrsourcergba(source, 0, 0, 1, 1)
		uiDrawFill(uiEventContext(), path, source)
		uicrsourcergba(source, 0, 0, 0, 1)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_24.png
	:alt: RingLibui スクリーンショット

用例 (7):

.. code-block:: ring

	# このサンプルは Ring 移植版です。
	# 原作のサンプルはこちらから : https://github.com/andlabs/libui

	load "libui.ring"

	oWindow = uiNewWindow( "Drawing Sample", 260, 300, True)
	uiWindowOnClosing(oWindow,"closeApp()")

	oAreaHandler = uiNewAreaHandler("draw()","","","","")
	area = uiNewArea(oAreaHandler)

	btnClose = uiNewButton("Close Application")
	uiButtonOnClicked(btnClose,"closeApp()")

	hbox = uiNewVerticalBox()
	uiBoxSetPadded(hbox, 1)
	uiBoxAppend(hbox,btnClose,0)
	uiBoxAppend(hbox,area,1)
	uiWindowSetChild(oWindow, hbox)

	uiControlShow( oWindow )
	uiMain()

	func draw
		nWidth = uiEventAreaWidth()		nHeight = uiEventAreaHeight()

		source = new_uiDrawBrush()
		sp = new_uiDrawStrokeParams()
		source = uiNewSolidBrush(colorBlue)	

		x=25.6   y=128.0
		x1=102.4 y1=230.4
		x2=153.6 y2=25.6
	  	x3=230.4 y3=128.0

		uicrsourcergba(source, 0, 0, 0, 1)
		set_uiDrawStrokeParams_Cap(sp,uiDrawLineCapFlat)	
		set_uiDrawStrokeParams_Join(sp,uiDrawLineJoinMiter)	
		set_uiDrawStrokeParams_MiterLimit(sp,uiDrawDefaultMiterLimit)	
		set_uiDrawStrokeParams_NumDashes(sp,0)		
		set_uiDrawStrokeParams_DashPhase(sp,0)	

		path = uiDrawNewPath(uiDrawFillModeWinding)

		uiDrawPathNewFigure(path, x, y)
		uiDrawPathBezierTo(path, x1, y1, x2, y2, x3, y3)
		uiDrawPathEnd(path)
	  	set_uiDrawStrokeParams_Thickness(sp,10)		
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

		uicrsourcergba(source, 1, 0.2, 0.2, 0.6)
	  	set_uiDrawStrokeParams_Thickness(sp,6)		
		path = uiDrawNewPath(uiDrawFillModeWinding)
		uiDrawPathNewFigure(path, x, y)
		uiDrawPathLineTo(path, x1, y1)
		uiDrawPathNewFigure(path, x2, y2)
		uiDrawPathLineTo(path, x3, y3)
		uiDrawPathEnd(path)
		uiDrawStroke(uiEventContext(), path, source, sp)
		uiDrawFreePath(path)

	func closeApp
		uiQuit()

スクリーンショット:

.. image:: libui_23.png
	:alt: RingLibui スクリーンショット
