角丸の矩形を描画するモジュール

// 角丸矩形描画モジュール

#include "a2d.hsp"


#module
// ------------------------------------------------------------ //
//
// 命  令  :角丸矩形の描画
//
// 引  数  :x, y	: 矩形の左上座標
//           w, h	: 矩形のサイズ
//           r      : 角丸半径
//
// 返り値  :なし
//
// 機能説明:
//           引数で指定した位置・サイズの角丸矩形を描画します。
//
//           この矩形は、塗りつぶしではなく線で枠を描画した図形です。
//
// ------------------------------------------------------------ //
// Rounded Rectangle
#deffunc DrawRoundRect int p_x, int p_y, int p_w, int p_h, int p_r
	r = limit( p_r, 0, p_w/2)

	alDrawLine p_x          , p_y + r      , p_x          , p_y + p_h - r
	alDrawLine p_x + r      , p_y + p_h    , p_x + p_w - r, p_y + p_h
	alDrawLine p_x + p_w    , p_y + p_h - r, p_x + p_w    , p_y + r
	alDrawLine p_x + p_w - r, p_y          , p_x + r      , p_y

	alDrawArc p_x            , p_y            , r*2, r*2, 180, 90
	alDrawArc p_x            , p_y + p_h - r*2, r*2, r*2,  90, 90
	alDrawArc p_x + p_w - r*2, p_y + p_h - r*2, r*2, r*2,   0, 90
	alDrawArc p_x + p_w - r*2, p_y            , r*2, r*2, 270, 90
	return



// ------------------------------------------------------------ //
//
// 命  令  :塗りつぶし角丸矩形の描画
//
// 引  数  :x, y	: 矩形の左上座標
//           w, h	: 矩形のサイズ
//           r      : 角丸半径
//
// 返り値  :なし
//
// 機能説明:
//           引数で指定した位置・サイズの角丸矩形を描画します。
//
// ------------------------------------------------------------ //
// Rounded Rectangle
#deffunc FillRoundRect int p_x, int p_y, int p_w, int p_h, int p_r
	r = limit( p_r, 0, p_w/2)

	alFillRect  p_x           , p_y + r        , r, p_h - p_r*2
	alFillRect  p_x + r       , p_y + p_h - p_r, p_w - r*2, r
	alFillRect  p_x + p_w - r , p_y + r              , r, p_h - p_r*2
	alFillRect  p_x + r       , p_y , p_w - r*2, r

	alFillRect  p_x + r       , p_y + r , p_w - r*2, p_h - p_r*2

	alFillPie p_x            , p_y            , r*2, r*2, 180, 90
	alFillPie p_x            , p_y + p_h - r*2, r*2, r*2,  90, 90
	alFillPie p_x + p_w - r*2, p_y + p_h - r*2, r*2, r*2,   0, 90
	alFillPie p_x + p_w - r*2, p_y            , r*2, r*2, 270, 90
	return

#global


	; 仮想イメージ 0 を作成
	alCreateImage 0, 640, 480
	if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end

	alPenWidth 3
	
	// 背景
	alColor 255, 200,200
	r = 10
	repeat ginfo_winx*2 /r
		alDrawLine cnt * r, 0, 0, cnt * r
	loop

	// 半透明フィルタ
	alColor 0, 0, 255, 127
	// 角丸
	DrawRoundRect 0,   0, 120, 120, 20
	// 角丸塗りつぶし
	FillRoundRect 0, 150, 120, 120, 20


	// グラデーションブラシ
	alGradientColor 150, 0, 150+120, 120, RGBA(255, 0, 0), RGBA(0, 0, 255)
	DrawRoundRect 150,   0, 120, 120, 30
	alGradientColor 150, 150, 150+120, 150+120, RGBA(255, 0, 0), RGBA(0, 0, 255)
	FillRoundRect 150, 150, 120, 120, 30


	// 半透明グラデーションブラシ
	alGradientColor 300, 0, 300+120, 120, RGBA(0, 255, 0, 255), RGBA(0, 255, 0, 0)
	DrawRoundRect 300,   0, 120, 120, 40
	alGradientColor 300, 150, 300+120, 150+120, RGBA(0, 255, 0, 255), RGBA(0, 255, 0, 0)
	FillRoundRect 300, 150, 120, 120, 40


	; 仮想イメージ 0 から HSP スクリーンにコピー
	alCopyImageToScreen 0, 0
	redraw