B-right/V sample application - PARSAMP(ѡ)


1. Ϥ

 sample program  OS ɸƤѡĤδĤˤĤơμ갷٤ΤΤǤΤᡢǤϰʲδŪ˼갷äƤޤ

	1. window event μ갷
	2. parts μ¹ˡ
	3. tray ڤ  tray ͳʸʣ/ư

ʳʬˤĤƤϡWALLCHG(ɻѹ)  IMGVIEW() 򻲹ͤˤƤ




2. application γ

 application  [ǤդʸϤơʸο礭ʤɤꤹ] ȤȤꤷ߷פƤޤ
ºݤʸޤǤϹԤޤ󡣤ޤǡ parts ݤȤƹͤ줿ۤ application ǤΤᡢƼ parts ¹ԤƤ⡢ȿǤʸ褵뤳ȤϤޤ

ββʲλͤ˴ŤΤȤޤ

	1. ʸϤ TB_PARTS ǹԤTC  10 ʸ Ȥ롣
	2. ʸΰĤꡢػ߾֤ڤؤ뤳ȤǤ롣
	3.  [][][][][][忧][][]  8 Ǥ롣 SS_PARTS ѤΤȤ롣
	4. ʸ size  0  255 ޤǤǡVL_PARTS  SB_PARTS ξǽȤ롣
	5. ԥåԥåڤؤǽȤ롣 WS_PARTS ѤΤȤ롣
	6. ͤ뤳ȤǤΤȤ롣ϡMS_PARTS  menu ¹ԤǤΤȤ롣
	7. application λˡ꤬ѹƤСλγǧȤ롣
	8. Ƥ䵸ͭǡ¸롣
	9. TB_PARTS Ƥϡdrag ¾ TB_PARTS 䡢¾Υɥʣ/ưǽȤ롣
	10. TB_PARTS ˤϡʸΤʣ̤ǽȤ롣ʸʳϵݤ뤫ΤƤΤȤɬ [ʣ] Ȥʤ褦ˤ롣
	11. ɬŤ줫 box  parts(TB_PARTS  SB_PARTS Τ) ˼¹Ծ֤Ȥʤ뤳ȡ

 application ϡʣĤ parts ζĴư䡢tray ʤɤλͤȤƤ




3.  program ή

3.1. 祦ɥư

 application  hmi Ȥ濴ŪưΤϡ祦ɥФȤȤˤʤäƤޤ
window Ǥ򤹤硢Ū˲ event Ф(event driven  Τ褦ư)ȤʤΤŪǤ(event ˸Ʊʤǡɽ򹹿褦ʷǽǤǤ window ֤줿 parts 뤳ȤŪȤƤޤΤǡλϼ꤫ϳ줿äˤʤäƤޤޤ)

Ū event ν(event loop)ˤĤƤϡlibapp  evt_loop() Ѥ褦ˤƤޤǤäˡʲƤ祦ɥǤ٤ event ȤƤ application ǤϽ褦ˤƤޤ

	1. 
		Ūˤ parts 䡢caretȤǤѤޤ application ǤϴĤ box  parts ֤ƤꡢˤŤ줫¹Ծ֤ˤ뤿ˡȡŤ줫 box  parts ֤Ȥ褦ˤƤޤ
	2. 
		OS ƤǤ
		(libapp νޤߤޤ)
	3. Ͻ
		¿ΥϤФǤ
		Ǥ application Ǥ window äƤǼºݤˤϲⵯޤ(¹Ծ֤ box  parts  key Ͻ٤Ǥ)
		Τᡢ application Ǥص夢ˤʤäƤޤ
	4. ݥ󥿥ץ쥹
		window ΰ֤줿 parts μ¹Ԥˤʤޤ
		ä box  parts ǤϤʤ硢ɬ PD ˤäưΤȤʤäƤޤ(box  parts Ǥ PD ˲ä key ư˴ޤޤޤ)
		ʤߤˡwindow ΰʬ(ɥȤԥȥ)ˤĤƤ evt_loop() ¦Ŭڤʽ򤹤褦ˤʤäƤޤǤΤǡɥȤϤǥɥưȤȤäưˤĤƤϡapplication Ǥä˼ɬפޤ)
	5. Ž׵
		¾ window ȤϤǻäƤưˤʤޤ
		νξܺ٤Ƥϡ̤ȤƤޤ

3.1.1. 祦ɥ

 application Ǥ window (window 礭 titlewindow ֤ parts)ˤĤƤ databox ˵Ҥ褦ˤƤޤ
ޤǡϤ application ȼǤꡢɬ⤳ˡȤɬפϤޤΤǡƤξܤƤˤĤƤϳ䰦ޤĤʬˤĤơޤ

ޤwindow Ƥι¤ΤǤ struct.h  WINDEF Ȥ¤ΤꡢηƤޤ
databox  def_mainwin ʬƤ¨ʬȤʤäƤޤ
window ФŪϤ˵ҤƤޤwindow  parts 䤽¾ιܤˤĤƤϡ̤򵭽Ҥ褦ˤƤޤ(WINDEF.parts Ƥ򵭽ҤƤʬؤ pointer(databox ǤΤǡdatabox Ǥλ)Ȥʤޤ
 parts ʤɤιܤϡPNL_ITEM ¤ΤƱ񼰤Ѥ褦ˤƤޤǤΤǡ application Ǥ⡢parts ʤɤιܤδ PNL_ITEM ¤ΤȤ褦ˤƤޤʤ application Ǥ window  parts ֤ˤĤƤϡƼǤˤɬפޤ(libapp  panel ؿߤлǤ褦ˤϤƤޤ)Τᡢparts ֤ϡ databox  recompile ơĴɬפȻפޤ

3.1.2. 祦ɥνȥѡĤϿ

祦ɥ MAINWIN Ȥ class Ǵ褦ˤƤޤ class  constructor ǡ˽Ҥ٤ޤ window Ƥ databox ˡparts ƤˤĤƤ褦ˤƤޤ

window ΤΤˤĤƤϡwindow Ƥ¨ wopn_wnd() ȯԤơwindow 򳫤褦ˤƤޤʤߤˡwindow 򳫤Τ constructor ǤϹԤʤ褦ˤƤޤ( application Ǥ 1  window Ǥʣ window Ȥʤäˡ object  new  delete  window γĤ򤹤꤫ϡwindow γĤ̤ˤۤڤˤʤȽǤǤ)
ޤwindow طʥѥǤ(PAT*)WI_PANELBACK ȤƤޤ B-right/V R3.000  OS ˼줿window  panel  parts ʤɤط pattern 򤽤Τޤ޻Ȥ褦ˤ٤ΤΤǤʤR3.000 ǤϤεǽưݾڤϤޤ󡣤ΤᡢB-right/V ̤ξ򲼵ޤ(wget_inf()  B-right/V ˤϤޤΤǡѤͤμߤޤԤСŬʽͤ褦ˤƤޤ)

//
// ɥ򳫤
//
W	open_window()
{
	W	wid;			// window ID
	W	i;			// pattern (byte ñ)
	PAT*	pbgpat;			// ꤹط pattern
	bool	pflg;			// pattern  free() ɬ

	pflg = false;			// ֤Ǥ free() 

	// pattern ̤μ
	i = wget_inf(WI_PANELBACK, NULL, 0);
	if (i > 0) {
		// ΰ
		pbgpat = static_cast<PAT*>(malloc(i));
	}
	if (pbgpat == NULL) {
		// ʤΰݤ˼
		pbgpat = WHITE0;	// طʤȤ(¾Ū pattern Ǥ褤)
	} else {
		// ΰݤΤǡƤμ
		pflg = true;		// free() ɬͭ
		wget_inf(WI_PANELBACK, (VP)pbgpat, i);
	}
	wid = wopn_wnd(,,,,,, pbgpat,);	// ¾ΰϾάƤޤ

	if (pflg) {
		free(pbgpat);
	}

	return wid;
}

ޤưϳǧƤޤ󤬡ʲΤ褦ˤƤ⤤Τޤ

//
// ɥ򳫤
//
W	open_window()
{
	PAT*	pbgpat = WHITE0;	// ͤ(¾Ū pattern Ǥ)
	std::vector<B>	buf;		// buffer

	try {
		buf.resize(wget_inf(WI_PANELBACK, NULL, 0);
		pbgpat = reinterpret_cast<PAT*>(buf.begin());
		wget_inf(WI_PANELBACK, (VP)pbgpat, buf.size());
	} catch (...) {			// vector  exception ʤʤǤ
		;
	}

	return wopn_wnd(,,,,,, pbgpat,);	// ¾ΰϾάƤޤ
}

ơɥϤǳޤparts ˤĤƤϤޤϿƤޤ
parts ˤĤƤ⡢databox 򵭽Ҥwindow ֤ databox ˵Ҥ褦ˤƤޤMAINWIN  constructor  databox ݤˡĤν򤷤Ƥޤ
ޤparts ʤɤιܾ PNL_ITEM ¤ΤѤ褦ˤƤޤϡƹܤ PNL_ITEM ¤Τ¨Ƥ뤿Ǥޤprocess local memory ž̤ˤʤäƤޤ databox μ갷ΤΤ礭طƤޤ
Ʊ application ʣ硢줾줬 databox  open ơdatabox Ƥ褦ˤƤޤ databox ϳ process ˶̤ƤȤʤäƤޤäƤޤΤᡢĤ process  databox Ƥ񤭴褦ʽ򤷤ǡƱ application ¾ process  databox Ƥ򻲾Ȥ褦ȤȡνؤäƤǻȤƤޤȤˤʤޤ application ǤϡPNL_ITEM.desc  parts ID 򵭲褦ˤƤΤǤ줬 databox Ǥͤľ褦ʷȤʤäƤȡʣĤ application Ʊ˵ư硢parts 갷ʤʤޤ
Τᡢprocess  local ΰž褦ˤƤޤ
(ʤdatabox Ƥ񤭴ȤäƤ⡢ OS  memory ŸʬؤΤǤäơapplication ¿ˤ databox record (Ĥޤ file Τ) 񤭴櫓ǤϤޤ󡣤Ǥ顢databox Ƥ application ǽ񤭴ƤƵưƤ⡢file ΤΤѤäƤޤΤǡƤޤ)
ޤdatabox ФȤϤƤ databox Ǥ offset ؤᡢ memory Ǥλ pointer ɤؤɬפޤΤǡդƤ

ơ褤 parts ϿǤ MAINWIN::par_create() ǹԤ褦ˤƤޤ
parts ϿκݡPNL_ITEM.itype Ƥǧ褦ˤƤޤ databox ǡparts ʳι(ȤʸȤ)ϿǤ褦ˤƤ뤿ᡢȽ꤬ɬפȤʤäƤǤܼŪˤ parts ϿȤϴطޤ
parts Ͽκݡparts Ƥɤؤʤɤ򤷤ƤޤϤΤޤޤˤƼۤǤ礦첽ΰ١ŪʷɤؤơƤ򤷤ơξϿ(ccre_par() ȯ)򤹤褦ˤƤޤ
parts ΰ֤ˤĤƤϡdatabox ꤷ(PNL_ITEM.ir) ȿǤ褦ˤƤޤǤͤľѤ뤿ᡢdatabox ǤϼǤǼºݤΰ֤ɬפ褦ˤƤޤäƤޤ( application ǤϸŪʬ뤿ᡢlibrary ŪưϤʤ٤ʤ褦ˤƤޤ)

ǸˡVL_PARTS ξˡP_DRAGBREAK 褦ˤƤޤ volume ΥΥ֤ư drag ɽˤ뤿Ǥwindow  scroll bar  drag ɽƱ̣ޤ

3.1.3. 祦ɥưȥѡĤμ¹

window parts Ͽȡ window ˤ parts ɽƤޤ
Ǥparts Ф¹(ư)̣ cact_par() Ȥ API  parts ФȯԤʤȡparts  parts ȤưƤޤ
parts  parts ȤơPD  key ɿ路ưˤϡϤ parts ѤƤ application Ǽ¹Ԥ褦 API ȯɬפȤ櫓Ǥ
wget_evt()  event ǡevent  parts ϤΤϡapplication ܤȤȤǤ

祦ɥǤ PD event ξ硢PD ֤ window кɸ֤ƤޤΤǡκɸ򸵤ˤơcfnd_par() Ԥޤ
ȡPD ֤˱ pid ǤޤΤǡȤϡ parts ˱ cact_par() ȯơparts ¹Ԥ褦ˤޤ
 application Ǥϡpid 򸵤ˤơ parts μ¹ԴؿƤӽФ cact_par() 򤹤褦ˤƤޤMAINWIN::press_fn()  cfnd_par() 򤷤ơparts ȽꤷƤʬǤ
ʤߤˡparts ʳι(ȤСѥ˥塼ȤΤ褦ʡparts ϿƤʤƤ⡢parts Τ褦˿񤦤)ξ硢cfnd_par() ǸĤȦ⤢ޤΤǡιܤΰ PD 뤫ȽꤷơξǵߤưƼʤФʤޤ

box  parts (TB_PARTS / NB_PARTS / XB_PARTS / SB_PARTS) ϼ¹Ծ֡¹Ծ(Ĥޤꡢfocus ̵ͭ)Ĥ褦ˤǤƤޤޤ餬 window ֤Ƥ硢ʤ٤Ť줫 box  parts ¹Ծ֤Ȥʤ褦˼Ƥ¿Ǥˡ box  parts  KC_TAB(֥) ϤԤȡ̤ box  parts  focus ܤ褦ˤʤäƤ¿ΤǤưˤĤƤ⡢٤ application ǼʤФʤޤ
ޤŤ줫 box  parts μ¹ԤǤ application Ǥ MAINWIN::actbox ȤѿǴ褦ˤƤޤ application Ǥ window ֤줿ƹܤϡν֤˱ֹͿ褦ˤƤޤѿˡ˼¹Ծ֤ˤֹꤹ褦ˤƤޤ
ξǡEV_NULL(/EVTOPE::evt_idle() - MAINWIN::idle_fn())ȯˡμ¹Ծ֤ˤ parts ФơEV_NULL 褦ˤƤޤ( parts μ¹ԴؿƤ cact_par() ȯ褦ˤƤޤ)
cact_par()  EV_NULL ǸƤФȡinactive ֤ parts  active ֤˰ܹԤ([/Խ]ȸƤФޤ)Ʊ window ¾ active ֤ parts  inactive ֤ؤܤޤ([Ͼ] ȸƤФޤ)ޤǤƱ parts  active äΤʤ顢ñԤ֤ݻޤ
ޤKC_TAB ˤäơactive ֤ܤϡñ MAINWIN::actbox Ƥ񤭴ˤƤޤΤ褦ˤƤȡ KC_TAB  parts ϰöcact_par() Υ졢process ϼ window event Ԥޤ window event  EV_NULL ȡ٤ۤɤȤ̤ parts Ф EV_NULL 졢cact_par() ȯ event ԤˤʤޤΤǡKC_TAB ˤ focus ΰưޤ
(ʤߤˡcact_par()  box  parts Ϥȡkey  PD ˴ؤ event Ϥ API ¦ǽ褦ˤʤäƤޤطΤʤ¾ event ȯȡcact_par() Υ졢ηؿ֤ͤȤ application 褦ˤʤäƤޤ)
Τ褦ˤơ application Ǥ box  parts ξܤ褦ˤƤޤ
(ʤpanel ξǤpanel ʣ box  parts ֤Ƥ⡢ư OS ¦(pact_pnl()  panel μ¹Ԥ򤷤ޤ)Ǵ褦ˤʤäƤ뤿ᡢapplication Ǥʬ򤹤ɬפϤޤ󡣤pact_pnl() Ѥwget_evt()  event Ƥ event ǼϡϤ box  parts δϼǼʤФʤޤ)

ޤ¾ parts ޤơܤưˤĤƤ[BTRON3ͽ][2 OS][3 ][3.3 ѡĥޥ͡][3.3.2 ѡĤμ]ǳ parts ˤĤƤޤޤcact_par() ưˤĤƤ[BTRON3ͽ][2 OS][3 ][3.3 ѡĥޥ͡][3.3.4 ѡĥޥ͡δؿ][cact_par ѡĤư¹]Ƥޤ
ʤʲˤ application ǻѤ parts ˤĤơºݤưϤɤΤ褦˴Ƥ뤫Ƥޤ(ʲϰǤäơ application ǤϤ㤦ʬޤŪޤưƱǤ)

3.1.3.1. TB_PARTS μ¹

 parts ư NB_PARTS  XB_PARTS ⳵ƱǤ(XB_PARTS ǤϡΰФꤹǤޤ)
 parts ʸϤɽʤɤΡʸԤȤ˽ΤǤǤΤǡʸϤκݤ˲̾ѴǤȤϰϤäơưꤹ뤳ȤǤ褦ˤʤäƤޤ
(NB_PARTS ǤϡѤȤȤǡ̾ѴϤǤޤ󡣤ޤXB_PARTS Ϥ줿Ƥߤʤʤ褦ˤʤäƤ뤿ᡢʸɽȤӤˤϸޤ󤷡̾ѴǤޤ)
ޤPD ˤ caret ֤ΰưȤǽǤꡢ parts  PD event  key event ⶦ˽ȤΤˤʤäƤޤ
ΤᡢBTRON hmi ǵꤵƤ parts ǤϤʤⵡǽʤΤǤȾ̡(program Ǥμ갷)Ϥݤˤʤޤ
ʲ򼨤ޤ(⡢̤ TB_PARTS μ갷Ǥ)

//
// TB_PARTS μ¹
//
// pid : о parts ID
//
WERR	act_TB_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if ((sts == P_EVENT) || (sts == P_MENU)) {
		// פ event ȯmenu 򳫤ȤƤ
		unget_wevt();		// ᤷơ¾ï
	} else {
		// ¾
		sts &= 0x0007;
		if ((sts == P_MOVE) || (sts == P_COPY)) {
			// ϰϤʣ/ư褦ȤƤ
			if (wevt.s.wid == wid) {
				//  window Ǥ
			} else {
				//  window ȤƤ
			}
		} else if (sts == P_NL) {
			// ä(enter äȤۤƱ)ΤǡP_EMPHAS  parts εưȤ
		} else if (sts == P_TAB) {
			// TAB 򲡤Τǡ¾ box  parts ˾
		} else if (sts == P_BUT) {
			// ѡΰ賰 click 
			unget_wevt();	// ᤷơ¾ï
		}
	}

	return rv;
}

TB_PARTS μ¹Ԥ˴طΤʤ event 䡢ES_BUT2 ȼ menu ׵ʤɤξ硢event 򺹤ᤷơŬڤʽ evt_loop() ȽǤʤƤ餤ޤޤTB_PARTS ΰ賰 click ϡ¾ parts ¹Ԥ褦ȤƤꤷޤΤǡ evt_loop()  event öᤷơξǼܥץ쥹Ԥ褦ˤޤ
P_NL ξϡϤȤʤäƤꡢξ default switch (Ūˡenter key 줿餽Ǽ¹ԤȤʤ switch  parts Τ)Фư򤷤ޤ application Ǥ default switch ȤΤϤޤΤǡä˲⤷Ƥޤ
P_TAB Ǥϡ box  parts  focus ưޤ˽Ҥ٤ޤbox  parts ξܤ¸٤νǤ

P_MOVE  P_COPY ξ硢parts ΰϤǤɤʣ/ư褦ȤȤ̣ޤ
λ window ⳰ǽ櫓ƤޤˤĤƤϡǥȥ졼ͳʬƤޤ
ޤΤΤȥ졼(Τˤϰȥ졼)ͳԤȤ̣ƤޤưʤȡTB_PARTS ʸĤ¾ΥɥŽȤȤ¹ԤǤʤȤˤʤäƤޤޤ

3.1.3.2. SB_PARTS μ¹

 parts ϡ󤫤򤹤뤳ȤŪȤƤޤȤϡ¤ܤΤȤǡ parts ǤϤ椫Ĥ򤹤ȤȤ̣ޤΰȤΤϡñĴäʿ(㤨С10  200 ޤǤ)椫ĤȤ̣ޤߤޤΥŪʿ(㤨1, 5, 10, 20, 50, 100 Ȥ)椫Ȥ̣ޤߤޤäȰŪʹ(ͻ롢åȡʤ)ȤȤޤߤޤ

 parts Ǥϡparts  [][] Ȥʬ click ꡢ[Ѵ][̵Ѵ] ϤꤹȡܤڤؤǤޤޤñʿξ硢οľϤ뤳Ȥˤꡢͤꤹ뤳ȤǽǤ

 parts ˤĤƤϡͰʲΤ褦˼ޤ

//
// SB_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_SB_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if ((sts == P_EVENT) || (sts == P_MENU)) {
		// פ event ȯmenu 򳫤ȤƤ
		unget_wevt();		// ᤷơ¾ï
	} else {
		// ¾
		sts &= 0x0007;
		if (sts == P_NL) {
			// ä(enter äȤۤƱ)ΤǡP_EMPHAS  parts εưȤ
		} else if (sts == P_TAB) {
			// TAB 򲡤Τǡ¾ box  parts ˾
		} else if (sts == P_BUT) {
			// ѡΰ賰 click 
			unget_wevt();	// ᤷơ¾ï
		}
	}

	return rv;
}

 parts  TB_PARTS ƱͤˡP_NL  P_TAB ФưԤʤФʤޤ(SB_PARTS  box  parts ΰǤ)SB_PARTS ϰϤϻޤΤǡP_COPY  P_MOVE ȯޤ

3.1.3.3. AS_PARTS μ¹

 parts ư PA_PARTS Ʊͤˤʤޤ
 parts ϡclick ȡ󥸥 ON / OFF ڤؤ褦ˤʤäƤޤ(PA_PARTS ξϡɽƤ볨Τߤڤؤޤ)
Τᡢclick ˤäơ֤Ѥäݤ˰̣Ĥ褦ˤʤФʤޤ󡣤 cact_par() η̤ȤơP_CHANGE б bit ΩäƤˡclick ˤäơ֤ڤؤäȤ̣褦ˤʤäƤޤ
͡ʲΤ褦ˤưޤ

//
// AS_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_AS_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if (sts & P_CHANGE) {
		// parts  click 줿ΤǾ֤γǧ
		if (sts & 0x0001) {
			// 󥸥 ON ˤʤä
		} else {
			// 󥸥 OFF ˤʤä
		}
	}

	return rv;
}

3.1.3.4. MS_PARTS μ¹

 parts ư PM_PARTS Ʊͤˤʤޤ
 parts ξ硢ñˡclick 줿Ȥ̣ĤΤǤäơʳˤϾ֤̣⤢ޤĤΤǤϤޤ( press(drag)  double click ξ֤ߤ뤳ȤǽǤMS_PARTS λȤȤŬڤȤϸޤ)
cact_par() η̤ȤơP_CHANGE б bit ΩäƤ硢MS_PARTS  click 줿Ȥ̣ޤդˡߤƤϡMS_PARTS  click 줿ΤǤϤʤȤޤ(parts  press ơparts ΰ賰 release )
ΤȤ˽ȡʲΤ褦˵Ҥ뤳Ȥˤʤޤ

//
// MS_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_MS_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if (sts & P_CHANGE) {
		// parts  click 줿Τǡư
	}

	return rv;
}

3.1.3.5. WS_PARTS μ¹

 parts ʣĤ椫ñΤΤ򤹤ȤΤǡAS_PARTS ʣĤιܤäơΰĤΥ󥸥 ON ˤʤꡢ¾ OFF ˤʤäƤ롢Ȥ褦ʴΤΤǤ(parts °ˤäơƤ OFF ˤ뤳ȤǽǤʣ ON ˤ뤳ȤϤǤޤ)
ޤ click ˤäƹԤΤȤʤäƤޤѲСcact_par() ֤ͤ P_CHANGE б bit ΩĤ褦ˤʤäƤޤ
ʲΤ褦ˤơưޤ

//
// WS_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_WS_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if (sts & P_CHANGE) {
		// Ѳ
		switch (sts & P_SMASK) {
			case 0:		// 򤬤ʤʤä(parts ° P_NOSEL λΤ)
				break;
			case 1:		// ܤιܤˤʤä
				break;
			case 2:		// ܤιܤˤʤä
				break;
			// ... ʹߤι ...//
		}
	}

	return rv;
}

ʤ(sts & P_SMASK) Ǥϡ0  4095 ޤǤɽǤޤ󤬡WS_PARTS  4096 ܰʾߤ뤳ȤϸŪǤϤޤΤǡѾϤʤȻפޤ

3.1.3.6. SS_PARTS μ¹

 parts ʣĤñΤΤ򤹤Ȥ̣礤ǤϡWS_PARTS ˻Ƥޤscroll bar ˤäɽ scroll ǤȤ˰㤤ޤ
Τᡢ¤줿ΰ¿ܤĤȤݤΩĤΤȸޤ
ޤscroll bar Фư OS ¦Ԥ褦ˤƤ뤿ᡢʬưϼɬפޤ
cact_par() η̤ȤƤϡP_CHANGE ΩäƤ뤫ɤǡ֤ѲΤߤȤʤޤ

//
// SS_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_SS_PARTS(W pid)
{
	WERR	rv;
	W	sts;

	rv = ER_OK;
	sts = cact_par(pid, &wevt);
	if (sts <= ER_OK) {
		// error ȯä˼¹ԤƤʤ
		rv = sts;
	} else if (sts & P_CHANGE) {
		// Ѳ
		switch (sts & P_SMASK) {
			case 0:		// 򤬤ʤʤä(parts ° P_NOSEL λΤ)
				break;
			case 1:		// ܤιܤˤʤä
				break;
			case 2:		// ܤιܤˤʤä
				break;
			// ... ʹߤι ...//
		}
	}

	return rv;
}

ʤscroll bar ɽ scroll Ȥơɽ֤ĤƤϡcget_val() Ǽ뤳Ȥˤʤޤɽ֤ΰư cset_val() ǹԤȤǤޤ
ޤSS_PARTS ֤ͤ (sts & P_SMASK) ǼФƤޤSS_PARTS ξ硢4096 ʾιܿĤȤȤϸ¤ˤäǤΤǡܿ¿ʤϡϤ cget_val() ˤäƸߤֹʤФʤޤ
ξ硢

	} else if (sts & P_CHANGE) {
		// ѲΤͤμ
		W	val;

		rv = cget_val(pid, 1, &val);	// ֹΤߤμ
		if (rv >= ER_OK) {
			rv = ER_OK;
			switch (val) {
				case 0:		// 򤬤ʤʤä(parts ° P_NOSEL λΤ)
					break;
				case 1:		// ܤιܤˤʤä
					break;
				case 2:		// ܤιܤˤʤä
					break;
				// ... ʹߤι ...//
			}
		}
	}

Ȥꤷޤ
ޤ;ǤϤ parts  [[Ѵ][̵Ѵ] ˤäܤΰưǽʾ⤢] ȤƤޤ application ӼʤФʤޤcact_par()  SS_PARTS ФƤ key ͿƤ⡢ư򤹤ΤǤϤʤǤ
Τᡢλͤˤϡcset_val() ȯԤơSS_PARTS ưǤ褦ˤʤФʤޤ
ưˤĤƤϡbox  parts μȤߤ⤢ꡢʣˤʤޤΤǡǤϳ䰦ޤ

3.1.3.7. VL_PARTS μ¹

 parts  PD  click  press  drag  double click ˤäơư礭Ѥޤ
¾ switch Τ褦 parts  box Ϥ parts Ȥϰۤʤꡢ̤μ򤷤ʤФʤޤ
ޤʲ˿ʿ֤(parts ° P_HALIGN ꤵƤȤ) VL_PARTS 򼨤ޤ

//
// VL_PARTS μ¹
//
// pid : оݥѡ ID
//
WERR	act_VL_PARTS_H(W pid)
{
	WERR	rv;

	rv = ER_OK;
	for ( ; ; ) {
		// parts μ¹
		W	sts;

		sts = cact_par(pid, &wevt);
		if (sts <= ER_OK) {
			// äʤäerror
			rv = sts;
			break;
		} else if ((sts & 0x7000) == 0x4000) {
			// 줿ΤΡͤư̵
			break;
		}

		// ȼ̤γǧ
		W	fact;		// 
		W	val[4];		// parts ͤμ/

		fact = 0;
		cget_val(pid, 4, val);
		switch (sts & 0x000f) {
			case (P_SMOOTH | P_LEFT):
				//  smooth scroll 褦ȤƤ
				fact = -1;
				break;
			case (P_SMOOTH | P_RIGHT):
				//  smooth scroll 褦ȤƤ
				fact = 1;
				break;
			case (P_AREA | P_LEFT):
				//  area scroll 褦ȤƤ
				fact = -16;
				break;
			case (P_AREA | P_RIGHT):
				//  area scroll 褦ȤƤ
				fact = 16;
				break;
		}

		// ̤ȿ
		if (fact == 0) {
			// ư̵( drag ɽ/jump scroll )
		} else {
			// parts ̤ȿǤ
			val[1] += fact;
			if (val[1] < val[3]) {
				val[1] = val[3];
			} else if (val[1] > (val[2] - 1)) {
				val[1] = val[2] - 1;
			}
			val[0] = val[1] + 1;
			cset_val(pid, 2, val);
		}

		// drag ɽǤʤнλ
		if (!(sts & P_BREAK)) {
			break;
		}
	}

	return rv;
}

VL_PARTS ξ硢¾ parts ٤ơparts ͤλ䡢PD ȼͤѤ礭㤤ޤʲˤޤȤޤ([] οϡcget_val()  cset_val() ֹ򼨤ޤ)

	ʿ֤ξ
		   hi        chi  clo          lo
		   [3]       [1]  [0]          [2]
		    +---------+----+------------+
		---->       | || |          <----
		    +---------+----+------------+
				
				Υ
	ľ֤ξ
		+--+[2] lo
		|  |
		| <----
		|  |
		+--+[0] clo
		|==|<----Υ
		+--+[1] chi
		|  |
		| <----
		|  |
		+--+[3] hi

	ˤĤ
		Ϥ click ʤ press ʤ quick press
			smooth scroll (P_SMOOTH) ȯ
			ξ硢ͤư application ǹԤ(cset_val() ȯԤơͤڤؤʤФʤʤ)
		Ϥ double click
			area scroll (P_AREA) ȯ
			ξ硢ͤư application ǹԤ(cset_val() ȯԤơͤڤؤʤФʤʤ)
		Υ֤ drag
			jump scroll (P_JUMP) ȯ
			ξ硢ͤϴѤäƤ١ɬפ˱ cget_val() ȯԤơͤ
			ȤˡP_DRAGBREAK °ͿƤ硢P_BREAK ȯ

ʿ֤ξ硢lo ˤơhi ˤƤޤΤᡢwindow  scroll bar ʤɤǤѸȼºݤưȤž褦ˤʤޤΤǡ𤷤ʤ褦˵դƤ
ޤǤϿʿ֤ξΤΤ򼨤ޤľ֤ξ硢ȯư(P_UP  P_DOWN ȯޤ)ȡͤȿ(clo  chi ͤ)Ȥؤ뤰餤ǡŪʬѤޤ

3.2. ˥塼ưȼ¹

 application  menu ϰʲΤΤȤƤޤ

	[λ]
		ɥΥԥȥ֥륯åΤƱΰ̣Ĥ褦ˤƤޤ
		ΤᡢEVTOPE::evt_finish() (evt_loop() νλ׵ event Фؿ) ƤӽФ褦ˤƤޤ
	[ɽ]-[ɽ]
		祦ɥƤ褷ޤ
	[Խ]-[ȥ졼ʣ]
	      -[ȥ졼ʣ]
	      -[ȥ졼ذư]
	      -[ȥ졼ư]
		[ȥ졼ء]  tray  ¹ TB_PARTS ϰϤǳ줿ʸžޤ
		[ȥ졼]  ¹ TB_PARTS  tray ʸžƤޤ
		ξܤưϡƤޤ
	[Խ]-[]
		¹ TB_PARTS ϰϤʸޤ
	[Խ]-[]
		祦ɥ []  MS_PARTS  click ΤƱˤʤ褦ˤƤޤ
	[ɥ]
		Ūʥɥ˥塼ˤʤޤ
	[ʪ]
		Ūʾʪ˥塼ˤʤޤ

ʤmenu ιܤλ䡢menu ؿμڤӤεưˤĤƤ IMGVIEW() ǾҲ𤷤ƤޤΤǡǤϳ䰦ޤ
([3.  program ή][3.2. event loop μ][3.2.2. menu ν] 򻲾ȤƤ)

3.3. ȥ졼Ȱȥ졼

ȥ졼Ͻ̤ tray Ǥ¾ OS  clipboard ȸƤФƤΤ˶ᤤȻפäƤ
 tray  drag ˤäơ¾ window ƤŽߤԤΤ˻Ѥޤ
tray ϰ tray Ƥžȡ(Ŀ줿ꡢŪ˺ꤷʤ¤)ƤĤäƤȤΤǤ tray  drag ˤä¾ window ؤŽߤ򤷤ȤϡƤѴȤΤǤ
ˡǼǤƤ϶̤Ǥ󤵤뤫ʤǡǽ̤褦ˤʤäƤޤ

3.3.1. ȥ졼ʣ/ưμ

tray ʣ̡ưȤϡؤɤ application Ǥ menu 褦ˤʤäƤޤ([Խ]-[ȥ졼ʣ]  [Խ]-[ȥ졼ذư] Ǥ application ⡢äƤޤ)

tray ž硢Ƥ TAD ǵꤵ줿Τ˽褦ˤʤäƤޤΤᡢ(TAD Ǥ)ʸϤ޷Ť줫 data ǳǼ뤳ȤȤʤäƤޤ
ޤγǼ data ϡ() record ʬƵҤƤޤ application ǤʸϤΤߤǤΤǡʸϤ갷Ƥޤ󤬡ʸϤȲȤξʸʬȲʬȤ̡ record ˤ櫓ƳǼƤޤ
ޤƱƤʣ record ʬ䤷(Ϣ³)Ǽ뤳ȤǤޤɬפ˱ʬ䤹ΤǤΤǡɬϢ³Ƥʬ䤷ʤФʤʤȤ櫓ǤϤޤ(ä 1 record ̤礭ʤꤹΤ򤱤ȤȤˤѤޤ)
ʤtray ˳ǼƤ TAD ǵҤޤͣ졢ȥ(TS_VOBJ) ΤߡѤޤ󡣲ȥȤǤϡѤ record ʬ˷줿Ƥ򵭽ҤƤȤˤʤޤ
ޤTAD ǤϤΤǤ󥻥Ȥ䡢ǸʸϽλ(Ͽ޷λ)ϵҤɬפޤ(ºݤˡ application ǤϵҤƤޤ)

tray ˳Ǽ data  TRAYREC ¤ΤˤΤ˵ҤƤޤ 1 Ǥ1 record ޤ
ޤʸϷ޷ɽˡɬǽʸϳϥȤ޷ϥȤǼ졢ξǼʹߤ record ʸ/Ȥ¤Ӥ䡢޷/Ȥ¤ӡʸʤɤ򵭽ҤƤޤΤǡǤ 2 record ϻĤȤˤʤޤ

 application ǤϰʲΤ褦˳ǼƤޤ

{
	TRAYREC	trec[2];		// 2 record Ȥ(ʸϳϥȤʸΤ)

	// 0  record (ʸϳϥȤˤꡢʸϷ)
	trec[0].id = TS_TEXT;		// ʸϳϥ
	trec[0].len = sizeof(TEXTSEG);	//  record Ƥ TEXTSEG ĹΤߤȤ
	trec[0].dt = reinterpret_cast<B*>(&head);	// 
	// record  ID  TAD /Ȥξ硢(TRAYREC.dt)  segment IDĹνʬȤʤޤ
	// ϡTRAYREC.id  TRAYREC.len ǤǤ˵ҤƤ٤Ǥ

	// 1  record (ºݤʸ)
	trec[1].id = TR_TEXT;		// ʸ/Ȥʸ record 
	trec[1].len = tc_strlen(str) * sizeof(TC);	// ʸĹ(byte ñ)
	trec[1].dt = reinterpret_cast<B*>(str);	// ʸ
	// ID  TR_TEXT Ȥ硢ƤΤΤϽ TAD ʸϤƤȤʤޤ
	// ΤᡢʸϷϤ/Ȥϡsegment ID  segmet Ĺ⵭ҤʤФʤޤ
}

ǡtpsh_dat() ȯԤƤޤ API  tray  data Ǽޤ

ơޤǤǤϡtray ʣ̤Ǥtray ˰ưˡưƤΤϡapplication Ǥˤʤޤ
 application ξ硢tray ʣ̤ǡccut_txt() ȯԤ礬褦ˤƤޤ API  TB_PARTS ϰϤʸȤΤǤ
Ĥޤꡢtray ƤǼ(ʣ)ǡоݤ TB_PARTS ʸȤȤ򤷤Ƥޤ
ΤȤǤapplication ǤΤ褦ˤŪ˺򤷤ʤ¤ꡢȥ졼˰ưȤˤϤʤޤ

3.3.2. ȥ졼ͳȥ졼ʣ/ưμ

ϡɥ饦ɥϰϤĤǰư/ʣ̤ȤȤ̣Ƥޤ
 application ǸСwindow  TB_PARTS ϰϤʸĤǡ¾Υɥ(ȤСѻȤ)ˤäƤȤȤˤʤޤ

λ tray ȤΤͳȤΤ˽Ҥ٤ޤŪ˰ tray  tray Ʊ褦ʤΤǤΤᡢǼ data Ҥޤtray ؤγǼƱȤʤޤ
Ǥ tray ͳ硢ǼƤưۤʤޤ
ʲ˼򼨤ޤ

	1. tray ˳Ǽ data 
	2.  tray ˳Ǽ(tray ˳Ǽ tpsh_dat() Ǥ tray ξ tset_dat() ˤʤޤ)
	3. ʣ/ư window Ф(Τˤϡ window Ƥ application Ф) tray ͳˤʣ/ưԤȤ(׵)
	   (λ׵ᤵ줿¦ϡƤ⤤Τɤ׵ᤷƤ¦ʤФʤޤ󤬡ΤȤˤĤƤϸޤ)
	4. [3.] ׵ᤷƤֻԤ
	5. [4.] ֻäơƤ館ΤǤСμƤ줿 window  focus ܤ
	   (λưǤäΤʤ顢žƤޤ[ȥ졼ذư] ƱȤˤʤޤΰư˺ݤơ֤ޤΤȤˤĤƤޤ)
	6. [4.] ֻäơƤ館ʤäΤʤ顢 tray Ƥä(window  focus ܤưˤȯԤʤ)
	7. [4.] ֻʤä(ַвᤷƤ⡢ֻʤ)⡢[6.] Ʊ֤ͤȤ

 applicaition ΰ tray ͳưˤĤƤϡʾμ̤˼Ƥޤ
ơ [3.]  [5.] ǡָޤפȤޤ줾졢ʲޤ

	[3.] ˤĤ
		׵ƤϡŪˡ׵ᤵ줿 application ˽ܤƤޤ
		ϡ׵ᤵ줿¦ tray ͳƤƤ⤤ɤȽǤ٤ΤΤǤ(ɬפ data פʤΤʤΤǤ顢 application ˤȤäƤϼʤΤǤʤݤɬפޤ)
		Τᡢwindow  application Ǥϡɬ׵Ф̳ޤ(ϱؤε̳ǤäơƤ data ɤǧμε̳ǤϤޤ󡣾˼ʤΤǤС W_NAK 򤹤ФǤ)
		ޤ׵᤹¦ȤƤ⡢׵ᤵ줿¦ž褦ȤƤƤ˱ơƤȽǤ褦ˤƤ١ɬžƤ tray ˳ǼʤФʤޤ
		;̤Ǥɽ׻ǰ tray ͳʣ/ưݡꤹѥͥ뤬ˡ[ʣ/ưǤޤǤ]Ȥٹѥͥ뤬Ȥޤž褬 []ʪ Τ褦ʡɬƤʤ褦ʤΤǤ⡢˷ѥͥ뤬ޤϾ嵭Τ褦ˡ tray žƤǼƤʤФʤʤ٤Ǥ
		ʤ׵ݤˡ application ǤϡWEVENT.s.time  PD ֤ǼƤޤ OS ͤȤ櫓ǤϤʤB-right/V γĥͤȤ󾧤ƤΤǤ
		 tray ͳξ硢ȤϤ뤳ȤˤʤޤλŽȤơ[ȤγѤȤ] Τ [PD ֤ΤΤȤ] ΤȾˤäѤäƤޤΤᡢWEVENT.s.pos ˤϡȤγ(ɬȤޤ)Ǽ WEVENT.s.time Ž window ǤкɸǼޤܤ[Ķ(B-right/V)ͽ][3 饤֥][2 ץꥱ饤֥][2.3 ɥ٥][evt_loop ٥ȥ롼׽]ˤƽҤ٤Ƥޤ
		(ʤ application ξ硢ξͤƱˤʤ褦ˤʤäƤޤ)
	[5.] ˤĤ
		[3.] ȤϢΤǤapplication ˤäƤϡưǤäƤ⡢˰ưȤϤʤ褦ˤƤ礬ޤ
		ȤС桼Ķ [Ѽ̾]  TB_PARTS Фơʸư褦ȤǤ⡢ưʸϤϺޤ
		ϡʣ/ư줿¦[ưǤ⸵ƤϺʤۤ褤] ʣ/ưƤ뤳Ȥˤޤ
		 application Ǥ⡢Ԥθ wevt.s.pos ƤɾƤޤǡwevt.s.pos  {0x8000, 0x8000} Ǥäϡ[ưǤ⸵Ƥʤ褤] ʣ/ư褫줿Ȥ̣Ƥޤ
		ʤνˤĤƤ⡢OS ͤƤΤǤϤʤB-right/V γĥͤȤ󾧤ƤΤǤ[Ķ(B-right/V)ͽ][3 饤֥][2 ץꥱ饤֥][2.3 ɥ٥][evt_loop ٥ȥ롼׽]ˤƽҤ٤Ƥޤ§ȤơνϼƤ٤ȸޤ

3.3.3. ȥ졼ʣ/ưμ

ϡ˥塼 [Խ]-[ȥ졼ʣ]  [Խ]-[ȥ졼ư] ȤƼƤ뤳ȤؤɤǤ application Ǥ⤽äƤޤ
Ūˡtray ǼƤƤ硢ɬ tray ˺Ǹ˳Ǽ줿Ƥ뤳ȤȤʤäƤޤ(stack ưȤȤǤLast In First Out Ȥ櫓Ǥ)(API ƤӽФ[ȥ졼]ʪ tray ν֤촹뤳ȤǽǤ)
 tray ˳ǼƤ data ȤΤϡ͡ application ǼƤ뤿ᡢɬ⡢ߤ(ФΤ)ǼƤȤϸ¤ޤ
Τᡢtray Ф硢ƤФƤΤɤȽǤǡ򤷤ʤФʤޤ

 application ξ硢TB_PARTS ФŽळȤǤʤᡢʸΤߤμФȤƤޤڤ/ȤӽƤޤ
ξǡФƤͭ(Ĥޤʸ)äΤǤСTB_PARTS Фơcins_txt() ȯԤԤ路ƤޤˡưäΤǤСtdel_dat() ȯԤtray Ƭˤ(Ф)Ƥޤΰưȼϡȥ졼ФԤä application ǹԤʤФʤޤ
դ˼Фʤäϡä˽Ϥʤޤ( application Ǥ TRAYOPE::pop_tray() ֤ͤߤơФƤʤϡٹѥͥ򳫤褦ˤƤޤ)

3.3.4. ȥ졼ͳȥ졼ʣ/ưμ

ϡ¾ΥɥŽޤ줿νΤȤ̣ޤ
νˡŽ߸ [줫餳ξФơƤŽ] ȤȤã(׵)졢ȼäȯ event ȤʤäƤޤ
ΤᡢʲμéäơƤȤȤʤޤ

	1. Žߤ׵ᤵ줿 window ǧ
	   ʣ window  application ä硢ɤ window ФƹԤ줿ǧʤФʤޤ
	   ϡŽФɸϡŽ window кɸɽΤǤ뤿ᡢɤ window ʤΤǧʤȡäŽޤ뤳Ȥˤʤ뤿Ǥ
	   ޤŽߤƤ̵̣ window ξϡλ W_NAK ֤褦ˤޤ
	2. Žκɸǧ
	   ҤޤŽκɸ window кɸǤ application ǤϡŽ TB_PARTS ʤΤǤ parts Ĥ뤿ᡢɤФ褦ȤƤΤĴ٤ʤȤޤ
	   ޤPD  TB_PARTS ʳξä硢ȤŬڤȽǤ褦ˤƤޤΤᡢcfnd_par() ȯԤPD ֤˹ä parts õơȤŬڤȽǤƤޤ
	   Ŭڤʤ顢λ W_NAK ֤褦ˤޤ
	   ʤߤˡ application Ǥ WEVENT.s.time ɸФƤޤ˽Ҥ٤ޤ褦ˡlibapp 󾧤Ƥɸλ§뤿Ǥ
	3. ŽƤǧ
	    tray ƤƤƤɤ( application ǸСʸ󤬤뤫ɤ)Ƚꤷޤ
	   λϡƤĴ٤ǡºݤϤޤԤΤǤϤޤ󡣤 application ˸¤ʤäǤʣ TAD ʸϤŽȤơlayout ˻֤ä硢Ž׵򤷤¦(׵ḵ)Ǥϰ֡ԤäƤޤ֤Τ򤷤Ƥޤä٤ˡ֤вᤷƤޤȡ׵ḵǤ [Ԥ] ȽǤ뤿ᡢʽϤ᡹˱ʤФʤޤ
	4. 
	   ϡ줿ɤܤǤ˽Ҥ٤ޤ̤ꡢưǤ [ƤϺʤ] ȤȤ˴ޤޤޤ
	    application ǤϡW_ACK κݤ wevt.s.pos  {0x8000, 0x8000} ͿƤޤ libapp 󾧤Ƥ§äƤޤ

ޤޤǤǱ򤷤ȤˤʤޤޤºݤŽ߽ԤƤޤ
ºݤŽޤ줿ƤФΤϡ window  active ˤʤäݤ˹Ԥ褦ˤƤޤEVTOPE::evt_chgsts()(Ѳ)  W_SWITCH νҤƤޤŽ׵Ʊ硢׵ḵ׵ window  active ˤޤϡ event äݤνɽƤ櫓Ǥ
ˡŽ׵硢Ž׵ƤȤȤȡκݤŽκɸ򵭲ƤΤǤƤ˴Ťơ tray ФԤ򤷤ޤ
Ȥǡ tray μФǤϤ tray ؤƱˡޤtray Ф tpop_dat() Ǥ tray ξ tget_dat() Ȥʤޤ
ޤ tray ξ硢 tray ФƤκȤΤϡФ application ǤȤʤޤ(ϡŽ߸ application Ž׵Фȡ׵ focus ܤƤ뤿ᡢ inactive ȤʤäƤꡢԤʤ֤äƤ뤿Ǥ)Τᡢ tray μФϡɬ tset_dat()  NULL ȯԤ tray Ƥ˴ʤФʤޤ

3.3.5.  process Ǥ drag ʣ/ư

ȤǤޤǤΤȤϡ¾ process ֤ǹԤʣ/ưȤʤޤ
⤷嵭ư process ǹԤäȤȡʣ/ư׵ФƱԤäʳǡߤޤäƤޤޤ
׵ȡλǰԤĤȤˤʤޤλ׵ᤵ줿¦Ž׵ event ȯϤǤ줬ʬȤȡ event ȯƤƤԤäƤ١event 뤳ȤǤޤ
Ԥʤ褦ˤȤevent loop  task ̤ˤȤвǤ뤫Τޤ󤬡ʣˤʤǡؤޤ
ǤΤǡΤ褦ʣʤȤϹͤˡäȳڤʼʤȤޤ

 process ǹԤȤȤϡƼʬǹԤФΤȤǤΤǡŽ褬ʬȤäΤǤС̤ tset_dat() 򤷤 wsnd_evt() 򤷤ʤƤ⡢ʣ/ưƤľŪкѤΤȤǤ
ǤΤǡ application Ǥ⡢TB_PARTS ʣ/ư褬ʬȤäϡ褬¾ TB_PARTS ɤǧơ⤷äΤʤ顢ccut_txt() - cins_txt() 򤹤ȯԤ褦ˤƤޤ(MAINWIN::str_move() νǤ)

3.5. event loop νλȡλǧѥͥ

evt_loop() λˤϡevt_loop() ƤФ줿 event ؿ 0 ʳ֤ͤȤˤꡢλ뤳ȤǤޤäŪʰ۾郎ȯǤʤ¤ꡢevt_loop() ϽλΤǤϤޤ
̾β evt_loop() λȤΤޤȤСɥΥԥȥ֥륯åꡢ[λ] ˥塼򤷤ʤɡξ̾ǡevt_loop() λapplication λ뤳Ȥˤʤޤ
ޤOS 齪λ׵ᤵȤΤ⤢ޤ(ϡOS λˡ¹ application Фơλ׵᤬ޤ)ξˤ⡢evt_loop() λapplication λʤȡOS ĤޤǷФäƤ⽪λǤʤȤȤˤʤޤ

libapp  evt_loop() Ǥϡ̾νλ׵ˤĤƤϡevent ΰĤȤƽ褦ˤƤޤޤ׵˴Ťơºݤ evt_loop() λapplication λƤ褤κǽŪȽǤϡapplication Ǥ蘆褦ˤʤäƤޤ
ɥ٥ȴؿơ֥(WFUNCREC) finfn ȤΤޤ줬λ׵event ΰĤȤ application ãʬȤʤäƤޤ
δؿϡʲηޤ

//
// λ׵
//
// ix : application γƤ window ֹ(wid ǤϤʤ)
//      WINFOREC(ɥ쥳)ֹȤʤ
// mode : λ׵
//        0 : ̾νλ׵(ɥΥԥȥ֥륯åˤ)
//	  1 : OS  W_DELETE ׵ᤵ줿ξ硢ԽƤѹСѹȿǤƽλ롣ξ硢λǧѥͥϽФʤ
//	  2 : OS  W_FINISH ׵ᤵ줿ξ硢ԽƤѹǡ˴ؤʤ̤Ѵƽλ롣ξ⡢λǧѥͥϽФΤǤϤʤ
//
W	evt_finish(W ix, W mode)
{
	W	rv;

	rv = 1;				// ̤Ͻλ

	switch (mode) {
		case 1:			// W_DELETE ׵(¸λ׵)
			break;
		case 2:			// W_FINISH ׵(¸λ׵)
			break;
		default:
		case 0:			// ¾(Ūʽλˡ)
			break;
	}

	return rv;
}

äˡ application Ǥϡ̤νλˡȤä硢ƤѹСǧ򤷤ǽλ褦ˤƤޤ
λλǧѥͥ򳫤ơ֤ͤǰʤƤƽλμʤɤǧ褦ˤƤޤ
 panel  WALLCHG(ɻѹ) ǡpanel αˡˤĤƾƤޤ application Ǥϼºݤˤ panel ơѤ褦ˤƤޤ

ʲˡpanel ƤǺܤޤ

-- databox Ǥ parts 
.BASE = 0H

.sw_cancel:	MS_PARTS
		{0+CU	0	16*5+8	16+8}
		0L	OFFSET:L+4
		MC_STR	"ä"
		0

.sw_destroy:	MS_PARTS
		{0+CU	0	16*7	16+8}
		0L	OFFSET:L+4
		MC_STR	"Ѵƽλ"
		0

.sw_update:	MS_PARTS
		{0+CU	0	16*7	16+8}
		0L	OFFSET:L+4
		MC_STR	"ƽλ"
		0

-- databox Ǥ panel 
.BASE = 0L
.str_update:	"ߤƤϸƤȰۤʤäƤޤɤޤ\0"
.pnl_update:	TEXT+pMID			str_update
		PART+pIN0+pNXT			sw_cancel
		PART+pIN1+pMID+pNXT		sw_destroy
		PART+pIN2+pRIT+pDEF+pEND	sw_update

[ä]  ֹ 0 Ȥ[Ѵƽλ]  1[ƽλ]  2 ͿƤޤ
Τ褦ǡevt_finish Ǥνλǧ panel ϰʲΤ褦ˤƱѤƤޤ

// panel α
{
	switch (panel(DBOX::PNL_UPDATE)) {
		default:
		case 0:			// [ä]
			rv = 0;		// λʤ
			break;
		case 1:			// [Ѵƽλ]
			def = true;	// ưƤ᤹
			break;
		case 2:			// [ƽλ]
			break;
	}

	return rv;
}

panel() Ǥϡclick 줿ܤֹؿ֤ͤȤޤΤǡΤ褦ʱѤ򤹤櫓Ǥ
[ä] ξϡλݤޤΤǡevt_finish() ֤ͤ 0 ˤʤ褦ˤƤޤˤꡢevt_loop() νλݤ뤳ȤǤޤ
ޤ[Ѵƽλ] ϡꤷƤ application ưľξ֤᤹Ȥ̣ƤޤΤǡθνǸ褦 flag ΩƤƤޤ(ϡevt_loop() ֤ͤȤơ᤹ͤȤ̣ƤˤȤ(0 ʤ¸ƽλ1 ʤѴƽλʤ)Ȥˡ⤢ޤ)

 application Ǥ evt_finish() μºݤƤϾ嵭Ȥϰۤʤޤ(λǧѥͥľǡƤѹǧѹʤгǧʤǽλ褦ˤƤޤ)ޤˤޤȰʾΤ褦ư򤷤Ƥޤ

3.6.  source  class ΰ̣礤

 source ڤ class ϰʲΤ褦ʬवƤޤ

main.h / main.cc
	MAIN() бʬǤ
	ưˡ˴Ťơapplication  class Ƥ㤨褦ˤƤޤ
	ޤapplication μ¹Ԥɬפʺ٤νԤޤ

appl.h / appl.cc / appl_ex.cc / appl_fsn.cc
	PARSAMP_APPL / PARSAMP_EXREQ / PARSAMP_FSNREQ Ȥ class ФʬǤ줾졢ʲ䤬ޤ
	PARSAMP_APPL  application  class ȤƤδ class ˤʤޤappl.cc ˼ºݤ code ¸ߤޤ
	PARSAMP_EXREQ ϲȤΥץưб class Ǥappl_ex.cc ˼ºݤ code ¸ߤޤ
	PARSAMP_FSNREQ 䵤Υץưб class Ǥappl_fsn.cc ˼ºݤ code ¸ߤޤ

fusen.h / fusen.cc
	FUSEN Ȥ class ФʬǤ class 䵸ͭǡνԤ٤ʬǤ
	 class ȡ䵸ͭǡưεǽ䵤ޤ䵸ͭǡؤν񤭹ߤŪ˸ƤӽФɬפ褦ˤƤޤ(destructor ǽ񤭹ߤϤޤ󤷡destructor μݤȿޤ)
	ޤ䵸ͭǡγƤ¾ application γƴؿǼѹݤ interface ޤ(ؤɤξ硢inline ؿ褦ˤƤޤ)

guiope.h / guiope.cc
	GUIOPE Ȥ class ФʬǤ class  EVTOPE / MAINWIN / MAINMENU ȸäGUI Ϣ object ٤ʬǤ

evtope.h / evtope.cc
	EVTOPE Ȥ class ФʬǤ
	event loop  libapp  evt_loop() Ѥ١ event ؿ static 줿ΤȤʤäƤޤ

mainwin.h / mainwin.cc
	MAINWIN Ȥ class ФʬǤ class ϼ祦ɥδԤwindow event ν̤Ԥޤ

mainmenu.h / mainmenu.cc
	MAINMENU Ȥ class ФʬǤ
	menu λ񸻤δΰ٤ˡconstructor  / destructor ޤ menu ؿ libapp ͳ뤿ᡢstatic Ƥޤ

trayope.h / trayope.cc
	TRAYOPE Ȥ class ФʬǤ
	 application Ǥϡȥ졼ؤʣ/ưȥ졼ʣ/ưξƤޤTB_PARTS ǤʸΤߤ˸ꤵƤޤ

cval.h
	CVAL Ȥ namespace ФʬǤ namespace ˤΤѤΤǤ

struct.h
	Ĥ struct ԤʬǤŪˡC δؿؤΰϤ(library ؤΰϤ)ԤɬפꡢŪ˻ȤƤǤˡ header 褦ˤƤޤ

val.h
	ѿѤޤ
	 application Ǥ PARSAMP_APPL  object ؤ pointer Τߤ򤷤Ƥޤ

dbox.h
	DBOX Ȥ namespace ФʬǤ namespace Ǥϡdatabox λֹ򡢳ʬ enum Ƕʬ褦ˤƤޤ

err.h
	PARSAMPERR Ȥ namespace ФʬǤ namespace Ǥϡ application Ǥ error code ȤƹԤȤˤƤޤ

except.h
	Ƽ㳰Ԥޤ application Ǥϡʲ㳰Ƥޤ
	PARSAMP_EXCEPT
		 application Ǥ㳰δ class
	EXCEPT_EXECMSG
		ưˡ
	EXCEPT_INITERR
		application νǤ㳰
	EXCEPT_FUSEN
		䵸ͭǡ㳰
	EXCEPT_MAINWIN
		祦ɥǤ㳰
	EXCEPT_MAINMENU
		ᥤ˥塼Ǥ㳰

macro.h
	macro Ǥ application Ǥϡ䵸ͭǡνͤΤߤƤޤ

debug.h
	debug  macro ʤɤǤdebug mesage ɽѤ printf() Ф macro 򤷤Ƥޤ
	compile option  -DDEBUG Ƥʤȡdebug message Фʤ褦ˤƤޤ




4. 䵭

BTRON3 ͤǤ parts μ¹Ԥˤϡcexe_par() ȤΤ⤢ޤˤĤƤϼ夲ޤǤ API ϡbox  parts Ǥ⡢¹Ծ֤äƤ parts  event loop ǻߤޤʤȤĹޤ
ϡ application ǸСSB_PARTS  VL_PARTS ϢȤʬǻȤȤǤޤ
 application ǤϡVL_PARTS ͤưɽơSB_PARTS ͤѤ褦ˤʤäƤޤSB_PARTS ͤѹƤ⡢VL_PARTS ˤϤȿǤƤޤ󡣤ϡcact_par() ǤϡSB_PARTS μ¹Ծ֤ȡparts  event loop ꡢͤڤؤƤ⤽ event loop ȴƤʤᡢͤȿǤǤʤȤˤʤޤ event loop  parts μ¹Ԥ˴طΤʤ event ȯޤ³ᡢä event ȯơparts ¹Ծ֤򳰤ƽơVL_PARTS ؤȿǤǤ֤ˤʤ褦ˤʤäƤޤ
򤹤ˤ cexe_par() ˤäơevent loop ǻߤޤʤ褦ˤޤ

㤨С application  SB_PARTS μ¹ʬʲΤ褦ˤޤ

//
//  SB_PARTS ưؿ
//
ERR	MAINWIN::p_sb_size_fn(W pid, W pidx)
{
	ERR	er;

	er = ER_OK;
	actbox = pidx;
	if ((wevt.s.type == EV_KEYDWN) || (wevt.s.type == EV_AUTKEY)) {
		// KC_TAB λϻ˼Фƽ򤹤ޤ
		if (wevt.e.data.key.code == KC_TAB) {
			actbox = PTIDX_TB_STR1;
			goto EXIT;
		}
		//... P_EMPHAS ΤΤСKC_NL Ƚꤹ .../
	}

	// parts μ¹
	W	sts;

	sts = cexe_par(pid, &wevt);
	if (sts <= ER_OK) {
		// äƤʤ
		er = sts;
	} else {
		// (P_EVENT ãƤ)
		W	val;

		cget_val(pid, 1, &val);
		if (val != appl->fsn->get_size()) {
			// ͤѤäƤȿǤ
			appl->fsn->set_size(val);
			par_setup(PTMASK(PTIDX_VL_SIZE));	// ĴưƤ VL_PARTS 
		}
	}

EXIT:
	return er;
}

cact_par() ξȤϡʤưѤޤ(Ūˡcexe_par()  box  parts ξϡP_EVENT ֤ͤȤͿƤޤΤᡢĤλν cexe_par() ˤʤФʤʤ礬ޤǤϡP_TAB ν֤˹Ԥ褦ˤ뤿ˡEV_KEYDWN ʤ EV_AUTKEY ˤ KC_TAB ɤߤ褦ˤƤޤ)v
ˡkey ϽʲΤ褦ˤʤФʤޤ([Ѵ][̵Ѵ] 䡢Ϥ⡢event ȤŪãʤϤʤޤ)

//
// Ͻ(window event)
//
W	MAINWIN::key_fn()
{
	W	rv;

	rv = ER_OK;
	if (actbox == PTIDX_SB_SIZE) {
		// ߼¹ΤΤ size  SB_PARTS ʤ顢key event 
		rv = (this->*par_fn[actbox])(parts[actbox].desc, actbox);
	}

	return rv;
}

ʤ[][]  press Ƥ֤ cexe_par()  event loop ˤޤΤǡλ VL_PARTS ͤꤹ֤ޤ
ϡ#ifdef SB_CEXE_USE - #else - #endif ǳƤޤΤǡcompile option  -DSB_CEXE_USE ղäСưǧǤޤ

TB_PARTS / NB_PARTS / XB_PARTS ˤĤƤ⡢SB_PARTS Ʊͤ box  parts Ǥꡢ cexe_par() ʻѤ뤳Ȥˤꡢ༡ƤǤ褦ˤʤޤ嵭Τ褦 cact_par() ξȤ礭Ѥޤ

