topic "GUI Tutorial"; [2 $$0,0#00000000000000000000000000000000:Default] [l288;i1120;a17;O9;~~~.1408;2 $$1,0#10431211400427159095818037425705:param] [a83;*R6 $$2,5#31310162474203024125188417583966:caption] [H4;b83;*4 $$3,5#07864147445237544204411237157677:title] [i288;O9;C2 $$4,6#40027414424643823182269349404212:item] [b42;a42;2 $$5,5#45413000475342174754091244180557:text] [l288;b17;a17;2 $$6,6#27521748481378242620020725143825:desc] [l321;tC@5;1 $$7,7#20902679421464641399138805415013:code] [b2503;2 $$8,0#65142375456100023862071332075487:separator] [*@(0.0.255)2 $$9,0#83433469410354161042741608181528:base] [tC2 $$10,0#37138531426314131251341829483380:class] [l288;a17;*1 $$11,11#70004532496200323422659154056402:requirement] [i417;b42;a42;O9;~~~.416;2 $$12,12#10566046415157235020018451313112:tparam] [b167;C2 $$13,13#92430459443460461911108080531343:item1] [i288;a42;O9;C2 $$14,14#77422149456609303542238260500223:item2] [*@2$(0.128.128)2 $$15,15#34511555403152284025741354420178:NewsDate] [l321;*C$7;2 $$16,16#03451589433145915344929335295360:result] [l321;b83;a83;*C$7;2 $$17,17#07531550463529505371228428965313:result`-line] [l160;*tC+117 $$18,5#88603949442205825958800053222425:package`-title] [2 $$19,0#53580023442335529039900623488521:gap] [tC2 $$20,20#70211524482531209251820423858195:class`-nested] [b50;2 $$21,21#03324558446220344731010354752573:Par] [{_}%EN-US [s2; GUI Tutorial&] [s3; 1.GUI application main function&] [s5; To hide platform specific differences, U`+`+ GUI application main function is defined using [* GUI`_APP`_MAIN] macro:&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; [* GUI`_APP`_MAIN] `{&] [s7; -|PromptOK(`"Hello world`");&] [s7; `}&] [s7; &] [s5;= @@image:880&643 흋ДؚՐ᠒ѣ憒̼㢗 Ǩѓċҁєďޟƽϗ⯂ 酼񊾮ҭܭߏͤəۯ㴦ڔΌ֡ ذ˫ַޛτӓ鍤獴 朸쾨ꯃ࿬͸ɔ蹉؁֌ЂӁ͊̄ȤӒٍ ٮ˸ՁಈƂϲ熮ۗ օόɫɲ䒀ʮ겧櫲˂顱Ή ݥ؎ܲ߁؏Āͯ²؄ɐ硔ǂ ցߩ郓˪ꚄƆΏਖ윒΀ͧ󊁟Թ˙ ߄􍏽ҭץꗦҧ֭ǀꒆ䃊Ƙ̢ ¿޾ȇßӌ傉ރԗהȉӀ򯾬ط׆ҭט ߿źחխѮّѕرáںҚګҍ Ƞﲏ†όԞضﱔذܝв¿ڂݚ֬ ר郾茚Ώċغã܌Է̾߳ʷ Ӵى̘ԃΟëȇϝ͆Œǎԃţه ֲȕ䨽ٝݿΔѫΛ̙ؒ噃 ȐɈˀƤҊûާʫČ֑ӂݫʈ ̲խ揧ߚ·ȉ̓הܯއƇԉ ޻ҊǾᴀ󉷳զץǩɣߒٞӇŇ ü샑̠܆Ղ҇ĊоدݑȄтņ 򾊸ľ̗ÈǾ銎໎蓒Ň͐̋警ס̯ ͌ɇؒĊԝͺ֭ʌޕߵڲ̾Ūߣх ДʙҪɡߥٹ⩣ϻ群ͅ ȹꍊȇصdz琺ݭڲ ёП浤ЍĿֆٍ̾瓛 ɕ⫠ʒՂצ֭̂ܦ蓪Ͱ̔ ߒº鵤͛冹ݮ扛ɹߔɡ돒ĐŅӼͫ żŃԥʻ㑰Ê䃁矁潐 ϠؖκԌšLJ뫠ە隘峴㬲ӭ̯Ê ᷢ꛰æޅʹ۱ø徔߱ ͞ևҀ󩈕Հϭ݊˒ǪҔ품ݢ ㇇鱒䭾؆Ѿ൴ȼՏۑ܂Ï ѻ٫Ń܃ֱ،Υָ٩̭Ǒњ 猉Ѻиʟȯڇ仵ߟڛʼnݙ̏耧ޖն 췰鐓署ƝƇᜀן߂ܡ¾ۖą萓ӉɊӛ ̤զԨӥƨǡ閄쁝ղÿС 虈߲셅腴ᨎٯʚӦּܑҨ͇ڈ ◴ȇػȉ־܉ˉɽ͝ گữҘʗɝ坊ƴ˟إɡߍ̷̜󊛫֡Ȇ ̇ɨɀ۟Ч폌áЮ ˝Ȋռ䬃筌㋗ïґċƏͫ ڭӁ؀ޝ⁤̩΍̮〉ێՈÄ 윗DŽڰدۡڕކތ΁хϖ ß򑑏ޑ߄ޱ뫬ҍϐ¾ְ̇ ̇蜛İ蘏ءѶĿɇΝ ܾ׃ٟׅџͅǚ㚉Ȇۢܒ졲 Ëʈʈœ𑲛áԿ޲ ̇񠾸ᚏ̉࿊䮥ۼͺᾸ޿杧 Ѣ™ؗĴȇߜ䃓Ü݇ σ͟ڭ˹Ф΂颛ٟ羸߻׹ əʎ괐ͱŒ͙ߞդ ѫ‘흊ᯁǭѦȖҍ԰ 埌攉оȥɢƳ߾Æȓ惃ᾰј惃ᾰ蘏 İ蘏惃̇̇а惃ܽ˥Ν ˃㽒׬Ȓ׭ٻիӡʾܰȀ ůꇍ‡ϾʴՂסٺ® 񴏐̇ྸニӚΦӾ߿ LJЎϡ՟Ýʢς荘¹܇ ¹팇ܻ惻鏃܇ ߭џ럤㰟Ƈᡘϖ㰜蜵ޅӾ Ϲ̇ޓɆٯ凉޲ןȐݎۂ ܽ䨏啮ؤ탄Ǵ臆 炒㫂欚ܴƣȰއ率ќ⏅ˆت¯˅ҟ Чɭā &] [s5;= &] [s3; 2. Application window&] [s5; Application top`-level windows are of [* TopWindow] class. You can run modal event loop for [* TopWindow] using the [* Run] or [* Execute] methods. Both methods open the window if it is not yet open (you can also open it using [* Open] or [* OpenMain]). Unlike [* Run], [* Execute] also closes the window at the end of modal loop. [* TopWindow] is also closed by destructor.&] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN `{&] [s7; -|[* TopWindow] w;&] [s7; -|w.[* Run]();&] [s7; `}&] [s5; &] [s5;= @@image:1920&1324 לםᳰѪ؆˝є֚ ɓڴجЇԅՊހܳ󎞜 ޳Բ̬ɭ˹֬Ҟ顋އݰܩ۶ þɌ̣ƭݻϜۺ 鼿乲͚ݯ֏ҹƏϬ׳酝 ̳ɧϗ޳ɢҩɵ͚ړǬܕֿ ؘ孙΃ڷƬɭ ĥۖغۦۚҲμ䶞Ҋӗعݙ ٻ枯ҰͣߙմնڳŔٴ氿۱ ϫϞ끠ҥر۽ݴӞÞԇ֮է ʓچʀՃϮʕӝ˧ڗޜ 㹭ןؾמߤ笟ؿ֌Ȟߙӌܕ ׾̦ۯËͧǫۚ 븨Ïܿݴɻۀҝϼ닎Ѷν Ňֿݽӧٝ߹źȦ æ¦ ޯҾ̷ִʎ䶅Ľ֮ ť促糯ܖ𵷴ͼٰ۟ҚȻ ےɝȷ׿콷眯Ƕҿчߺ¨韀 ᝡӵ޺ܼҭΑз Ҿ޸ق߳匞ɎڊܱǢ˫ιޓćҿ ؟Ѭֿםʅ۽˒ؿލ˱۶݂Ƴ ڛמϥۏܿٷ䃿܋𖕣叢 繬͙ι͚ϩȾΧ ̙哹ѫϦLJà޾ܾ󲫠ܿ Ϯ꼽񥧺ʐٛŕͬߛɔڃ ̚Юفݟﮯݟ㟻Ӷ͸ϔܖ ֤ݾӗ׼־ަշƭߞޭݽϞ€ˢΝ̥ 翮򞩯ߵ׎ͦˍΦ́ ܠ酓恨Äꞛ麥 ݏΦϿظ۞鯀ηƏȿɥˁ㪥Լꯕ׏ Ֆؤߚ˫ߎϠΞסȣ ǩЕᚸů˟ 娯ɽ˧ޫڿꟹҴֿ쪈îջ 邥ۈ֪Ƣܝ׽΅ˮUʩ˦ 󄞅ҳ׽헏ٵћݯڻƑʱرߡ Ⅵǟ⶛Ѯطᧅ͓캽ҍӏňљ ʿΒړ繸􀜞㹏ݱ汩̼ˌ ڶݽ׎ Ƙ֎޳퉟ϻļܼÓƌǯٌφꞹ ز݅꛸ӝᘪͅɫ饃 ݛ෰✖տѩ߬ ɢڲʲߩ¶̿ʀϐˠមؚܽ˚ڲꯘ ӳڡ۫̕ڻ۲ˠ ¦ھރ㎒˞щͻ쇀˦􏀐 ѿ蟀ģŀ􏀐ѿєĐԑꟀ Ġģ損ѐ萟ģâѿ 蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ є۷Ȁ蟀ģ􏀐ѿȀ蟈 ̀ѿʀѡ蟀ģ􏀐ѿ蟀 ģŀ􏀐ѿֿġ損ѐ ģâѿєӫɸŀ􏀐ѿ ƙ蟀Ġģ損ѐє؍ 蟀ȃģ􏀐ѿҴ蟀ģ􏀐ѿ ĐϢ􏀐ѿȀ蟈ĩ̀ѿ ʀѢӻ̀ѿʀѡ蟀ģ􏀐ѿ 蟀տҨ蟀ģ􏀐ѿ Ȁ蟈ĩ耐ѿÞѿ蟀ȃģ􏀐 ѿҴ蟀ģ􏀐ӍĐ瓙п 蟀Ġģ損ѐ萟ģϳ ĩ̀ѿʀѡ蟀ģ􏀐ѿ 蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ 萟ģâѿ蟀ȃģ􏀐ѿ Ҵ蟀ģ􏀐ѿȀ蟈ĩ̀ ѿʀѡ蟀ģ􏀐ѿ蟀ģŀ􏀐 ѿŀ􏀐ѿƙ蟀Ġģ損 萟ēԷâѿ蟀ȃģ􏀐 ѿҴ蟀šϭА萟ģ âѿ蟀ȃģ􏀐Ꟁģŀ􏀐ѿ ƙ蟀Ġģ損ѐ蟀ģ 􏀐ѿ蟀ģŀ􏀐ѿڪб􏀐 ѿ蟀ģŀ􏀐ѿƙ蟀Ġģ蒩 􏀐ѿȀ蟈ĩ̀ѿʀѡ蟀 ؀ĐӍ蟀ģ􏀐ѿȀ蟈 ̀Ёۓ􏀐ѿƙ蟀Ġģ 損ѐ萟􏀐Կ蟀ȃģ 􏀐ѿҴ蟀ģ􏀐ѿ􏐀²Ż萟 ģâѿ蟀ȃģ􏀐ѿӿ А萟ģâѿ蟀ȃģ 􏀐Ŀѿƙ蟀Ġģ損ѐ ʖΜʫߨ޷ᯀ߮ȲުڱЕ Нєۭξ֥ݦ법럋󶄀ի &] [s5; &] [s3; 3. Modifying TopWindow properties&] [s5; You can modify properties and behaviour of [* TopWindow] using `"modifier`" methods. Note that modifiers usually return `*this as return value, which results in simplified syntax. You can also setup the size of [* TopWindow] using [* SetRect] (note that unless instructed otherwise, U`+`+ will center the position of window).&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|TopWindow w;&] [s7; -|w.[* Title](`"My application`").[* MinimizeBox]().[* Sizeable]();&] [s7; -|w.[* SetRect](0, 0, 200, 300);&] [s7; -|w.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1040&1669 Ѐ΁݉ؔ񂔄䓵⧈ДРᕣͳ䒓 ˉƙζɖ͍ޗ㪢ĥ֖ Ո穐ҕ²ʈ׈ىءЉӸܬϪƯݵ̉ʹ 쳵뽒ėٓ 䬛جԬ͍ﰥɹ˱꟦ԉ姲ߕǜ𱃓؏ ⛅֩޵ʪڑϱƊܶψҴӜԐږۣӯ ֛֣͊ժʒ⍗쑪ƌՉˮ坽ė┇骱 ׃ɦٍåճ﬜؞֡ڄﺅ࿱׏ գՙ̮˘ΖĴʩވƲƽЛ Ͷ߁봺۽۱ٟΘǛǘɇ͒ Ԉ䃙պ՜򚇥ҼɻԘȔʳӰnj צ卖ԃҮݮݾûӰܒųըΝ깅 ճӷ༲ɖٯٵܹ˕ݩ әӋݑٶҩڐٺޕHΙ ݇ӿϟ起Γ˶ۊ޲ſӎ꿓Ӻ˶ ҶĕȾۼݝϪߵ֥ߑަƍϞ§׾۾敖 Պɶ–Ԇ՞ΔƸ獴ŏٕ ͷĜߦ뛈ޛȞЎ©; ҿӟ컭ԵˮŞڋāݲϔѫ򱷣 Ցϫ҅ӮȽ䳲Ҫ޼ǖ鑰;⽩ ڸ˻ǟ߬ߵԿǹڝ󍓗򂵥Ϳ﷝ Ψ䟳䗿’沫ºʼߦ±֧ ޫݍОڽˆ͚Ϋجݫʟ 嬬ԙʒ̥Ŀެªޔ݇ިϕ䩞 Ӕ圹ѯׇ̻ω߽篜簫翯 ׾߯η⽱ܒ֖냷暟͚ٹӥ ϛַە͵DŽЀͽ Ղ܂ֶǪýˣ߈Ǽɹힴ箶ަ쳚͡ؽ ӥܥ݄윁֘ҏퟞŶؗŦި۴ Ͱɑ멙꿢՟Ȝ«Ћ𿒞عߵĶʚ⫌ͯ Ğ֛يۙ뵰̴ǘۇٞώЏ믈Ϸ싟؜ޤ ϊԽކ彽ܩ󶬗ےյ۫ӷֿȻ료ڮֳۻ ֫ǻ޹޽͵΃ԛ륻ѽҴ Ω˖򺷦جۣͦÏԻ󫪛 ؜ٔ򿩘ם΃ПߓұԎ֭ߑַր׻ۻ Ãֽۻܐ޽稦ܒՓ╮瘅ӔԤұƨƇީ ç٨ܚƎֺ㋙ܙĽܢӏҙ޼ ۍΙμīﳨݕ梯ʹ竤ˌا⋋˲ަφ ˭ٿ͘ڬ᧟줴҆ ί٤Ѻ綹DŽֻĤ۪ʠٵ咥Ӿ蹪ᶣ ӡ۪񛨒꒺ۻç׹ՅϬŵ͜㽱 ̕ߌśٖ䂞Ƿԕ֟Ȧ۞떟 ҂˖ؤ϶閛叕ڬŚɓΫʷ ֧񽏧ݿڟ߭ ׼潺ϬՄȫچڣŽ탒пŧ޽âã•ë ʿ섴軽Է鑲ȏؤȄو륵接ߦ݀ �ߜ֦టݨٮʏٜ۠羺 󏢾鱘ꬳϷ´لܒ͌ʖ܏ Ә澛壎ھ秫ԭݣ۴÷޵ܨ׺䣞᯲֟ Ǯ˨ȫ˫۞㑔س✯Жޮ֙ ЍҼѾºńԤٞܕة۽式 ּ㡶ֿًߗ셲ڲ 竞Ǟ罚ߑްپÛÎζۯӺ齊 ΅膔ߚ㫑Ԭڣ֭ڍȤᾉ׎ оՍӤÌĔՙȶΑó 強ޛħֺؘٸԭٱʖߪ좗潊 ęӫԵⴛסﱘʺ豼̟ جҟſؾʆЏ혘ٰÃ皖ѷȔ 컏ջ׎ڧﭥԄ׮˲˷υú٪ڤՅцݲ㙎ޘ ʙポϔįݺڙ⩾톁ކݲ Ѯ㌲ͷοǬѤ辆󕈏珰 ̿˷œݭ۞Ҳܿ摸ƷƩ٧ Ķ٧Ѱ؊ܣҦÈվ’ٝӽҨ ɳۻܾ峅͖ɪڜύ߮ݱ ㄬۦڼپдÎ⓮Щ嶱صٍ 쵛Ĵ‡ޮض􏩿Ó̃Ώްŵ 閖ߛמƗҲӋə㭽㚝қܲƛе ֡բէԢǕ襎ȵ򼁟ͽưޖ Ӗ۴֩񛌥㛩ْܹĀ ۙŹ΢ċӫʴ݂۷א ȘŚ۴ίַߡֻ׏٬Ȏƺ ︿ۣ׉隉͓˖毱Dzòҵ۸ȵﵼ ʻ鲿ߚЖԬǑ̰ݹݕӮҜ듞˂Ü ؒଶƛ틌΂ָ彗Ъꝓ 賚ٟ軩ӹ¦ܟة잓ӰҩχˮӨ䦱 қӛѦͣӛƦ汹숒ַŔޏ翣ϥۑ ˴ݚ栢۶غخ◁ѷ؛ܟ̎閳뽹 ۟ޏң⍷ʉɳ䣓Ŏ򡉲 殺蟒̽ڡ՝֏ܭڝе ㈡ȦÚȗגξʛܱїŹͶ ۸ϛҍĉޫϱɲܿćѳ ƣڎŗӴ೅˫ߋޠۅ 飡ƾԮՁ삮دłΞǁ ̞ޟþ̇枌ϥϦ؝ɗͼ֧ڜ 캽닍춻䭵ܳڸ풜֋ɭ ա˒ѐ޿͢΍ӭҶ篈ΛꎽƎ遼ד骱ռ Ĵ⥸ޠûʗح뽂ª ߶Šٙ՗Հ܀Ç ֏阒߫ǣ߯ѕˉׅף齁Л ɢߦЛАЛɢުЛ􆃔Л҉ Л􆔬Іҁ􆔁Л齁Л ЛАކϷ荈ހ􍨡ޡߙϺ Л􆆔ЛɢꮿޡހВ ЛЛЧ荭ﯠހ荨ހ 荨ћ߆҉􆔁Л齁ހ荨ހ荨 ހ܂ʼЛ􆆔ЛЛЛ Л􆆔Л􆃔Л҉􆔁Л齁 ЛЛАЛ􆆔Л􆃔Л‰ 荨ހ荨ހ荨Ď齁Лɢ ЛАЛˆþׅހ荨ހ荨 ހ􍨠ޡހ荨ћ齁Л в􆆔Л􆃔Лɢ޺Л Лɢ箿׌ޠހ荨ހʖםޡ ހ荨ћʋ㏡ހ􍨡ޡ荪ћς ހ荨ހͱހ􍨡ޡ荊 Ɨ潍Թᚫޞׅߛ 矕ʝꟘš⽾媎ǣ󰭖ݿ齿 Ӟ߂ &] [s5; &] [s3; 4. Painting the view area&] [s5; In order to display something inside [* TopWindow] view area, you have to create derived class and override [* Paint] method:&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; [* -|virtual void Paint(Draw`& w) `{]&] [s7; [* -|-|w.DrawRect(GetSize(), SWhite);]&] [s7; [* -|-|w.DrawText(20, 20, `"Hello world!`", Arial(30), Magenta);]&] [s7; [* -|`}]&] [s7; -|&] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application`").Zoomable().Sizeable();&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.SetRect(0, 0, 200, 100);&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1040&669 Ѐ흉Ԕ׫Nj₊ăʦ윧䥱 ߒ֦᠘܀ѽХշ߽䴨ą̅ Ďһ˭Щ⼵ĥҫңѡ´曄렂Ȱ ¾ГŰҩØ̩Şڛȋ鴮ˈ ӏޓѓƀͲӛɠ縇ۀֶԯƆ炜Ĩ ċӝԽފօŽ͐鴪ւ̙¼̋튞آဲ ئɭۘԪͥ؊ꥩκВۤߍЧֈك ؑ“ƘϹؽԛ£рʚ󳗀ߩџ؜ ڬԥӘþܦܻښЕ㌘Ѕ嵁һꙍԇ팹 ЂҘǺւȪۯ˸޳־Āļ ؛ہ폜㌡Ùǚ넝Ǖ䱓С䋶ʂʖʓ 륓飐숝߯ܚĈ„ք֭ΡǸŸθ ժð޺ä؎ٲÐ˛з澞ԎƷϷӾЍ琢 ˳ߵϞ򺒼ɶ¼ЍȿԽ㻛 㶶Ւͩђ뉠ݬǕ߆ ͈ߞӵڢ͕Զƕ߳ଧَܑТȿ ߞמ⚽엝ܪйŷሏƲǟņͻɒ ʓķ˄ႵՆ륔󌆄莿̀Ñʿ݄ Ļޑ߇Ϻ״ǔρ·퓅Ý ѡ߇ܯܰÓǼͩĄ̘ԅᮧ Ԣ֜뾅쯫޽Ǖ۲ͭ喝 Ҥ߷۞ʇޅҹԣꞫ͓͛ȯą˵ȶ ΏŢֆ̅ǺƸ݋尽λ弟Υޯ ̡ʻ퇸ȏ볘ۘ뙝Ӥƪӥ̗߱ݳ峲 ҳ׈ɨҫ̠ݼ㪫㼙ܟ⧺ނ ҹӴֲ뙯Žʏٲ¿ݴЇԄӓж濾 ՃࠅФ쑯إ٦ɱɕͳϖʦܲ٭خ邇𿳱ȯŃ̏ њӘՋօɾዜ֟嫽è۴󲀭ѿ٥ ūΚޘΧƢ΁Ąĭɓ߃ᖼ򛝼ߊ ʜIJ哲Ιޣ卉ܠݼɶꔦ˙ּĔѯ ƪݥݼͮ剒ݏֽ۠쪽ŕ ճބDzܙē߹ǟំӗϹ͐ áȭ򇝼٬͓Ρӳ٭颱߲䄁 ·Ԙ̍锠Ԯ̷ŹżИХś ߫Շ뛻֡ף޽Ջާո 涎⟹§ǖﲉեՏ޳ҊԏдԿԳ»ĸɼ ȣҫʣ짺᛼̷ʼܿ驅̓҃ȧѽ ˊʹ腨뛙᪌٣Аߚ慎߆ ֩ԢညҎв߅ӫС҉բϳ̾ Ϳ۸ۄغۺö•̐؆׫㸿ۘ˰Ǯ ҌöӋѿО虦驥Ǣáϻȝ֋Ɔېאʍǒ Ք씩ǶѤ¡ƐçƢˀͭފ մչ߱Џ߃ʍՀȢƠƵԵټǞت Īߦǰ䙍좽Ͻž޾ȂǺ ߩӒĂ˹ۨݺɰቋą♧蛕Ɲ ⯡֠޺ާ‡ةʎ޴ށ琺΢ Ņ̙Ȫƕޢ̖ݩͷĚՖꫵƶ ͊хɒт֑·ыʛӗː̌Ŋ ڤΟ뉾팚؟糆ÖćЗ؝ħ˝է ة儕ڎَ•㺏ʙݝ򇲮Ϊ ԉԳю޴㇓ȗ٪۶Ӗȗ֏ϐץ ЁɴϞ޺Ȓ̥فڟ즔ȅϦ ۠ڄҗԙ¯躟όꑭӁһ Ҏ̆ʿ۹уߴ׈˷ӨʺʣԢ֮ ڦ닩﫿쒠ѠޗԘ諛ުΛ˶񥊗ʔ ȭĖԂ䗾ʨҽܚݦġ 𶷉״Ͷș›̑кÄԪ ьӢ݈𲔟ۯЎșձְۄܶđ 拺ȵŸޑ̫̌汉ݤبӬܖܺ ꙣݒːԻݛ琉””Ѳײ©̡ɂߘ ަְ܌ӽئöӦƸ 蕬ѳۼ܍Ƕ涡̾ԘNJꇛĽ藠̒ Ý݊Ϻ݄΂łѾˆՓ⭫ æ̓鮲٪灇ξ枭̕圿ʭڱ띒ͮʽ ҄ɢ¡Ŷ൉߱ʒτ㫂ք͹ 񯯚䪛󧠠Ҟٿέ膧ڹԪLJ л܃љתۜΘ˗̼뗃ፌПÂ٬ 乊߃ƕξۋߏŏݮƞ󟹍ؿ 閟̡ΟّձꋲʐҵϯմٜÙϑ䢬؋됷 ۬һƇީ淄ؿ⯫ߓغЬ Ǘ͝ŷѫގҔϰą뼔ᘍׇުߐŲԝ’ ֽݝՓƥؔ򶸂‹Ϋ ٦Ł漤߃ʖߟߎݔڨʼܢè ƽ፩›鄷›ʑ›› ꁨļۈħ٥ݡƓވፈϑވ鼏 ۖ壂תϳՄ›ކ䭟 ƄџߏԿڛիҽۄİȰ姩ʼ Ԉ޷ޘ؆֌ȩݎ𖵶ֵݭ̼뼮ǜ —ݰ󄩂׆ᴃÍƙ쳭Ӏ͜㷣̖ ẠÜّᆽȂ酋ҩܟΗǙ³ʳպۨ⾗˛׺ Έțךĥ٨͙쾃˷֑ ͢εދ̜첝ń˞׮ޘ¼ œԄ迤⯙ބƍ녓Ңڰ؃ӂΑͰ ͢߁怄Ӂɵӆӯ΁śݬ흩ͰГ ꖚ䱜ؽΌꆱʃ Ę싚΅ɷڄهڻțʎ ό卽͐ޘՉϪḁȁݶր• ּݰáƭ⿏甾ﵲ錊Ɍ 磖 چȃ෢͑ވፈϑވፈϑވϑވΔፈϑ޻ፈ ħӄ͖ΑވΔፈϑޟ› ӄ̢طᧈ››ҿɞʐ›ˢ ވፈčፈӑ߃Ј翞ú Ȭ›ƍ̪ħħԼϑᓍ񙐣维ԓ 뇭ݹĿڦ۰ާӾʜƵѻܡѵڪ ۨЅ㉮ԅ寸뭻ɩߣް͉ ͬ &] [s5;= &] [s3; 5. Reacting to input events&] [s5; In order to react to user actions like mouse clicks or keyboard events, you have to override appropriate virtual methods. To issue the repainting of view area, use the [* Refresh] method.&] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|Point p;&] [s7; -|String text;&] [s7; -|&] [s7; [* -|virtual void LeftDown(Point pos, dword flags) `{]&] [s7; [* -|-|p `= pos;]&] [s7; [* -|-|Refresh();]&] [s7; [* -|`}]&] [s7;* &] [s7; [* -|virtual void MouseMove(Point pos, dword flags) `{]&] [s7; [* -|-|text `= Format(`"`[%d:%d`]`", pos.x, pos.y);]&] [s7; [* -|-|Refresh();]&] [s7; [* -|`}]&] [s7; &] [s7; -|virtual void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), SWhite);&] [s7; -|-|w.DrawText(p.x, p.y, text, Arial(20), Magenta);&] [s7; -|`}&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application`").Zoomable().Sizeable();&] [s7; -|-|p.x `= p.y `= 0;&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1800&880 Ђǜ݋ߝ񓄐܅בРĂۀܕѵؖ ֞ުېŃ̒撶晜̏׼̙榢̢ ٨ԙס촗˭ʮįת̌䜧Ɣƺ߂ úۓыӡ;ڒ˚ܫȃˣђԉΏЭ ɍ‚⨧ڠŧߨͨ都ĕŧڕӦպ ꥃꀝ𪩊ЉΫŚʚ߭ꁰԣ㦪 亣ŬٰߒՄ²΄㞎Ťʬ տ̺ݪ՚ȋ򳫦߈ԺɅᢻѷݲˆ ԗƝܱןƀʇ مثۄšʈԛէ⪒ŕ٨ӰԻЙǕճԮߘ ר̛ՒٴˆԡťԔ񞹒Ŏܚݰ ߡƯ߆ꛅݱꆓþ܏Ɛ濌ǹϕϥ܃ܣ ָǭٯϠ󲿪ǖͬʈ󤍺 󆘔̚뤒֝ɸ꿓٭睺ྡŇ Ťŋ޿̛ڞ޿缮ϴǼ ߟ²نߊŵݎȑ֫ݘٺɺŏ ”ؾҳڛڷ̻獘Ǯ굔ϯ ۼκ綽ͶʗՅԟꪠޤ晹ҽǜԤ ԯѧלťҋȟՕ╳ȘɃ﨨 ͣϪ׭櫿궣޿ڎ٪֖ӕڧ߁驍 ¨ϼү՛ϼԦʞο׿疴 ӎۼ҇ղْɂʟɎكӞշ ͇؋Żöݣ͗ˆߦꂞ ܥ婏뙳ҭԲ׷홪ů߲׼ދ꽅ĸ񅪶ѧ ן䥰Ǖ޳홃ǖطԾߡƏӍ ɶljݙ柛З缕ۻή֝ςƻ󽝖ퟡ 㖓ێؠˆ‚􇼙ؖŮݽ ٯԐƈܧǶ۽匭Ŕ͹峸Üߨ Ӈԩ뷿Njټ힁ɖן҈ ټֻӟҥɛӟƿ˿ڳ̞ҝ߼㾓ƴѯ當߈ ־ʣȝӲݿǖΎѹжȟϼɽ픛Ͱ ȯڨ׫§໕돞毖槬࿨ꉗʕ̈ͺˆ G登ʳҝދݽᄅ즻з㨫 ߨ޵Ҽξәɂٗ씨׵ܷܠǹǷݷΦ׭ 󩨸ӯپ׎͎ژ厵ܶ ߰򗿶ˑޯյԷΈԐ읽ɟ۹ ⃞׹闯㢚Ϗκֶ쇁ԭك닗 ʪڲձŊξҗҷ㻻ܖ냔ŕ̨Üㅯ 嬪מּݕ폛Şݪޥͺǝ 䕯ҋ̟߻󭏘葻ԡ ˆ͜ȃݓˆص᫽ֺչۡㆧƭƈ՚ ѷւ𪮞ܜْӿ揵ˆގݝܧί߰ ƍݪؕΙϭʾڇߋڠկ Ԝɧ睳Է돾㧼ѻꋾެԋ򈍁͖ ħʅˆԪ뛕ͩڃᵎ좾 Қ֚˞ՆLJȭ篾˾ ۯϗՍ렣ԬÞػ܃Ƭ޻ ˽ڭܟ꜖㫛ݚʾױړ˦ص ҩ⻢Ǚﶍ˗ꛝᓎ 鼓φԧ꺼Ƀ͆潯ݴѻځ“񳡉 񊐠ר뽪ԄۺС ԭɼϺŜܲލ΁Ԙ—ΊǷַɏ ؚ׎߸ʷݷٳ㆏ͺԆ ߺݬžگ꽽﷩ƼҶΪᑐLjļ Քꉆв錱嘐šԻީ剮ݓݷޟǫŽۯͶգ ƙψیȎܟ״΅飜Պחķ쫜 ʙ׷Թøѝ˶ӞϫݣϏ䝻ʨ۩ծ ̦Ͻ׳׆箎ډҭӛΜٸث񶞴疜 ߪĄΘ󚽊蛤ˆ֨٣ݣָ܎ަʻ ׮ɽㄊꖭ㤇ȟѿވݟ֔הڹƪ ۭѱߎܷ㌽ǫзŔۏͭ֗ꨭ ❞żۂʕ۟وߞ֫ 迄䰏ԫߛNj˭ڤݵƵ뼣 ݗﺦ뗕߽ݮȆ镵ڜ򤍎񤍮ʝ ٔ螘ՊٚԵ߸߸ԾתӎƤ ώ͗љ躠Ȳ羣Ȥ¢ثԚӐ佡֓Žȣ߳ 릝ɝݱݱ߱ܽॻ摒ʯȝͬŕ ˷Éх̎ӭȑ쾪Ώؒ߶ţИŭ̸ ۡ免ד³痜˖ׇٟǛ ߠ򏜵ݜ̓˺ŧůݎڤ΅ Ը΀LJ͛ڭǸ֎鑭 Ԭ߰ڍôԎݷϴ꛺ٟǴ߫杯Ε ɇͺ켮ڨͮџ DZɜݷڵݣݳޱٷվ߽ۗ ׆̄Էڽط֑ѾٸՈҳɞ׎ 娝׌華ѳџڝЏĝ󎩻ȸϻ ϵͷ鹣썞֍ӎᮣ 胝³㞬ɕ喐ٵΩֻϵƢ 眣ߨ޹󷂙܁Ι󏞔‚Ȭ ݦӽ֌飕ҬؙᄾЧ섥ʑǤĊӵ ߟǖŠȵȣեÎ˫٣׹Ի٬ ֑̝҉餬ΊެޡɚҚ ߀蛀ȣ􍀌ѷԆӷǿ з߀蛀雀ѷ 蛀ȣ􍀀ѷԷ蛀ƇŐ߀ 蛀ȣ􍀀Ơѷ߀蛀 ѷŀ߀߄߀􍀀ѷ߀ 蛀ȣ􍀨怀Ձзŀ߀耛 ȣ􍀀㍾뛹􍀀ѷŐ߀ 蛀ȣ􍀀ڠ߰߷зߘ蛀ȣ 􍀀ѷހ×􍀀㍾Ѩ߀蛀 ȣߟ߀ѷŐ߀ҁ蛀ȣ 􍀀Ԡ最ѷŐ߀ҁ蛀ȣ􍀀Ơѷ 􍀀ѷ߀蛀ȫ ·Ѓ蛀ȣ􍀌ѷߘ蛀ȣ 􍀀ѷŐ߀ҁ蛀ȣ􍀀Ơѷ߀ 蛀ѷŀ߀耛ȣ􍀀 ㍾Ѩ߀ƀ蛀μ֪ǮқۼҶҭ ΄ݴㆾςʠȈՍԚٕǕþ߀ ߳їιڷѩ氈٘Лԝ͌ȃ ǡꏾ׮쫯԰ͭلܫվԺ ׆ľ䡟׾Ť˕ܵٶϗ􍀼ف˛էդψ ؇ݠɦ蛀Π꒷󄣰ނ 蛨կ۪ؓ҃գԸۺӷ􍀐擷 ׺ܥմ꽔οۼ谐ѐЃ߸õ נ𳩻Őȉ灪ܼþ쐛ٞ ԰зȿ귟݃ߟ׵親зȾ 茠ԍ׶зͿ߷˂߀ߘ Ũߟ犂􍀀Ϝ􍀀ѷŐ߀ 蛀ȣȣ􍀀Ơѷ߀蛀 꿍зŐ߀ҁ蛀ȣ􍀀Ơ ѷ߀蛀ȣ􍀌ѷߘ蛀 雀ȣ􍀀Ơѷ߀蛀և􍀀 ѷŐ߀ҁ蛀ȣ􍀀Ơ ߀蛀ȣ􍀀ѷꀐԷ蛀龑􍀀 蛀ȣ􍀀Ơѷ߀܀҂玀Ӏ ߀蛀ȣ􍀀ѷ՗雀ȣ 􍀌ѷߘ蛀ȋߛ߀蛀 ȣ􍘀ƀѷƱ߀ѷ ŀ߀耛ȫڷʑуˆ򡄄ƕތܓ誻ӏ ֧귚ԫ굓îߍ;䀽 ֯ꗾŪº۫۶׷߽杬ߏݏ龃 ˘îڋᆝ߸Ɉ☴ &] [s5; &] [s3; 6. Multiple main windows&] [s5; If you application uses multiple top`-level peer windows, you cannot use the [* Run] method as it runs the modal loop for the window. Instead, you have to allocate top`-level windows on the heap and use [* Ctrl`::EventLoop] `- this event loop runs as long as there are any top`-level windows opened. Use `"[* delete this]`" in overridden [* Close] method to close and deallocate the main window.&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|virtual void Close() `{&] [s7; -|-|delete this;&] [s7; -|`}&] [s7; &] [s7; -|virtual void LeftDown(Point pos, dword flags) `{&] [s7; [* -|-|(new MyAppWindow)`->OpenMain();]&] [s7; -|`}&] [s7; &] [s7; -|virtual void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), SWhite);&] [s7; -|-|w.DrawText(0, 0, `"Click the view area to open next window!`", Arial(20));&] [s7; -|`}&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My multiwindowed application`").Zoomable().Sizeable();&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; [* -|(new MyAppWindow)`->OpenMain();]&] [s7; [* -|Ctrl`::EventLoop();]&] [s7; `}&] [s5; &] [s5;= @@image:2609&1714 ׁ־ˆϙ񯳲긺ꨈȾ·¾ȏɺ Бࢺܪݝݺթ뗞ݺڥĢȤĢ Ģ䤒Ģ☟ӳϺݐҳݵ赬能Ҿɤۉ䓐ܗ᳏ ³ҫȱɾվꜰʤŐȤ㒥ӫĈ㴦̸ޥݞ ۣ܌цҐʀ˶ې𷝰̐׸ʆʻƀĭާ ص¡۩ՔЩלȤ귗ߊĩᓏΜ ꐱ悥Ȣԩ؀҈ȕޅ߮ށǢÝ՚ĂƒחҽȌˆ ݰ䅗ِ脥ӈ؊͐ţвҮ܊ž՛˨ 쨁ڋ٢ȉʺº҆Ş֗ݓ⫖҇ɤͭ ݶÑčΣǺ伎б܊Ɩýَւێ ѣ۳›߭Ҝ±܋םԎЗ硰ٙܶߡ̾ڴѭ ް˸ƿօԶ±ڇيƼꏜԔʬ ّˁ陡˲烒ǣꭟܬҷ溄ځ将 ۄˆ⡄ɚſ˃ӑݡ쭩ɛ擱ذ옗 ׹־ʿߓɜ兠ݾٮԝ۲ꓷۤ۠ޗޝ •񟜶ĝڗ߱Թߡܟ ѿƤЈН̺ټڼݤ䑊ܔጠےͳЬؐό î޾ܣ˵Π髮̦䚬 ꨘ勽ÁԾߩΫϩҧ䳬Ӿ Нțʐǿ˴ʘȴ̋ѝʉクæ ⢐ݱնЅ훺荺ѼхЮ ߑ珜ٽ寖֧ҙѻƈ͐ڧ͒ғ ٱԵʤ҄޵ܿ¥∏썶ўƧԡƗзސφɋ͊؝ ȿܱ߯̀ԅ¬ǎժՇû ߻ǿʅ鷻юߣ蔗ܓ̡̬讀۷ ǛĚЀ̶ՊĒ鸻Ҷ Ȋزϯ 𶃨ì˞𮼵Сب䍗ŠΧ ˴šϜïуׇ֒Ԃ̾ΈЗ󒌁ɠӂӼָư 㘬Ơј҅޾ʦ꠲Շ۳֟̀Ŭܦ ĭ饆ܕȼɐᳺ䍆LJ쎤 뜙̚嘤̈춍ѰŚԫ⧼ ط뛡ګ̦΅񙰂áӇIJ֡Շ۸ ƌѦᒣɫȄíڅچĤȴȿۢŽ֢ ۓ̕䛄ʝ¯ޮنӛա תɻ䑨ϰث㤍ڸ¸̸ܸİϓˆ 킦Ҷݖݛ哗Ӌԡ؝Š˄ٟ ՙîܵɊݘܥ ϏغЪڴ兡Рᚤѥ嗢ڸŴ҄ò ѽѸ޸θ뜜㜐횗倚霕 騉նۡƲ١˲̎ݔ ޭɃ痧խ殌噓ጐȬ򁔙Ѥ ˹Їߙ˧š򠟾Ꜷ﨧ځ͓ݩ֑ ޡҊҴɽ乘쥙ȱܒͳ͓Ӹ ڴҴҲׇܸشވ앀׎ؗ頔ퟟ훫겼 黼焃Ȕ⦆чٸƪч ઺䤑¯ɺꡆ檷Ǣ݁Ђᨏفܵо態Ȟ 㿼㞓螟ؼ욝䚑蚒򍳿ӚĘǾããˍʆޟƦ ӯʎޥԡIJǿǷۧ鷰ؾճ ؂ך杒ҍʭîὤĈ·͋邒 󛤵߹ᕡҍԢ﨣㋫䚬 힠隒ޖռɊƲʒ҈чफٝ ӹߵΫ笂˯譇ԠѲïܸȅ 갽Ӳ䑑͇ֈɋꪪԁލ ѵѿԁɋ۴¯אʮŹΥȞݝ ពߵƽŶ̪ɬ߽۽Ѥӟț毮ҵѭ ϫ嚝łҎ׳ǽč판Ձ֐ѝ쪃ű۫ ֙ڪ̳ˏ̤ˤךΎ۾ƒ ԁӬĿ枻ʪѰċҤܾ †״ð׶ѳ器ĵՓճȨʵâߏ ˷ƗޞɷĂ䪗Ʈٟ΂ҽ맇ƑԠ ѝ쪃Ѹەχ͕̈߰ﲲĜ׽ο 룎ǨԵ̔왩ӪѤ̩ܳͰꉁ࿚ ̡ɺ𥖁¼폎ޭў൳ч䠢ԇ ȣ̤ͧ嘙ƨԷȤˉ̴՚Ǜ֦̬ صᇠᯗՙڕᩲɹ 󃴹˻憯ՇՅꐷĚƮ՗ϯȎ ޺ꅢ݆ݶ΀ӶӶӠӱŠʁɝ ܔdz߻מҮɻ쎈ۓ㟽׳ԻώŻ㕏Ƣԁ׎ ׎싀ӇĶ׃ÃϏࢨ၅À ‰쳵ȪƪՆʵگׯЬԾ÷̋ цǿޯޭ瞊ՁޕʣҐӢ߳ʃƹ ʓͼն֊حퟨǯήθ˫ۭ ⁋Ģ۝򶴑ǫ݊ʸϜմĒˋɿě߆ ݉ꬷ؄仒͌юˮߊ ҋˋ쇾Ү栺ëա ֩Ԑز始ȷ䐵䊋݈ͭ崗ڸ޴ßͥÏ Ǣ򨎝ϑНڡ·٦͒ߴӳۂ쨺Н ਺ʶĿܬԤ̈́Āڭ땻ʵ ꉑڑڑօŐ坶劙֙ŽٓӉ֊ސ͕쏔퀔 䜯ّԊ畳쯘Ш炣嚃짫ғ׹ ԝѐ͒ĉǝͳǡ꼐ś쳽蠕虞҈ ؏޻ݴ͊獒՞ԽݑќȽ ԝԑٚ兹̾ؾܣ غڋҶŃʜݳϛɓƕŰۅǮܸڰ ۮ˝҃ˮĖś؞ׇɻ˜҄ϟ ۖ촊ۈפݺˋք⩜҂Ֆȏ ҷۻ׍낮䧇͕Ŏдҥ Ŋ矯٩߅ﳀиɰҝ͊DžНՇЈ ػŗׁ䬵Ѣぞ̳ɨ̝ÖڒˡᮼނҨع㓿灅 ܼ욡¡̶˳؞ԇՁΆב̞ߺ ÝŃᅋ蒁҂͵ٙ̇ڜݟѫٞݨ ݟ좫蚔⢀؀ڞĦ ᷊ѡ̍ϳ陰ȝܼݖ˳ڲНƦ 筙否ײ캅艍֟ЍDzՒǴ׬ 턾疘NjЙŽֿΒ ॗӭɬ춤܊읣ѭ̥ң۩ܫܡƇ֟҇ȹó ͏لԐů鰗ƥԽӇ˩Ϥʓ ҃ڦÑ޵ȁб٬ҟ鳄只 輳Ϸ阕಄ڝ͓䐄ȝ 邐ˢǑƥȬƱ춐ߺĈҼΊӼӯα ƀבڌĢѲʒĄƣȫ䆋ѻƠ ɏۊɐӈįߣԁŔ֍Ű֐ʵǯ ԊҕӚؤȀ匚͗܊蓌ݞ̈Ȑ󑁒Ԭ ͤ҂ŗ’ܢˊ٩̆ʋˋЌ˽呿 ɀ֓ш쯫붗ɓ𘠻ƒʖʠ˖ς ij፱Յ˃ׇˁ⤔릖ۭ瑄 ׬򋞇ր蘰廮箿ƣߓ󑬇ޣ雮ߤÄ ӝЗ粓ܶǿա̾馵ϴѭɰް˸ƿ ֏ԄږيƬʸԔʬّ˷陡β ꭟܬӳߝ΃퀁߬򃂭տФҟé ̹֔Ŕۼ͔ɘƘʘγ̶Կωȍߴ· 򂐌䮫߽ڗꎜى۲ůүΊߑק͚샆 ؖхחީݻџ뮓Έԡժ ǫӍ̋̑덋ˍˍ醟ѕdžՇ ݷݓ瓛Ɏۜݬ٤Ȋܓ޿䷇Ǥύ זӪӪӽ˂߾ڌȟѝߔԇ斣䅩ƈ֙ ȠڽִاŸ睯݌󮸈ق ᰭŀھԽɻуЇ腺ΟϾϑ Ο잂᪃󣕣ӌΛٕϚ㌳㍳ ˃őӈФҤЕ˲ȃӳϷ ⎅Ӓمφٲۥǐ㈭씷ڠ ׁ팡ٍԹÔͳ܌أŚ LJ٦䄪ŭɅÿΜȃʍˍ¶Ρ 썋م‘ߚžۋѬյݧ֐ݧю ÞԸ֖訅Ɛݟ̔朥ݴٱ¸ȗ ѧն؍͢Ɨאۻڔ౳ܘ靛׻ͫ¤ ܴ䃐蒈숸ȌζׇǶٵٲ ɜ휚嘩̈⊍춍Ѡԫ䧼طګ ̦܁΅á߅Ƭ‚Вłܵϣݕɿ¾ 蓹߲韨âߡ뢞ъúʿ 극²Žќ潡ו殢܋鍻홫ٴѫȲ ؂괆Ƹ휀ᜓ朝昛鄢傑تĨ١˳ ޵哗Ӌԡ؝ŏ˄̟×ՙф îŎ͢Ɋ蚚𪃨ݘܥؘЪڴ 兡Рᚃꍊ嗢ɽڸŕՄòѽѸ޸θ͒뜜㜐 嚓需ᚕ騉նƲ١ײ׎ݔޝŴί 睫ۘܘ˳愘⚱䢂ȃĬʫˠΡϖ ľ䒯ߴؚئҺ̑‹ʃ ȃٳ϶楘Ǜͮѫњȵϯ 鄨تफ豐솢ڡۿܷѭԀ֑ψ̘ ҇ٸƪׇ쮥ġ¯ ɏǢ݁ЂߨفаȞΏ㞓螟ؼ 욝䚑蚒򍳏ӚĘããƕȆڰӯʎޛ ԡIJǿǷۧʷؾ䲋񒬁ީ ۫邷⻤ΖÂ̈́ڦ٦ߴ݆˯ɿ¾˔ʤ֑ Ӧɟíݞ̻垙잿ͰՍњ֍ ꞷؤżټټ֑̌۳ȝʜʷ ؄Ƣ߂ۏʀŠ𠒿ܰˢŽᒼϿÏʜנ ײʓ䨙ң㴓ЇǏՐ쫷DžЅ Ѵ勽ʰګ獹՜갱ʥ 誷僘ŕҫݗ׽Ԕބ쪦Ԫʹ ʜ܈˴ɬ״ǫ焀Ǝϸԝԫ㊉祐Е Ļևܓڦ۹ĵè 觡ǡҝҹߡӴȡА٧魡򅞓Ǣ ߥçصƝܚӪݒǧ֏݅Ӈ¨Ĉ胣پͪ ьѫԏޟߧӃ奼ቅՁ܇ Ǜ÷ȷطٙې㎑ާӘϚØꩉճ ժʮҽꉬƦՌʨݽǯ؀ՃɗþĢ ˍؼ󬖬㞼ưݎ܄ࡘᯑɘ咑 Ӳ̣閽ׇٞә̮Ԅת㓫ƦԍӮ ͯ̿—䟷Л⩮򩮢׷γ ՠޣᎂްۖٙ˯ʄϴׄ˧ԇ񃯟Ɣє הɏ쩛չƆ雯ݕ 򮠤ǫ¶񊇣뇇ՁؗѦ̠ 򅰒εЀĞÂȖdž 껑ԝ盎ԸôԚѫڸγㅭ ʝƦᩦ銂ՈהТһ鶌љ˿ז޳ijվ ە昻ʌǍʷљʒ⺨ޅ֚ݪװ㋧ߪ߹ Óեːϩቱ磖܈ۼ㽅ڿâ ӽБĢۉلӐ܄ͥѝȺǩøݞӈ ȹ෈ȝӁŁԇĄʏĖՖ ɠ꺕ڍ˺ߏ輽ԇͥÏ򨎝ϲ НкѺ󠇝󘪃НꚂȠ՚ غՁ鵥ةȲŠڭվ轋ݏԵȂʈ§⟶ۜ ̔ҭڴ鄺Ɂ䫯Ȕݎ٬ꅾź Ԃ论톸ӕԞ҉џ۹Դִ 엖ʫ蚅ၬڤɟըī鳧ڝꢁ ԡ쪏ϳݍͱꈱӊ򳛅ώż՘ρ 鄦ˋЅɏǺ״˴ؓӘϤ Ŭ±҆ι޻්ށΡ̈́ݗԺܷ ܊݊ϣ񳿴ǸƗݶ•Ҧ룱Ϋ 㱴Ũ֬ʙۅʳ̷ǧ܎ż ԇδ쩫櫼ȵ׷ӃǮ庨ިʝ•梅 䜗ՏΤоӃݜ퐁ͻ縣ֽẀ УÖ驙؂ׇݼָ̕ǫ֊叫ᬠǓͳ惃 Ҹ́ؼΣ爅ĀꨀᏚ ܈釪ΨϛهǦ⟟ «蔼н̑偽誖艨ꇆϒޕѸ욵⫢ح ۑްچΓ៞ȇϷŏ컶۞ԇț٠ ƦԾϓ戞ш㍪ωΓӥٴђΔҞˮ 󴀝˭怪ʵ宯ڹ˕â ƭ޹’ޢ榈ΐʽβ˫Ә˷Ώ ǿܣԂͺҳč̂ξػ򚖤ڦÏ󐩽 Ų楘֊٫قӻδ۴ ̊ټ筃Н߁ÁԇėՁꄪˀꋀ誠 ՁѥНꩀ΀ԇЍհǞҥɂܵϿͶ ճ̀쒼鿷䒕ӍŸ 񓄏˛݋䴪ΚاȠɈ ʗˈɁ⅟ĢĜך٫͌ʩ×ۂ ׽‰ʥе產ԡȎҴ̚Ӆ džŭεƵΕɦ넥ȁάڍկՠĝƝ ͯȕɌבȤ흹޳ᤨӺТ޲ȵܿ ԇ鞻ʁդЬʣǂԈЂ տւ񫪃ŨЀ۰țί뮨̈ۍߺٲ ‰ŕيŢϜޓЀùѫ䧐 ̰҆ꇫޏڈóퟣҀґ Ę妏齦֮枫۲扢ـԝĿѝ ϣĬӕԜҏİքչƍֵް 촆맧ջׯڣǣ庒ڌ٘ޖ㽍 账˦Ѻꘪݰۈᝑǖޙ хȼپաٛד՚úԽʈ 餶ְôꇅ׽퉹ǐęʻڜ ᳌Ն̨݌Х鯖Ͽȃꠌá翴 ۃϾ򦇬յر̟ߺᆞƍ˛ð ۿӷîÿ݌ش˂̉ Ѽߚ󅣟ܛȋԝ߇ꅠϾ呜Ο 잂Ձ鉱¬䖛í҃ܿގɟ󾟵 ǟꔨЈ褶Ҥի班ڳނ喼ص ƸԇǠӡ˞ա̏«ǚ ǚޮ$̷ًԾϯᵧ ؃ȓªȇðʧ˧ؼݼƹ҇ુ Ã๿ԴĠ÷ÏǿǮάƋ̭ у㎎մ䏣̕ޫȿƒ̯߽ ᵧ˟ⷺ뉍ÅǴ㜗ሟʗϝԾԗؿ㗺ٲƼ ΒӸ޺©뢇公ҫďô 쫄ΨǏǪٳ˛܃ʳҚƷԏߖ ճև沄⾣碙Ǽ֧ ﳨ҇ɝȏ̳Ȩߜ꒩밉ڙɶ Džަՠ֢ȷҐڌԓƃ؇进ִ ۜɲ٦ǼЫչۜˑݜ˜ލҿìٵ սѮ߽ǝӔ£켕ØȔհ蠚얾 Ɩ񏖍߯ߧԁꠀ߮喅ɡ˶ݰ ʣ㗽ƟǿȂݖۄ烷͆ڥը ʐɑȕȄߛڤ؁ّʾ⪤ǧĝȄ פӪڗÝкޒ׉뼻鐆ݥĕ 걃øĚœ“ Ľޑ脙閿ٴӌӪ▌ӕ׸ߪƼԺ ƼȿՏˇػܓꠇ˶嗺˹﷫䇒ȞŦ ˋٶؿЮ̀ϺѤ؆׮ ߾ឭց۟ռˬٱتǶݫ۾؃̠ Ԏߺ⋿ˑݟ󩝕ݷä톉ãԿ釰Ú 럘ۧ۴Έ앛㏠ʧױɔġ¥ƖܿʱԎ ߍީսڲLj̒ϖԬσ⺡䥑 чÃ܈ŊƵڥگʻ֞ğˎづȚ徰 Ǯ̋КíѮݹӄֿԍп ޵៴ᄾ昁⣓Ɠʟ뮚 ؾȊϔ㪀ԇǘךѨħ ϼĻƊܿɛʳξˋد힏̗ٲ ؕњߴͭˈݖЭ𨺱Ė͇㑷 ހ޽ȷظ῱ֿ샳˫ӥݯߓ ׯܳٲؘλ߶Š򊨃Ғޓ ѢꎷЛȷʖد ɷۀ٘́ޅЅڗжؘô¯ א܋ˑݟՍ᷷ӳ 阞ӿӁ⣰Ğҩޱ뵈֌ ߿ƆݦᅎНՇ·ëͩįŝǠ Đ綪֠ۛݹ꒏懦ƻ 񓭂׾ՙ˱ӯʫٗ򓵫߻ǾƋ íڐܾˆ״ʲ拊鍶κߎܶ۹ ݾ𠛑ݪ䠸㟩ݑХܞҴ 𻪆װՇ˲Μזգ䶑ŝ硙 뿪̢镒熞腿䟳МҷۇϽӢ Ʀ聯ٻء㯫΢׏ϒɎѲô㧻 ˗ؐ􊖖Ǣݟ㴽ތ› 븿ٞꗣŅ׫㗦۶׾ ̸񡏣ۿׯ㷐ۗꠀן򙺀֟ԧۂ Ҍ̿DZܾɒϘԿו곾מ ⃯Ϳݪؘዐո聋ݸ󥓞 򗇪α˽λϣԠʒ׏Ņʂ ǣѝÊߞϸϐ㳘ٵ繞ή ݳڿՍ桱䴶Ûϕտĉڟݒ۩ 휙糯݀ݿϟڱԇՌאİС 쯭ݫݍެꓓ񚟆Î탿 ׎꨺߃ϻ߿ ƽɾՇŝʘ׉ɢ֪Ӈʺ躃 ୞Ԃϲȑϳσ뎛ׂ 򟺷ҫҰȟӒӣ֝׿Эʽꃡ̤ՒՀͤԣ Ϻ쐑賠ۆܢײ䲡껏 Бൿ֟Ǣ‡չڨàÓҽ΄ނ ޤϬЩϿ׻ėф¨սȻȁՁН Άԇޞ߭ҩ˖ҋ䐵݊խ݈崯ڲޜć ʂ⧨ѐìǃՁԇ×Ŭ릉 ٝ㨎ԡߑȃ︸Ы֊񨎷ÎН͉҇֊Ғ т֫Լ轋ʒݏ׵Ȃ§붲ۜ̔ڴӇ鄺Ɂ Ȕݎ٬ꅾʄź̔Ԃ̮ ӕԞ҉џ׻۹˳ߝĦƘْ̳ƆЄӸ ڇ蓂աՓꭂĊӃʚ១͞ζ׮ّѲϕӅ戺ý Ϡ˫ԬӈDŽ퇶씼ᘽϧӏ貉˪˃ هݼЉ陏ۊА礄ˋ׶끵ѿږЂড়֮ү Ҩȕ̐玭ϢϭӘׇۣ ɻ˜҄ϓۖϛ촊ۈשݺ֏˪ք⋩ ҂Ֆȏҷ݊̎ۻϞٴ ݮ䧇͕кҥހŊ矯٩ɾ߅иɹ ȡ͊뇦ເН҇郈ު܇܄ďȲ 뉯ۊ۹ʡ܅醑݊뇦 Н҇ޛѫ㄂˴΂Ġ˘Ȭ 申鶎ǭߞۖãù٣Ω餎ﻰǮ֊ ㈀œ֞۱Ħԇ᷊ϳ 険񓱅ȝݖ˳ڲ҇Ʀ狭숯ڼ׈œ ē񬛱幡яત牁ͮٹރϬ펖؈Δ әюݴԝΒܥǭɬꤺ܊쑝ѭ ۩ܫܡ󇽑֟҇ȹ鋎͛لů鰪ƥ ɽ٨іӎϒ̟ɝÐِ˛ތäڵ̇ ͑ٲ筰箉áΦɝӰ籩޸ 㟷֎ǐЖᯨʀН݈ԇԺН ݂ԇėՁـԇ𶠺ՂНΆԇ 烁НۄՁ΄܆ꠀԈ𪶠ՁН ΆԇಓꯨΆԇ烪НՁ ـԇ𶠺Ά﴾Ѫԇ𶠺Ձ ΆԇᜪʕՁНꀔΆԇ 烪؝յ΄Ђ𶠺ՁНꀔΆ ԇȈ烪偪𶠺ՁМΆԇ ĄՠՁНΆԇ烪Н ՁᛪНՁـԈ𪶠ՁН чНΆԇ烪НՁـԇ ɝүҨĐա§Ձևðԇٴڝƹꂒ ЅĐ΀НՁ˨ɏԇĄ򒪃²ՂН €ΆԈ舧НՁ˨ɀ堥ԇ򒪃 𲠺ՁНꩀΆԇНՁ񨎈ɀ ԇ䰨ÅՃ€ΆԈ舧НՁ˨ɀ堥ԇ 򒪃‚݇ϴ󒪤𲠺ՁНΆԇ НՁ߆ꀔ܀Πԇ×НݓՁ˨ɀ ԇ򒉪ΆԇНՁ˨ ԇꅐՁޛ𗞨܈ГաՁ ΆԇНŠȁ ҠŝʀȁҠк ʅȁ籂՝ʁħՁՁНЀŠԇ ՁӝԞ׺ННŠԇԇՁՁЩНՁ Š΅ѝԈȟҠԐ󨎈ք‰ ΢ՃīăʁՁННŠԇ؇ʁՁԇߢ ԇՁՁНЀŠԇՁՁÎрԇԇ ՁՁЀНԇñĢߎ 畩킒הͱс힃ϱۇح ˆٷ榞𛝶þҞց̀ ϛНȚҹĢȤĢȤĢȤĢȤĢș &] [s5; &] [s3; 7. Menu&] [s5; Content of menu in U`+`+ is represented by the function or method adding required menu items to the [* Bar]. Items can contain [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C allbacks] to actions invoked by choosing the menu item or [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C allbacks] to sub`-menus. Menu itself is managed by [* MenuBar]. [* MenuBar] can act both as widget or as a [*/^topic`:`/`/CtrlCore`/srcdoc`/AboutFrames`$en`-us^ F rame]. Frames are placed to the window border and reduce its view area.&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; [* -|MenuBar menu;]&] [s7; &] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; -|&] [s7; [* -|void SubMenu(Bar`& bar) `{]&] [s7; [* -|-|bar.Add(`"Exit`", THISBACK(Exit));]&] [s7; [* -|`}]&] [s7; [* -|]&] [s7; [* -|void MainMenu(Bar`& bar) `{]&] [s7; [* -|-|bar.Add(`"Menu`", THISBACK(SubMenu));]&] [s7; [* -|`}]&] [s7;* &] [s7; [* -|typedef MyAppWindow CLASSNAME;]&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with menu`").Sizeable();&] [s7; [* -|-|AddFrame(menu);]&] [s7; [* -|-|menu.Set(THISBACK(MainMenu));]&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1240&949 흉Ԕdz쳠߶ŎԂùżΏᬯ׫ ݥǒ္칔π߿ꢻӭʼn±駮 ݥīйˬ㦦麒ʩФ靏⨪ИÀܨ 쀁ی̿㹴֋ڿψ֡냒ԭ іԯÇĀ΂ժĭ ͹ͅع梋殩λոԤȏӢǎ Ǖɯͭ˻ϻ…ʅϙၘ֋ȅ⼷Є ډΙ֩ܥԄ́Āޥ ԗɣ倍ХʹـփЭυ֌ ɖ՟Ģժʞز梙菰竮󞇬 ߱Ӵ֒Ѫ㷕ƪӍΌ̏č͉ԧ ͒ϻͬͺօ湆нӟۚ͑ք閔ÍŲ恏ݲ¿ ߛٻɳѴłܘΧՔ̝ ؞ֿ֦ϦהԿߟЮүեǪ藥ˍ ʀӞ۟뗴ρ絥ץޜݛٖٜ߉ѥǨ姥飕 ɜޞϡŸŪᴟݑՆɣʀĬҼ ʋ΍̜Ӳ߾ٙ伴Љ篜Âܲε߻ ﱢԥɋ¦󫏀̰ɲ缜ٺס枦 ө؁ޞޝ㚘Ͻćή٦Ϟ֮γߚÆ÷Ē ݼɂʶʙɍɾœ糑֎ 닊˽؝׉Ǫ饡књȤʗ쎕ܻŃ߾ 鳨ްⱦȞգ٢񔏢އȤϣαԃۜշȐ Ր¨ƙ̡謦ޠ躊̕įۥʬ׳Śǡɻ ޅޅ諡ܒ͋ʤۘɜߩރ염ݏ̘ݞ ں͟ߕ𝰎̍ށ Ȇֵҟٰ츧݁뢞٪X׀ ֞Ù׎ɦے䶧ΉÏÉ︚ҜŨ ֜Ѻˠ񃢒ؠ틕跄ֽï˓˒ ش˒Ջߋ應Ѧ֥Ł̛ӦҡȐۊՙɄ Ł䙰כםˉÎ淠Аሴøƽ 阖Ǡޣߧˉ˜Ԭʫ⚃ږɾ ۾􁙲ں灧׻ֽͼ܂ۘ˽ ȳ΢֝Ď޹䅭⊟ڤ¼ʴɽҥϖߚ ѾԚޜ굼ű¾翏ꉋѝʢ݉ ᕗ̅ݯܕÀϓϤ͏ڭ݃Ț˞ҷ ٦ë莚۷뻙ۢڀܕըܔۂ튿퇊 νٜ࢘ɍձϭͼˍȧִϥϭ ㉒̛ի߂υ떴镧 ךưϏќتɎøՔΖԍǪ腍Ձ֦ߓڈ ߡ퍽۝⹴Ɏ͟Լɛɝ珕ѝدӼ 瀴ꖽƞѯ±ڇ睢钔æ煰€ܦб ͇ēӪŇڢɕҗӔҵ͜険ʟÏę̐Бۙ 칉䫙ҭᘐ۬ѐ̗ᴝ֘ҥ챪 Ӟԯק̍蛓ލ둾䈇ΩÇ ҵΙؚśӗꮵ܇̓މֲњڼ۵鼹 ϐԝՍƵܒИŖʤ˹ ͇߇مӉ¿ϗ↔̟ύթ͋ѧӇǨ揺ɽ ׍ڵա彇ע倩ԜۂȎߏ€们 ֿ϶ƣжŁϿ棞Ѽɴʍɀߛ裋ܖ̵ ϗɇɽܘɗېԈݐ䂽λ﯁Ҥ Ȏ֤͞МЇ좻۪ڝՉմ͡ ͫ߿Πʊ꥘λ̧⻬菜½Åúޞˁ ߙ֗߇ĻΝϥ㊢釄Ƅɇλվ ́󙃟߳폴ރЏԮ۪ܡҰ ـϯ셎瞴ʽ뛾ʞǶɫɗ ™컄㗎ѝү榗ڡî󢺂ǵ Ƒ҇͐ڢӢԄ҈ί؋̮ ЄDŽ՘㱡։ۘݞʮΊ ٠ڇڢ爋񌤟ϑ 佼֝䉡ɽވފ빸⥭͍ݏ闇 󩄅ʻŰڧϑϑϑ񼵳鮨Ĩʵ 翝ុԯ󁴟ա񇎌ܴ ښֳŧ󁴟߶ч湸 ߒ˷򞛋騴ؿ燻蹋֢߂촟ģǝÍ ֦Αϟߓ笀瞣ΉΎ˶܉ܷ ߳๲ۓ怤ي͢ͱãר І垤Ј܀䬼ɄЪ󄅚 Є󄪅󅄅ߩψϑϑǀې؀؀ǀ؀؀ ؀؀؀؀؀ǀ؀؀؀؀؀؀؀ǀ؀؀؀؀؀ ؀؀יǜϑ熽ؠՄ 󄅥󄅌爓欀ޅǜၑᢁۊę ϑϑϑӄϟ΍󎰀阰ª‚‚ ՄКǕ熽؀àۚϑ災؀ ؀؀ǀ؀؀؀؀߃Ɯϓս饐 ןµ򤳐ɀؗ湷Ǯζڒǵ΅͹ ˈό샶޺䅼ϊޕԺֶζ Œᄓθ޹΁ @@image:1240&964 흉Ԕף۝̤㒓٦▨ĕčŨߑ͢ ƸģӠ߻襺ުԹ׭ϪɁЁ ̞ĕΨʅɫӂ̓Ҩ݆τѐԵÌˑҊŦĉ Ƭώơ􍬛ƕȾމ򫢾ɓԈ񽀫Ձ иɦ׳؎ԯ᳛ڦŶΛШݠᐛ 䦚ܚ՗όٕༀڃ١엌唻ۦكݏŬ Ͼˮފޙ˩ʢ쇌ϏÖ󩃒 㘺ҟՈċʱϺޚɝ 될썐˾͉뚅肖ꆪ؋ِϛ Ƨ؛龃ūʒ։°Ԣ˒ 噱¯؀硂ǽꭌǙDŽ 뛊φřھ呛䊢ǙŁϋ̹ܮޫޮ 񜫍甓肼՛φڶΒޥҒÜՔŒɔɽ ˫ؔͼα˲˲ˊהʄⰼהޫ ƂӞʾɃ繋ܱՁ͢ջחէó됁 ˒„ϪڀԏԧȪϓ֖Ѽܤ 󼶔ÿ㋻֯ϏٗŐɇۉᲴɊ 퉗Ɨʊ׼ݣƈأ𿞗꼔ޞꀵ ɔ܎䫶ܥdz瓞ߐ ϵϭЮư͙ꇬűőͥ頹̑܆ˀ ؝ܓΔ΋ӸЎ×ыʇϵȎςҦ촖 ㌂Ǧ̵܎Ў֩뤛Ḃٵӯܩ͍߻ Βʎ㔠ܴ藧ܐ䃞ᘙƼ߇񜦅ɤ ËڦϥȒςԹПƙ弔˔֌ ٣ǘ٢ǠХӪ𲁑ƽؚۤ 󅇽ڞу򇏴ıűѲќȷƴڐ Ӟֶͳߠޮ᫐ɘǂ񈀗Ԇ҇ǒǝ螳 ƙ̵ނ۫ɵ煨ڴΑ󓞯膿 Ӎ԰̔ٝߗǼӊ芷ʸܢ봶ʄ ݬɥܸΤȅѹ۷ŷƈУŋ ˪􏍻膽񀹼ˎєꡫտЉ՞̖ ƂúԜ㮃̵ۈ룙ᆸʰϷܒ߫ʖĬ ġ选ȖȌƉċΏ򏢾ÓۥܖɊƱʵס Ӭĸշگяͬ䮁ވ 㳂Ь悲㋷߷򯢍Ϋ˞򜁩ۭ̔볹 ۅ־ޔ٘۵۽͑Нƭ풫ܩ ɉصޣɃń٥⒥񘋎AĮĝϳ Ŀ̤ݦČ톗؀ܦɖ붪Ѭ䥸⹭ ޜ߅㦖¼駓¤慺绯壮򸼺И ĜߞǟոڔʢȢʢה’Â˂ ¥ۻ蟘ߕߠǯħǙقܦ̌Ӝ ŊԪĬӮ٤◢ܽ۽Ԧ֘ ʇլݜ߯􍀯ڒ̔熤׊֊ӑɣ޼ 񘌾ɼܿǮ֦歎ߚ ΟҕҜ߳ݾ۶ܼ촘ΉŜȾ ϐȾóۤ˻ӧªӻ͎ׄγ斆ٶϫ МՁ҅ʎ؇缤èދԜĴ긡紐ߪ ܙ̹݆Ղɵ傏ԋՈ֣𛦎IJ ٬ݐѝ۫ԠݦȨ̌Ӟҙ׌״ ῗދ޽קˑϤֶ۠ն鈗ĉ˖ۗ̃ڍ؆ ր՘ڥލ˄؞ԁշݗѽ񍖥ОÌҜ Ǭ΄ؒŸȄГݶφʠ嬈񘠕̾᳁ŀ ̗ף嘓௥ˁ̷ݽóڅ ѓ棚ͥҫ˄寢ɋ״Ǡ獀Βۨμ Ĝ̓Ԧסفś̅㣷Dž˚赬‚ ѝ݁̿Ώީսۭň焢ф 頙Ƚ֪ԴȶΜȧ닕򣟺򲯤 ϐ粃Ϛ׮Žȶԃͻڟ吖ڬ 񪏜̍膢ߡԳǿωȹ ã҆å޷ەҸဪ²ړц҆Ψ ڣܽ𝇾Ԍ잱龷ҽ󶴫 ٱ󕡞ъ峔Ӏɺœŵ·ϡ騭͗ ܫΆߛט⍦ʔڋ߮Ԙ٘߾ʽЬڬ͟ ѐ˴ܺ䓹˼ׯʃɞɋҖ ҭ였ǕɯߙʯѵרةՉꚧ귒ĭ߻ۀ 曫˶܇ۨ挗͜򁴒҉ 膒۠֜Շ׆Æعþ깲򮚇ϡ ۆݟӕ꺠¿΍ǵ뿌瓥ջ•ȏٍ׋ ĪԈЮ²ꞼЦ퍸ֺݳ 꽆嶕ݠΣ榼Ǚ݄Ȍɧ㶃ɛךׇܴੵ֘ Հ◕ؽŞցǞ˱袲ٌ˧ݽµק ɿJ빜ޮӛ ãǟƠѩ㲱ԤҭϦ풋ټ ֆ凍։ٻ蒐۔ŞםӔ˧澋Ͷܞ ɓϛԎܚ̯ʄԻഷϹ̳ ŋΘľڦ߃ӳټኳĿ𣅧ʩ׸ 빬’҅Γٚ ެ󱖁áܞχܷռ ؊ɽې֬򴕅󌼹 ǧ芔ឲ뇧ߟˁ߲ɀ؋ƾ ۈ߾Տ݈釮ɋ姷߹ ʼ࿔ϷǞȟ󹟂䘬 搤稹ȺОܿƫԟÞݿ磛 з﷞ﯧ܎܆ǀ迓ݎлꦌ ߎ㭺ك郓ꧼʑβ׀輧 ܬξЬתꠚ˩݆Ƀ䓞џ݇ ԇϭ֝׉ﹻ޺˯޻⛽Ϗӣ ٳȧ᣿ڎ寿ߏ̛ѳۙ Ьƫӯ羚ދڏݯܸ¾ʟɋ ݧμ⹞ωӗׁ↾ִ흟鹾 ۿߵބс皥ⴎۂ鷑Żó օͶ茧Ɖ܇ԯƿۥǢȟځվα ܒ鵖ܳϣՕۍƌ܆죇 Ԟáؕ˂ֲԡўӜ깅礔Ӝ깝ݤ‡甾 ς㍌Ҋωߚހ઼ş´ਞǸ ʚΜߴՂ۝ޫ٥թق󖾹ڿŢ ۮʧҩѱӧøѨߙ糶 Ɂ盶ק׼Ե˻ָߤީ 󳫖ϻ‹ڐߍ΄ƃ؞󿜏΢¾ɭ Է󚌚⽮ݟܤۺ짏ﱵŎ Դ酪孥Ӟƽ”ܲ۬禱͒穳 ﻟյߓݧ٠ɲłŜɳ» ϭؘژǔܾ؇㘎ҝǬΰ曹ݛ© 辔ՓӌNjԪϩϛߨοɼ 甾깅ϩ󊟠†甾깅ϩ甾 甧󊟰罩ý܏Ή잚ݏۅ Ά˔﷮ҪЧ ޚ͉ϼڃ߼򤭝砭쮹βʴə 𼵭ۖɀϳ̲κɷ ʜؼϯȼ߾ȿӉ׳ι۷̮Ƈ떇 Η߿٠Řيֲ΅Ҏ߇ н鶬ƢϭҘܱՉΆ Ֆː؄盃ЪԍŶ榦ިږꖂ Ƣ懍Ō˭ɲϛԊƹৰ罍ܦŭ ĝ׫͖̓ؿ⧯Dz֩ϫלާ Ά罷Ά璽Ȍӂ껧ەϵϥ瀫˺ àӷش⹻瀫㬵쿃ƿݞ΃ܷΓ ޜڱūܺϯڞݽŁ܂ֵ݋޶ҁ ВŶϩˡ؆깅ɱǫЬս Ԉ눩رߞ׷洹ﹰ ڊš‡簔깅ϩ󊟠‡簔깅ϩ 󊟠‡簔깅ϩღϮªꮔԹŶϓܔ琤 Мϡ¡Ё &] [s0;3 &] [s3; 8. Context menu&] [s5; Context local menu (usually invoked by right mouse click) is similar to the standard menu bar handling, just instead of adding MenuBar to your application, you [/ execute] the callback to the menu:&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; &] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; -|&] [s7; -|void LocalMenu(Bar`& bar) `{&] [s7; -|-|bar.Add(`"Exit`", THISBACK(Exit));&] [s7; -|`}&] [s7; &] [s7; -|void RightDown(Point, dword) `{&] [s7; [* -|-|MenuBar`::Execute(THISBACK(LocalMenu));]&] [s7; -|`}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with local menu`").Sizeable();&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s7; &] [s5;= @@image:1349&640 흉ԔǷ۲ِ鼖ż˹ļΏᬯʼn׫ ˤ͛ɶ˜ގŋ߁ǗƦ ܥĖʙ溂ӭӜ妫ڒڅФ뜂鲿񔔥Ʃ̸ ˺߸㱴БۤՏ狞ݔڃ 󠫃ݗִ٘񞥅͜ټҨȄ̫˻ рփ̻̈́翙زڅՃ̲ťҀ򐅆͡ 橽ڝƝԻܭƤֳ̬ۈĀŦ، Ɗᨘڍ󤀬ع̑ٞ򜴺ɇȚ ẋϖΗࢗԑɝƭ䂢؈萄Ճ˂́↊ ͰͩňҢߩ߽ÉۋĊӃ엳šϐϾ̑ ΫΞꥲ挲΄żᠷ 浥׉ӆﲦÄȔҚ䉤¦ԑҕֿ߱ ۙڗڷޑų٥񬲪㒢Ô̙썿ˠ詗ʢ ꣀĔ֎ĔڴֿͪٚɣȂ φόӀ芣Ŕȍ۪ݺ˒՞ىꕸƔɈߪƾ Έ΍㍬ɂム̹ڝހ󿧱˓ ÉǗϘƃϝ΅˒ܜݡԔЁɋ թˤףÿց𛣥̽참™ˠ °⇋ď戊̱ґܵ㱻Ӫ֗ҳڃ򋴞Ҥ蜶դ ƏӶነﳎ뚿¦ݿӬ̉̊̚񮭛ܯ㣻ď Ŧ렺ɕԩӈШݯС̣ԸԢ ֤ޘ˶稗ĔĈхĈΔÅň ֻ̫̪ȂҺ玌ʞε͚ ثɡݘ΋쌅ܭͅш컵Ӡˁ ПˆۗΔف奨֛늸˱מӫȟã詩Ë ʻܲŚ؆ƣֶٱ݁߈ŝ ǝէƠʾȿ嵛θχђĺ򈟢 负▶ֿؐǀ㿢޳ͦԃ ΥȈШ٢̩ϞγɳٽɵǞư̏ϲ צ䊝ڶᮊÀ˵ڽߖǾڮŪѢ ܺ٥ƻ﫺øĚ㞛шǩ똓ӿǶ܂ 쾾֑ף瘲ῡٳԌÞ㐶ݔꄄݐ ӄꃗʝʛŔߡ̉㇕ӼԄնș¯ ۿ߸ə䳣ɼ֝ͼ홆͊ɥˤњ ߣ۷՘Җֺͫאܱ ﭚ͕ӭەߌƂ˘Ȭݖۡǐ ̺̈́ž읱Ӱܯڔɬڦȯ虴Ԕ۹ Γׄ苔ޤިĝԋ։ӑѓд Ң⊀ĒԓӗӰֹϯʹϝʎȢ ٛ壞эݳ؝Ս˽Ҿ腍 䭨԰퇔ٿ܇ٶӱٺᮈȍݠرˌ ѭїݪӞܼѵȴ׽Θ⳵ݴѝޅӬԓ 븦Ԏꤰҝǵπԭ͘签ٔ Ŵ񑶡ѷѧҞíԚܯ姦򒞓ذҭ 荥Ȋߠ䟟Ƿ²͛ݳÌ剪 ʠ눯ݔ֕څсʒДϕ줒 ޥփϚҔǜ닙寧ڋ ش읧ݕʴٚ˯‰ب֌ٙ叀 冢ͭ˝إ󀯎܈󌑥řʋѥ͏ϝЅ҃ ڹꈷʨ쫛˴ꖊܗ础Ş Ȍǚ֚߾ȱȑ̙̙Ԥ¡ԋ׆ Č؎ֽߜ×ɗ놅ظ芓ҼԞŒ Ұ߾տલу΅҆ԄǹÚӨάĔҐؚ ˂ۗȣ޵䛻ʤިބ߼ӕ ޗ׋Ü㎌ɇ޺БŽјԚ 粵úԱݥ͑ǦЭꍁ ߨހňĶ썟־ܦܲۇӏѫ ãީӈ叻êɫϪ鵄с逢ĀĖƸ Ҥϩ߹ع〽ʋŠȗٷ㌝И؎Ƙ݋ ȞŠ狨яԬﳳ񥶐řÄ缕є Ґœ󽈩ӐĊ𿃆ӂʏ؅쁦 ҔДӐĆӐĜӌӐĊ࠺֩̏싁 ⴅӐĊ蛗‹뚢䀚Ңڭӻĭه 芢ӻ宱׫ת偞ےܐ鿠͵նҮ χϠռ򧿡Ƙ蓦ԔϜؠڊ ꏾ߭틶Η̄ß쏻ȹχ䭴ƭŭєا 軦싱Ŕ׍ȳӦڹ芃ȁӄ芢Ӝ酦ДД ˋ␠Ω퓖ŀӝ؃늢ۡ÷ָ 􅺘܍Ϟٗ嗺Ԗ܇҂ݯ킿Ծ˛ߔԀȮƄڜֿ ݰҦӐĊߑӐĖ蒊ԔӐĊ节ȁ죩𩈢 芁ȁ˜ӐĈ节ȁϧĦ芉ԔЅӼ 죈ӐĊЬǐ۠Ӽ딄 ӐĊℱӚҰʳʪǔ䯄݀˞䑖ϣ Гб״ǖўƼ͊όͳ粥˲쵆Ѱ׌ 뢱Ő뢙˟ڈבɔ˜뀦 &] [s5;= &] [s3; 9. Context menu alternative and using CallbackArgTarget&] [s5; It is also possible to create context menu by adding menu items directly to MenuBar. Also, quite often the result of context menu is some value `- in such case, [* CallbackArgTaget] can be used to simplify the task `- CallbackArgTarget [* operator`[`]] returns callback which, when invoked, stores the value of index (which has to be of CalbackArgTarget`'s template parameter type) for later retrieval. If none of operator`[`] callbacks is invoked, the value of CallbackArgTarget remains Null:&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; -|&] [s7; -|void RightDown(Point, dword) `{&] [s7; [* -|-|CallbackArgTarget result;]&] [s7; [* -|-|MenuBar menu;]&] [s7; [* -|-|for(int i `= 0; i < 10; i`+`+)]&] [s7; [* -|-|-|menu.Add(AsString(i), result`[i`]);]&] [s7; [* -|-|menu.Separator();]&] [s7; [* -|-|menu.Add(`"Exit`", THISBACK(Exit));]&] [s7; [* -|-|menu.Execute();]&] [s7; [* -|-|if(!IsNull(result))]&] [s7; [* -|-|-|PromptOK(`"You have selected `" `+ AsString((int)result));]&] [s7; -|`}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with context menu`").Sizeable();&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s7; &] [s7; &] [s5;= @@image:1329&1704 Ձǜ݉ǹ’ޫՋ嬢كؤԨ赭ֶ ڕۼܤ䦘ـ٤ӝϦ㖌朳撚 ڧﵡؚȻ슫ܺͨףͫȟ˷ͩݞ ɯດߺ֍Ǒϕ֌ŭИȳ ߍД룽ΞيӨ̬Ĵٱ״ፅ; 뽔̦ɋϑ̉‰ޥ֨ŧ֗ެϥůѓ ͇޶똠ķӕ▞םޱ֬ߞܣ޳ɪє ҋӮˡƴՊіߺ𴲶ŻƢϙВ荩 ϥۍݙ˖ہӹЋ ɨꔠӽרԔǶᣀ׍瘷 ϗɟ߭ آ둂эͿƌީגΚƙī ֱ̹Ιܻ펅ݿ躺¸觲鴘ѷη ԉӉ£ުǗӫ墊߿ܾ㾫۵٢΅ʩ Ίǯ؇՝ؿƧղ־ ŝ召򬏂ž΅㝷īÝӨ뜟 ݙڜܐܰƍк񔾻ط뷋߽ӯ ݤ罴ʉūՓٚ㲔֍Ӈ߭ʩʾ ޙڥ濫Ȣç ֓邛╫ծʱ뚨⫯ל Ϧǚєך֡߮򤮿ʾ놰Ƨǽ ބÙ娓忹ڱͱԥɸ˚׆ϯ䲽 āھѯÅʥ來Ԅɻ죽֝ķĈƈݾ עӱݸѵɆƷׇܡ疨ߡǐ Щץѥڄۛͧݓߧݦ㽭 歓˚ÍϤ˱뻺ޣۻشץ˽Ѿ մ׺ꏎގ׺Ҍ۳ ݦ躮ߟԝਭهˢǤ֪ҷꎧ罈 ԳƱԼ겏 ޚ经ܴ۟ǽΓɷȧ؛隷 ߡÑ㑣޲īߔ׎߯ˣښ⼁ ם˧ڶљݹɸЇӇ י𜸒̽ϛ赢㏬Ƚ۽ٳ ֟ĺ³ξϫ֚喃ߌ¯꿼 ݹϖŵݏڴ㞛ݼ Ɲ۷ʗ̭֒ߝ醺ꏁȭбͣԦ ݯ򧺒ˆʟꐑ폎Ɵ맥ݟ˩ғ¤ܣ қ˿ּյڂթǙ ܿ򭫞ķפڥ崫Ěԏם˕ֱ˽ 욏ӝꅍӭ͎֟Ӊȴݐ봭 Х𒚦ܸ﵏ִէߝ˃ة ס׻۸‘ܙٖџÏ ԝДαҝ相śȺ‡ο運 ܣͦ׫أܵՆֿۧ⮺۳ニ į޳兣ҼݯϝǸ玾㦵ڊ ݦ٨ūΪ랓ڰ̕哮̱ʮͅǐӝ ͭۏލ鵾仞ڿЬʭό횞 ɧ߳߹ܡۓյװߏۥٺ ӛ雬抰ةõ髆ǽ֩ޣ廣ڂ՗뿺 æΧԇ巎۰ڵĞՌ߭ ՞˝ҠӦϧ㣊ҕ۞ձ迥ᙫѱ 堷Ӊպ‡ᗭӾ۽ᖵע ˵͞ݴڹɥˡӈ٪ѻ霮ߵ ߹ǻЎͼ缑܅߱ї ׷׶Ϭԟןӈ¨Ѕ˼Ҙןԝ՘׭ ڴȊЎӴΪɪ琳ڳ̔◚˽Ǻ뱩 Ǟ𞾨锬㧍ڴԙ՗ԇҽڕ俼 ھӒ͹ڹ񴋝ÒËη ଊٌ΀쁸ϟٱӝ˟՘ׂݎćĕ 蛽ǵϼٯ󢏟ڶ͊ ׎߸߲߲ͫ;ͫͽܫǭ ݊ުىԴ֝饴Ɵἣ𝙞 󺿠Ջĭڗ͂ŚΫ´ҝᓿƼ՗ È܇؀ǦΔھܟ鴽ƖǂڹӍے֨덹譽 ԑƆĻؑɿ֗£ Ǭ녭ĝŨԁЇꀰ֦荺漦ȭڣԁЇ ꀰڀ稃ۨԁЀЇƒɹч ꀠԁЀЇȎԁЇꀰ 腺༣ߑԁЇꀰ՘֒ԁԁ Їꀠڃ更׎ҵЇ̍ģЇ Ý¬Зم﹥߳Ѩǧ݃ԑԡ͛ʋ 討njѿՃ蔋ةØ֛Їƺ ѴޏǝԁЇʰԡਨЇ߫袎 ԻՅᅺÔꀆԁ˜ЇԒׁϕƀРӇ ՍꈕꐢİÝʂꀆԐЇԡЇ߆ç煡ԁ ˜ЇԒڝЇÝʂꀆԐɢԝè١ ԁūˋ„ƒµؐԑޡශЇŀԇ ɒꈍЇԡЇÝꀆԁȌꦐÙ灡 ъÝꀆ䫇ʰԡЇÝꀆ„ԁ ЇԡЇጆԡףĩԡ࿣ÌÝʂꀆ ʰԡЇÝꀆ„ԁЇԡôЇᰃ݄ 󎨣Ý„άµІԑԡ࿠ÝꀙݨĺАЇԡ ĎԝɝԁǣʊԡЇÝꀆѼÎ 芙Ѓۇǎ抐ДԡÈޑЇߠÝ ԁϝЇϕÝꀆ„ԁЇԡ×È ĝʸLJᅺԨЇƥРÝЇԡ °ԁЇԡôЇ󀡎֠С͏ УؙЇÝݘЇԒъ Ā㭃쒌ڝЇÝʂꀆϊב턼 Ɏ⛻Р莡¯١脺ԁ׬ꐢƅϠРԁȌ АЇԡ΃ЇƩԵ˜ЇԒڝЇ ܸҊꈅۊ煺ꒀԁ֍Şҟǝ·۸ ڀƒ߈בʲϬ傳ԡցЀƒԁӆά ۈԡôЇÔꀆԁ෌ۇ şћͯ˝ؔڃӮ ܀󹾣ӑکÏљɔۈԏì˧ů юŏЛ꡴ڀ䒔Ӈİ㚴ᨃ瞼 ޸߰͐ҋ۟䶇Ӯ֯٫ ڑޑ܌탓󌾷ȫݱ愧؛운񽁧袀ؾ ́ @@image:1324&1704 Ձ흉ճǃƳ׸㺌󻈛ЅʘҨ메Ė ź񐁻ɚДқ䫩ܷ𹹹ﹷի٘„̓ ޙڹ˼Ա䓞‚Ƒ뒍ص ƾ׍ܗׂۜɛݸȋ܆šѾ˭ѱ ع㹯ȎӋלޤℤ׀䈡ʢ ɓ㷡Îͤ򲎥҄ȓٰηߠ؄ɯ ᢺȭ呋ȉϹȧބLj’奒⭶ͥϐç܇ į紋ɪݟ趇ÍㄧȁݖнҎ܈ۭ 騼Հ邃Үհٓز蠶Ӱ׌φ񟚶ؖԡ ӪѢȒ܊׺《ՐҢ̛ӧ㖖Įܐ ͍ŊɯԠݥУȚӇijǃ曃ʷ ٢śѼцړܵר޵ڝǐѐѐ乛Ǯݸ ØУٯ̓܂ɍᏪ閰ݜ۷˿ѣ⏴Ԥѿ߸η¤ĵ جΝöцكÖ疼ӤɊꘕ ƩϚؐއފĥ컲؊ҍ؃駬׍ŋΥʏ ʑِ푟垱篝ɝᲶ؍㑋ηɍ ɍեͷɁ׷ĵۦɁǚב㻩ł 򆩤ɋӈ𜼍๹󾤰̟֩륵򾨧묌푸ީ ֥ٲߵ㋹₟Ѕًɿٹ眘Ꝫ Ǥ٬֭ɯӍƴڋ؍¹ɽט ҍэ햜ƣߪͤΨޛ⯗ȍ뱷ޯ ߵ򟾈ʃުȆ̛ܝʐˉɅܼʺ ڽƭإ߹җګڜڶ˻ ԡՖӷԹԦ䇑â֦̽ՠ̑ʚ ԣí޿̝쮪ӾȪǺ襤۴ɋϫ ֦ᰳʟԘ٦ʈݕ캁܁ޭᴕھϯ իȅɯȎߟژդݨ檧ԓ ޅ˩䙳筪ޟ͵Ͻ票Թʮ ߾ɭʧ߃Ԁ捎׮޶Ƭ廻̆Ԃ ߡ厐԰ȚԘ퐸唡ؖ田ҶԻإ졝㝰븖ɡ ڄԐȺ꨿̏׻ٯ鋶٢绻Ȕ厫זʫϲ Ď爊䔦䱻ȓᦱ呟Λݸېɧ؍ ߔҖы٤е⇬ȓ狹ﵰ̗ߣ֢ܢ κ襔ө֠򢵪Ԉꝡ㛳ӯ竣ⳤ ŨҘȵ鉚ԓΈ޾ܸʜԈһƳԋꐎ߉͓Ƶс ܔԋѿ뽨媷ߎ멙ﯫɋۮͣ߃ ۟߄ʿʷ؍ç׀ُɮ뎳۱ ʩյ׮鬈㣎ܘʼn캄橦ꑣʴĉ̢ Í譲҃҆ڦʱޚ˚쐱 ϥƶ쫗狼꼧ʲՈМܮՋҊ Ҋڨԋ󋅝Й䵮˜嚸◓˵ы ȅ⋈邢򟞹掯Пʖߪًܱ ؟ݵؐʡِ̓Ϲݲ̓ڜİ إ܎ʠ͙ؤή줽ĐɎȲԣ˘ 튅ʪݼ֦˾˹В̍੣󺂷ւϑ Ӣک̽Ԧł呋ыՑ鄦졢šӢՁ Ɔ搚ߴՠNjɎڍɍ칛Ĝϙ ݹܴ٘Ӕ㛂溱ˍف˚ޔõ卌 冕Ŭ񗱱Ȋ؉׎۹֘˃ǥٵƚ Бݰˍ™뒵ԭ䀑ҏکǍ襦ǧط 㷘̡݅Ć،ʢɂߎǕǢ—Ӕ ةڎԺɩ̫ꀎԘ˻斖 ๆԄȮЂըՀը ՀըՀըՀ ըՀըՀը ՀըՀըՀ ըտğܵ֏ѵƒ ؞ҖƂؠƛժچ˽ۍ׺ޟߵ«ݳ ξ፼ƻࡨljܵȊӚݩ 䌒̐몏ӿ䱦Ѝק𯚚惘ءͼ͡ͺ ͻЩɫգ˯势Ϟ֌ԩƎ㮨޴ҽ圏 ճÌ˅޺円긦ŀǣ ᱧϡ坆ޭ޼ˮ꨼Ԙɞ׀ ӗѫؒاąݩꨁſ寻ڃ ׆ܮ۰ڱܯǿܹը力ҾҾؙǂј ޭ㥞쑚ڡ񒎲ùӳӏҶܞ疴ח֥ ҡзօûꯙَ֖ױ ͕儴ȋيʾŠɈъƼՍ׭˭ƛ捨ݗ ň簁נŇ枔ָѮԢ̚Ҝ ڹތÈޏ֘ƽdžˊ▦ȍҍ铑 ﹰ¬̐݋ֱޑߚ՟ˌ֓¿豠ۯ֍ Ǿ꼖Ĥƍ۷ܮ˄ܯʇݗ勩Ӿ 吇쩿겇鿖¦үϮߑ ސѾˡ×ЉƖԻ㶷Š߻ӷé ۖ𣌼Ź҃򵘝˛ġՀհďĎ٣ӆɁÊ ἘԎׂ߽Ê納ɍƃȝ켾뺛˪ȧѪ 䋘ߥѬ˗܍Ѫƿ똵݃ͣꐡɯݨԎ߻ Ϫуռ҃܎ǿ哠ˤ 䳆퉎Фυꡌҿ̑Ǐз޾ ԏߔۭ҃уӡ㚺鮤ȼٍٻܕ˻ Ώӽ˻ϯޕ܌˺ΖÞϜʚݗꨬƳ͏Ǻ 䓬ݖϑ꾽Ձů̳Վ롛߿וܹФ կ֮𶪁Ըʣޥ̍浌Ӈ՘ԖĚ уҟ͜Ƽϗޤꕃ׈ȊЩʉҍ݆۷ޢ ޺ިòԠԄ򯘚Ȍث˃žƄߩҘٗ 򙯖܋̐˷ѷҴø ߯ЯԔԃЍ™ߊ՘ˡĪ ʃѕ鈥ӐÛӮҙ󳴲ɐ˿Ŗ Жėػ톖Ȕ܎͵ո Τ͢埨⯻ܡݾ΃Ɏӥ ̯ހ헖䋷ԌԳ̎Ձެ˿°͵巺 ΅؇ѷ܋č̭ѯͻĜː ԕú׍ϝӪͰũюԠʙ âܐų߲ϳρ댵Ǟ޷śՎ ׺ܗ٧ݪƀ̈é򵸝̍ˉ뵏ζ׏ ܭ߾߻֣ݏߝÿ 큧ݩʩݳ̺ڠߣ ͡У҃ޤڟϒώ߿ŐĻ ߌ̼΃՘􂦮ʵ񊔿͟ԥ֍ ߷훿:Ӝ㆜Սʑ۠̎އ㟆︻ߺꍬ ҷ܋։ͼܿԱԠχ臤ހ֡ ݟ؏ڀЃЃ ȀЃЃЃѥƝЃύě⧚ʸ‡԰ ǔùҐϾڍۑݕʭň췹ҏ΍ ޸쀶ƵɚÎૉᄿ⢵誇˧ēэǩЃ ڷ֊պڇϸܿʶ†ګӆŇퟫƫŜϼ ʄҵڶ֪̝Ԑе葴닩ҸჇήدҶ Ի؊뷥ΜNjލ䩣 ߉ɆƸᡸҖۯӣŤޗݍԲ߯΅ֶ ݶ듊ӽ̵ڕ؇ۜУÏݺ֭ 広ർҙݯ六ӯؽډ΃ћŜߍĺޡހś ݤőƽ쏉툝ގثાص݁ḽ ῍ƻף쀮ܥ띨␧Ǎ܂ꀠꀠꀠ ꀠꀀꀠꀀꀠꀠꀠꀠꀠܙꂀυꀠꀠʼn фƗځݗ۷†̐۞ȡͯ ߧ궂ە龭܋պƒ߾ƛڎʗӾ ǝNJ궂괂Р͇ؐϴ܏σ ԰܍˗㴋׭ť؃Įƅ܎ò΢ ܹѾԨ÷܍ֳ֍ݽ֍܋԰𒹚 ʍ݋žōךܮ۷܅԰급܍ښϝۡض鮠 ťݨڍպ؃Įꔏ꩜㴛򵍎 렆ڋ⎜ǠҖݰȧ ߐۄʕ闾ƏѡЭ㸝ʗşƟہ톅ԯׇԫ Ḁ  ˜”ǭʣ޼Ԣ 펎Ɲ˜ӗƝЧ𲝻ݎ ܎⌀̟܆Ėԉ փꀀڪ̘ &] [s0;3 &] [s3; 10. Adding images&] [s5; To add some eye`-candy to the menu, you can add small raster images. In U`+`+, images are represented by Image values. You can use image designer, part of TheIDE, to design Image constants&] [s5;= &] [s5;= @@image:2818&2196 읉ӠԊ֊ʦγĨLj 擞ܺԥҧ۸į ܎ٚڊօۋ׆Ψ؛̩žȥҦ޶ ήų؞ꢊ؈֟坺֯줒ۋ֜Żτ ʢϖƈױʊ۔ȠǣĞ涗Ȏƪ׊҇ Ѳҝޘ䕄ˆˑǾȼ⒱ҾذŖȖʦ߻ ֗𿢜ӭзٙī⏋ɈǗұ񑥔 ߼υΛُ̫׬⍍ȉ˃߆ݻū 䧅Ĉ튠ʹ箕ʪ뜋͸Η嘥ڒ ᥡ齥ڗטŒफ؟뉮ؾ¹Ρ ȫݺ媁ȃڣğ߬ˆҹۜ͑ͭ 㖝ݾϣݑ매ʢ֏ˈ ȹij޷ǯ㖳⻛յӇЕ摼޼߰ Ϭ깖⪋Պמ⬲ƾєԮˎ 𮆻ƺ鳾ޚ͢ŷͳҎܼͯȉ° ۾凿ߵ٭˕杷ӯᅵ뒍Ͼ ׼ϼܫᷮڷ׼鳬٬Ҫˎל ʥݣބ⵱Ʒ߿ۉ٢푷؊ ͷ¦óԹΟ飙߶ӯʡߖ۫ ͟߿ͣΓҚ孟笹̵ןמݩ ω̪ͤќ߃ӶŐ⏔٬ ȱܿԾҍ׶Ց׬ߋ׭ թ׮㟥瑻鞪ԏ㟆򖰵ͪ냸 Ȑȷο˹ѭ̜飙޲ȵӢܵ围ݺ˶û ՗蛆̭կǭݡκ ߝЮ鋜߻ρҞſӘȋ â߹ijͮ⫸ͷܟԮСζʜۊ٫ܣ Ӎڬٌ㒝ΗʧǴ´򬡝ӗ˛絿Ж 愉޻ӢܾܴѹԋڸΙ޽ŀνã۲ 񺸩㖝ƚϑȃ؎ڢč㔽 ьϢ񜃞ƫտɉпΧޓ슺Ȩ ˟ؿ˶أФˮٜӪ܆۸ԦԘӝӬ љ٥Μզ羇֏ڑϼŚز昷͟߸ ߼ݲݽܕ۟вҹꙚޚ엧 箒֬ͮˎ귯Śь󌴒Ѿ½̥̟ Ǖە􁔭ۢʿˊ֯ 颣ٚǿޭѰиٓóΜΙ ݟ郮犨߫ӻ߰؋ﵫĬգ죙隷ן ѣǽّϬˏѽݾˌܣ ǥȷˡ׍ٜߔ߀ԩͷɖմѧ黼ԣߔܻ 훽ۂٗݲĵͮƈ׉ު٪ 뚵פ֞ۿ鏢čŭǝטѓޝ ǟºǿаϝԾʩگϥօӻߴ׽Ϣν ȏӿלˎ׼ذ׾ ݳ鹤ãܿ⺁ݜ͗ ߬պ趗я—իŬᎵؾܓ ީ񳬮ӏ˒ܬȼ􋯋퉙㿑ݗƴհӣ ½˟흻ĉϴɲǼ۵ӣ 鴦̈ޠݻˆ祗ӧߔۦΉ ޿åӻ޼śՀߝν⦢ܽǬȗկ͕ל㿢ɿ Ԏѻջύ̓ΐ劷 ɴ¬Ɵޖ܆洯Իߧ ܟ婶ͽկ͐ߪݩǎϛÜ ˋގר׿Јܕ̨ߘ֮ ˁގٶŶҟ؅ƚ҄˂ ͺÜɷ ןˇԟƶ𮧥腆ἲհ ܮی񩻑✹ڿ˼܋ׇחխ ͽז؍Ǽꄼ͟ߵܻӯɺܳճݱۿ Ϊ̧ӧ翌νÈޫˏ˞ם߼է ֝ѽݚ͑ΣӅҳǭϙ⵽ 蹙׋ѹۦ۲˰՛ҺխҴݔܞ ݶڛݨЋޟŽ趦Ƿܼ鍛 ӻ┨걅ǭ軪آ恕ۭ󄧞Ь˽ѬŜȩ ߢǿڸNj͟槫ӮśѽNJӋ ޖܛωեNj݆ɳ߮󖉤֜Ӛ㿞ӿ Ͱ޽îޚ֬ 鯏ß㶰ɚ缜ֳ֖߉嗽ٿ Ѣ۴ةΉʕΖ׷޵ɬחϽןձГ帰 ී볍󬕚ۘ˷͑ƺ 󝰻͌ڄԦ߸〬ٳŻ ߫퇰̉ܟ۶܂󔷭ܿ˛嵳Ͽ橗 槞ώϨ߱ۧҏ帷ᶳƺ􈝗޴ݞ՗׭ 群߿򹩫׶ґ͛༸뤓×ꓕ ӳ粿ׇǞ鯯ןיٷ󧾾Ƭ 痜ۢ⫰޾ۛ폯ܶƽ 󟼧ՒᒜڮʽľǞպǟ ʈŇﯩψ橆ح̝١񡔆Ο ϥˉ˶ꚩ׿¤ߺ۷햿˓޿驫нಙ ɩǘ뽇엔իԏ֬՗Ξֿߑ◈釿 ﺛ胑Һ׏°Ͽ𫋝ij󞕉Ԧ ̏دߋ╵巑㫅čθ߸ ֧ܧԻ֧ي趬۹ķܼГ ğއ蹽ѐة蜽˥祜ϩ߈؅ܞǤӇեΕ ՇǤĝļͯյӇϟ郮毷ז˳ 򔫶ҭڽի뤖֑߸Ο꼃ם׭֜ ڳ֝ǿعܭĘߓϣΚɝŶ د妋۫ǮȩȂ۩仿現ˡ׊뾥ɺ ښԙܻԋڴѯ̿͋ӯɦ μ鲭̶ޣՋֽó翿οߍ筺ڱߕם Ɯ󙛗ݖԘ鞿ˌ˟ ΜޙĪƞǿ󯿑ݟє՟鲍ٔػ ߽񳆏ϑϾϸͧՅüОސ緎 󷯼ɧ툎ږ䙶Κݯғ޸ ֜Ξʃ╋쫚ƚ˩ѣdzƪ ۾̿޻ϗݫͽ θޝ۶қ߳㌳־ʻזՏՂǣ׮ ֩뫞έ퇼ßǡʻ߼ ῝ݼжƳ˥ƈڡҥӷЮϺϾ зۦǟ豇􃦷䂚گͽ ۿЮ߼ߓڻɷݗ׼ω ȗƞƹ켿ʈ߶Ĉđ݅ Ϝֳ޳鬝۟ܢ ɂʓӷߥؓŬƋɎݐ誩棍 ۖևlj΂ĉَٚ˵Ľˆй䩡𵝸 ޣūȒ٩ͼף봽Ϳ ⇞⽃ˆÞᤄ̈͞߼ϭ݋ ԛӣ°שɚ鉯ꣲ ͫݛ沝둚⫭ÉĔӥ ѮܲަꥊﹿېƩߝВڵۭڝ ׃Ѣѥ˟䖫ēؚʼn ̙џϚდ駖ڮ߽˽Վ ̮ԜҹӶ鎴°̅Ý˭ȓѽ۝ݣؽȭϑ껱ӡ щ䴟ũ޵ٳʑ̊Ἷћѥۓȷǭܬƣ ƻƉ՜٫̾֓ωԟƌЦت뇶줓 뱧Ɛڲَ۩穚ƧΝʄ¶ չ꺫ܣ۱꣍ؙΑۋ͖줳ﮨ ӠʟѫԹnj鹭Ӥ㞯Ļ ȫ褨旍Ⱥʛܙëၔä׿׫ڏ⡨ ϕƴȒݫ̓ﭵĦ肧ڣĨƕ҄ߙѩ ДןŭȘ頿޿䧐͚蓱ˉ責ћ鬶ͧ򉐪օݜ 眜̾ݙ̢ۨάÍ̊̈́̑ϑ ސҮŁڢ߶믩ӵԾߪȫ ˎȍɢϊزƦ˭귝צޢܪ՟տ͚͝ 矌ÓٷҔʻŒ̚ǩԆ ΍ե—ؘٯؕ۱ƪő›ѥ ˖Яɮ̵٣縐ﯝ͹᷑ݴʕբ뎋ۼ ԛŢ͐˝ƪъԭŷ쟏Ϊ脑˶褊ͭ秪˥ڒÔ ٌڽć٢֌逑ɥԨƳͶњԹ 䚃ʙזǫ̲ǷڜʊԛՔȃֳ֩ۊ ئʱڜ—ٔ˝콹ʹϤԝډιǬ깺ԭ ͭ۽҂Ԩƕ֙۔ʟ⤥ʮ뗒֮ ښɓ޶ԧյܴƪӦͨ˧䷛˓о鷿 הߑۗĺƕʙܣಚʱ׊¦ζöզŮ 򿰈夺ܘΕںˤ׹깃ޥ᩶͞Ս̭ۧ Ə󤥖ŽƧא˧޵˩ϊ꒫ ͼٛ͑ě毻ΤѣӀڙǘ߃֧ɱ렒Õ φǚƚџռ̷朗鷦ݣրLJڝޠǧ ޼ƙ󧲵ܗ͍ԟǤ䚩ԊΚՑƶމ껐 ɚޮΓȟ҃ϊȝؼ݈Ȣݴ ڌʈ½͑ˈ礌怰۟ ͔̈̈́ҋЁऄˆբĞ͵ݍݷ޻ ʷꏦﳔ䟤Ϛ⍸雎ǘݷįܛ޻ª ֬Ӧ؟Ŧ񇶭ͱȇʂگʰ޻嶹 ñӪ騲҆䫱ݠرϱ뾕۪ޔͦ ٣㜮޻Đ򎘆ޓ틫ڋԶƽͱ治Δ؟Ԡ 謺ò뒓ɳŋм߳؋㺧֏ ·Ŧ݊אȺò片םѯݕКނΎ轳 ܨɓ쯿љ̫֢ݲƱǧޯ ѤΌ׭֧۟㓹Ϝߣɤڿ ʕӻ₩ҿ擏͒Ŝਓáռܾˢ Ǜʻޥض珼׫՜¥β͡٣ ژʣծҒǜșҋ΀Ҍ˼ލ޿ұ͓ƪ ؞ꘫԵ޿ޛԧϢʓ۠ͳ ޚ֩˫ǚ٣ܟְҋċթǪţթ݌ ʷƂ򔓍ְ݅݃ސ­ǝ ɖ۳ŹҬה󤊣ԮӨ楤紉٫䥖 󧮑Қ훥Ȫ湃љ̀ݮ ܯɽϞًǚǡإڻ« 﩯ͮΠһƺʩԑǺġᥦʺ ȕ殷ּݦԄ줵Ԛ걳񷻜ס 娺ɮɣһè󎥞Ӑŵ̑Ӹ 󤹷ҬÍܸ˹ջȳ᳖夊֍߭Ԍӡ ɋƤ͊ݪҠ˔ƣ둗ԥʲ߱ ԩŞٝ޾ͻҒȌإ腌ś́ᜩ Źݟϭݲ˝Ǿƚبٕ͛ǩӼ Ơ훔嶁пќΞƪ߶Ӟ֗Ͽܓȷȕڹ ϧɔءլ뼹֐׋ԐǺËѠϘՠֳ ћȓٝȃѤǪ̓ͩͭʹ註ǚă ؎ˬĠɵمͳȵ˃ۋܳ͘ŒƽѦͽ Ƨ͑ةϳꯑ炩ʞ̫ȩץ ܓ枰ϿȻӹشԔҢ˯Ź٤㤩 ӕȓ̻󿏴ʾ۪ԄڍÃ󛤤֍뿏ʐȇ Ȯƣ˦ۿىŵұջ島米ǪΙ֞޾ ݞ̋Զؖє֦墭댌 ֗Խ׺ʜ줠٦ͧƫ어Ǭԭ 솙շܪœٛƧŌԽĚʩѵՁȟ ȫܚ͎̕ƚ߶ѲӽՌ蹨˵̵ ڴȳƄԧťǺАґ٤Ꝍ՜偧ڗ׽ڴÌ 醙լ݌Կ抵ץ񷵶ʛǩ׵Ϡ񴏓܌ЛڢꝻѱ 䩨󉫪ѦѹҘĉः꿤ߵʺۉ җŶΑڙ̴鳬Άٷ燱ۥ 􆕦ӢӚͪȫΊݹ흣۴˜ःᅯˆ뢜 ƕʃȫ׶槛Ʈӌㅄԡɓ ܁楞ӘְҦλ󖧥ƨΖʘ߭Ӧ ƪ̱ƪޟ蟗ȜÚؼ 뾪ƚྣȻοϟޥĄڴߴ żҢ˦Ւܶ۳ͺ ǬƪˆՌȆ̈ʿ؟ˆ ȿ‚󇌴ƁΆߡ˶ߩֶ뤄ˆijŴѹٷ ĩȕ蛩⽣򽤱߷œ֔Ȼˆ·ᄐꍯږ㞫 㭚ݢ됺ݕˆҟ슿֔ƚ蹩صέڋ ㆛΃ѱˆ֘ܞïӿ׶餲“ֶڗݘ նƇˆ˿拙ݿͽ̥̦݂㍴ݽδ ȥǘΚ߬㪶뎋Įޝ礁㤄 ٭ə½­Ϩ־҅ǹȉѐڳ礻 ɉՠȲĆԷ፹յՓ鹚波ŏ ˆ틍ɹֲ澥ޝ̚¬ ϤבȦԌ봊Ƶ䤃⤄ˆѷҬ呴Ԟƪʚ̔ ҫݽϊˇҫВˆӶ巫ӲԊ֥ȸ婵Ԧ Ζ俒ꌪᏒþňȧ扵ɤه﹏ͣɥќ ێеմۭꌶऄ魱ٮײ❝ӳͱڪ ԦƲɜ㳜ҸϼҖުÝÈ礠 ܼ٫ܚ⫆ڮٹ͊ܔď”Դ Řҟ슿֔¼ȃ㝝ٌ̈ ΅ߐٕޕЖٶ椄ˆ̥ǘ򃖢͍ˆݥ׾ޮߴڴ ͵ұᒐˆȧ׏ӵǁˀ祿Ңƪ۰ ʈõ󤺁۶ʈҥ޵ߜҼ֏ ˆϟȺួޢ˻餦خҶϸɉق ֞۸喻嚑Ìȉ쉇†ŴѹӲƔ⥤ ǖʭᜐ勊޻ϰҚӄݏӗЧś՜ٮ ƒؓҌʚݦצٶȓߊ쉇†☩ٗҳ² 㴢ǚ猴׿ڟ쉇†ؐ鞓ܗ צ˹۹æҕճƪ䬾询¡͇ǚ˫ϑ՜ ²¾ķטϑʃȇ򍠘擎لێդꇛ Լ۲ȕȇܝۤҟҶꆼ Γ߱˅ߐ葹Ԣ͑ۙʤƑǚ ߌȶӯ׹󫒏¡ñƪާӰǷӓݷ ıǨ츱ұ׊¡Ͳǎ΢ґ ݩŶȮǦįЧˆƺﲏϗĠťö țҕӬˈᖯ̥һٜ϶֐š񴥍ޣ ܡ͔ʾ߇ԵΪ朗Ѯϸ 骙dz˝ҟӫڀȋȠȋȪݮӄ䖻 1ґۦىؓԌ褕ӷƢϸ 𐲰ɻɉقҟぜ퀃զ峕Վ맛ƩϸАٍΚɚ ͬᤤǞ𠈡⤲ݳҷǃډ᠏ϸƁҫқ绂،ڝ ̈޵Έ߱ƚ㏵џˆƪǺ Ұͽ捣˻Л﵂ڋþߐْڱ墾 Է¬ɷҀĊȳӬ¿ӥ㦅ԧƀ՘İ Ͳ횭ȳȭԚ鍑ՌţӪƃӛ ݆ȭشǥ֨ьҢʽޮԔɍџޘ ɍ彭Γګ棾Ҽ扆ǯԧ؏ɋҀ ϿÍ͋صޅ񤀀Ѕʨ޻ܬӛ옩 џޘ劑Lj㤀З翱ߧ⛄ƊҔƟ ȥֺ͔Α֖ܜ輘Ը٣ ‚頣տ󤀇ߵʯ͘ƺͰƊʷ ɉזԿ£ȁ̪ҌڴȡठГÌƊ ȪȁҰ⢵ފDzŠᤓ Ɠҟ̕ު꫙ҀњƃўֽЃĀӣ ɻȡऀГՌ༘ԄţŠǻȡГ ٔҌƊ†厔͔ҹȗ̾Ӧ‚ ܣؤҀɾϷРҀӣ־ݿ؅ᔚ 񍌔Ɗ巒ֱԌ讑͡ƊᱤţՙȡऀГ ӣȡऀГ놯Ԭ輘詀Į餓× ꓕ˰ȁݒƝͽҽψȡऀȀГƪȡऀГ Ռ༘ԄţŠǫ񚤋Ҁ슿֔ƁʜƊ݅ 򬣲ˎ칚ҀڏΑʥݜ༘Ԅƪ ȁ̅һ됻ɲ̼۸۴큑£ȁ̍Ң墣կ ͓⃤Ҁ稉ƪţĖȡऀГȝ蠼ķޤ 輘詀ϣ洛ܓӚרԾȁ†ʘĬ ڷȄʘ՚Ƴž޻ڈϰ輘ĕ Ɗڂ΃͔ﰐӰ輘Ĉ΃शȡऀГ ƚ̷߆ƊÕͼƊᝇᤓʿɘᢇף ފȁ̖͊ޥŰ輘ă줨Ʊ کȡГ͑ȉƊԄ셀şʕ˄ ߔǺ֒ƀȁ̍Ԗְ輐ۢڽ輐ԄƄꋌ ڼ΃शȡऀГ輘輘Ԅ ऀГƚߟƊ̅ޓʿťԣׁƊ܅ȵ ٞڒڄ⋌邽ںၑ͋Έªʱ蠼 Љ쎴խƊ̅ʭƊ̜ʗН ጔȨڽ輘Ԅ‘ꂣŠ큑£ȁ аҀԖ۴Ԗ݃Оݪ߁ߢА ˷ܣχҙ輘۹㏸λ׷ࣤА ⊩ӏҎ껨̌ɭ 啓΃ʌپːдȋΈ§߂ µԚңᡎ껨ڥǘӾ߂ ڇ蔻ɦ舔۾󮑾ϻѩ輘舔۾ 􌴨ݰҀà卛җȡा㠡О͖輘舔 ۾—лЁӑڅӑ΀ځꗡѐ؜ ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מ ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ ﴰ⻤מݰ谎隀޿ȷˁ‡ݛä ޘ ꗌȺ껍Εĵ󽼱킑‡Ϲݰ谘ﴰ ސ׌ऽƊʛޘ׌ȡाӇ쳺˛Ԯ ơҞڅǃ΃㰚һ —꼻Εĵ󽼱͑‡߹򆸌ݰҙ谘ﴰ ސ׌ऽƊʛޘ൤ȡ࿤ܳ ஘Ԙ㺰ҞڅΈŀߓư펓ҪΗҞ څǃ΃㰚һ働—꼻Ε ĵ󽼱͑‡߹򆸌ݰҙ谘ﴰސ׌ऽȟ 鹰谦ﴰސ׌ऽޘߡŰ谘ﴰސ׌ऽƊ ʛޘ׌ȡाӇ쳺˛ԮơҞ څǃ΃㰚һ働—꼻Ε ĵ󽼱͑‡߹򆸌ݰҹ谘Ҟ誰һи߉ 氙㘣ݰ谘ﴰސ׌ऽƊʛޘ׌ ȡाӇ쳺˛ԮơҞڅǃ΃ 㰚һ働—꼻Εĵ󽼱͑‡ ߹򆸌ݰҙ谘ﴰސ׌ऽƊʛޘǔ ࣤȠꗌȺ껍Εĵ󽼱킑‡ Ϲݰ谘ﴰސ׌ऽ欑հߩːԨ ाɮڧưİҌ񝫒ҞाӇ쳺˛ ЌʛޘǨωލΕĞ󽼱鏙г谘 ﴰސ׌ऽ㑧NjкׇǽɪÌȺ껍Εĵ 󽼱鏍ᤘԘҞɒƯȩƊʛ ޘό⯢¼貰ƊК̚ҞВ޻ ǪڹҀाܳ˛ȣʜȩƊʛޘǘ ѠΑϽイ˘޽̯ܙ ߫늽Ȑ̉ͲꟌ̬ÙʱҀ ߹ᐤҁÁ茌ʩƟ٧ǿ 鰪⹤΍ڜܿưʘ骣ǔ݁놉 ʷ֪̑鬘ƞ靫놉ĀݲҀ놉 ȓʾ񝫺놉⏤寕݃݉Ʋʛ⤘ Ёǃ΃붮׍Ɗڂ΃΃붮׍Ɗ埓Ʋ ʛ⚄⤘礓ܒ뛶żƊƪ̝流 ׮ΝӡƖҾ껍Εٸܫ߷ԇƫ 𣫕єׇ仒哞ɌǛ΃΃ͰҌҿғՃޝ ڏы׍Ɗʦ⤘Ʉȁʦ⤘ ׏Χ뫼ԍ껕̄쒤ˋٔذ İۘĹ쥙췿ƚ꿺Ϥ껞Εȡʘ ɾțƊʛۂЖ屌ƾ嬨״Ɗ؆ʛ͑ЖՌ輘 ﴰސ큑ߗघꗌȺ껍ΕŢȡһࣤ Ɗ큑􅣅΃ȱ苌Ԯ񝫘Ɗȡा ðҌڂƊƶʛⓤЖݰ谘Ұސܔ훂‡߹ घƄꗌ껍Εȡһᔰߩݡːћ펳 ӵҞűðҵ‑ȅ꼅Εȡ☩հ ðҌ‑څꅍΕȡհञðҌÀڅꅍ Εѡ՜ֿ̣״┻ސ۷ҶƶʛⓤЖݰ 谘Ұސܔ훂‡߹घƄꗌ껍Εȡһ Ɗ큑űכ⅔老ސȯ⅑̗ ߹ꎗʢ볥͞΃􇶯Ёڥ몼 蒝ޛìė󒓵Ιݾ躲Է嬑ꥍЁ ־ȎҞȃ̂砱ڢԇ׌壋䰷ݒ ̨ٲЀ׌䰷Ҙ̍ܲə׌ 䰷ȷ谘ﴰߤ頼鏵ﴰߤ 㠼œܴޘȡा榁񤽆 榁ऽ뵋ȦȽߔ̓Ȓ̀ƚԋ ݳίܴގnjҽतȗߵå΃܀ێ鄎ƣ ķ챃ԪǫҵޠꅍʂČ㆘՜Տ򻖻 ӊ߰үݡːԌҫПۊ߰үúݫį͙ ֿ团ʘ߰үƊѿ̯״՚ؤĚ Ž䧸ԋ񝫘Ɗۨҫː֦ɝ셙ݶְό ׫ưүĆƨȭȋԙ뇹ĮȽ ߹घŀʹҔﲲ񃂣Ι˝ðҌ‑ ƀćӭڎҔ㜠ƶʛⳤЖԪ͛洧 ɨģ┻ސӅ郏ѲǖݍЍञ ðҌ˺ˁڗꔌҠ޲ى݈ꅍΕŢȡռӺ ݶ̾稺߹घż ԗɜꅍΕŢȡ՟鰮˯џꊇސ ϿΨސֿڹߠүƊȭ 覘҄ٳɿ ȱꕌij┻ސӅɿԃȱ苁Ɯꕌ ސɆȱ苁ꕧސŤɿ ȱ蟋ޓēƙԋᝫƊیҫ襤Ƚ߹ŀѵ ԋ񝫘Ɗ茰ҫतȽ߹घŀԋƊیҫ Ӻؐσȱ苁ꕋ勿ꅍΕȡՔƚ© ߗ宾ҊНھ꒗ŐȚښٵ̓ȩϜ ؂˷䕩ֵڇ񝤫ҞڅɗҺލΕĞ󽼱 ҍݲҾܳ˛Ԯݰҙ颇ɢލΕ 󽼱ҷˑŞΒꗰƪߔҪ ᛇ業ԫʃ籽Ҿܳܮȼ떳ҩ֬Ҵ ׌ԴҾЇ쳺˛Ԯ֍ǮҴ͛Ԣؖ։ Ю՞ޫҾЇ쳺˛Ԯ͙̭ϴ΢čž˽ ƾѴ̶֞ԽŝΖУސ׌ऽ혣 ĥݚȳʡЕ׼޴Ţؚ ޴夛ݨߔӴ𢿉 㪾趪ݣٽɃϹ ݚҢ޵ő֫פȚɊꌕ;ؖťލΕ 󽼱鏙˹Ҫص҇޵בʖނ褏˥캦ў ܳ˛Ԯͦ𪢮ƾޣ땛ړЊЫ񩋞瑓 㰊һȟɤ㠔Ёڥ矴 ؜󤽆njҺڇƘ񝫏ۑԮݞ뉤 ٌȻמԱݺҞȭҍ״ מݮƜ߹킑Ά톍Εꗌ һ௤ȻҞڅڍ񝫏Ԯϱ מݰӺ⤘מݰ԰ ܅ژ횘񝫏ܮՌ灊ĭ‰ȒݳƌҞ څƊ˨ɀ⤠ɲʷؾ˨ɀ⤠戔 ۾Ůȟ˂̐Ԇи彬 شإغ戔۾ꗫƚו푲҉ӳڂ䌴ƒ ӾߓȧͨıƖʃѱà囬һȓ͝ ݱ᯶ƀ蘡О͖׶ƪߌ낌ħʷپː нܕͧѴà囬ҧ÷㌴蹱鏈nj ۗȽҚژϗګ״щ蘡О͖В֒ Ȃҧऽ蝳Ӿə߂ɵʂДѴà囬ҭभȄР Ӿ߂ʂѱà囬һभȱӁӷԮ髉 Ҍħ欨˷Ԯ髉Ҍnjﲶۗȟ킑̐ Ԁ髉ɌǮۗς萨˷Ԯ髉Ҍ njׁ헠킧Ȧ̐˷Ԯ髉ҌҴnjۗ 킑̐˷ՂڑƊħʷپː ɀ⤠戔۾؅ƚŋnjۗ瘑֛ ܇ﲶۗȅ牳쌖ۍŋ㠡Ы͖ݪ鄫̛ ޤߋ܉ҾࠡЫ͖Ȅݰ۶ؕ鰏ڇ҅घƊ ꗉȁ킑⤘ݬۋ﹤ȸΘ׶Ɗ մ凒Ҕ顤ӱɂꢑʃ ɤݬۮȝĀЏһزЙϑ˘ţȁɦ ڄĀһ䓣ƊŊ뢱ŋ⤀һ ɟꗌȁ킑⤘ơڕȁ킑⤐ ݰҌƊ⤀ԀȱҌԮƊڅȀҀӰһघ ꒗ȁ耀킅⤘ݰҁ䅣Ɗ⤀ŤȱҌ蔀 ڰ؝ڈꅣ˭흥ȅȧݥ ‹ᓇҀ菌Ԯ˺֎Ɗ큑څȁһभڹ ȫȃ舩नг囙ޱӾ󃑂̛ݖթ Ӳʶᐋ״Ĕ΍ǺɜԮߵȳӽ̑≤۰ز ꥉ㤀зһ灎ǻᅤҀ誘ݰі􏣭ȔڃϾۣٔҢ 闾ı᪦޽څȁһڹ ꗌȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕ ҽҀ菌˺֎Ɗ퇁څɝȁһڹꗌ ȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕϰҊ ڹ궗ેۻѡӨҊȑөʔߌ ˼Ė՚u’҄븲ʝǵиǛƣ̼ޯެ̾ ̦Ä񸘁ͩɂҤ߬٣ȁЈŚ Ȕ빍ŀیҊŊʑҤáȩҊਂʡ ŰȗҒ⣛ᘢ🯮ȁ۬јբۆ¢֤겝 ъФʑԖ쭏˹ە͂Ť ȟ쓽ɼ߳ɾʑԖӓϢݹȑҤۨʧҊޔ顃ߣ ߣԅͅՅ䯤ȗȇ譅ȰҀЋФŰƢ Ҥêȟȩ쀀ФФŊ؀Ԗȁ‘‘ҡۨҊ ʑҤá푡ȩҊਔʑڌȩҀФФŊ Ԗ聀‘ڊ‘ҤШƔ옰䗓ƔۧȐȑڱȑڢտ򀀀ҫ ҵŊŊʑҤФΠŊʑҤ֮Ф׏첃Ť ҀłȾّɞ΢ȑʑ΍ת ȇŖﶗ鸚ɇ㺢ߩҨѷݺݯޥȧíǝǑ Śתηȇ͔ꢍǝΑ‘ʑȣο󍺻 ҡ͡ȔѷݝӤФҤηȩӨ̩ Ǻ䔩⠈Ƿηɻת ȇǖԾǑųʝߊǝ͑ǑŚ 睟㝰޿շԓݑߤឍ ޾кܫ̘ژё吣ف ڪؤۨҕԺȏǃӧφЫϊպݑŚÔ Ԗڸ햟źܫ߈Ғ֖│ɰРެҤȣε 󍸻݂ȳ纔嶹޻źȑĠתηȈԖ蔭ع ըҬׄ鲌筺ΎÄڤՕ٥Ҥʢȑ Ġ׷ηƢ꫗ڤժȑĠתηȈ қєܖˋNJԕФӶ݊ŝźڬǑĠ ޺תηȈԖË׾陳ҩفݝ筃 ڿϽҤ󭻺󯼚ײϟƣϜ Άӱȣε󍺶ҁŭߎź‰ؕ ݝڲŊˉݑޞ㇥Αȣοٕ䔩鲗ᩏ ǝΑѪתηɸȑѪݝ ӤФҤȩӨ̩ԹѨǺ䔩鼯 ߨԔķӊӑƞշݑŊŚתηȇڥ×˴ ʒݜힻڸźצܫߨݯ񨹚 褷η筺ըۖի翾꿉® 銮ڹ޾ź܉ߘԖŕ鑽ĿϜÎ džŚתηՋ垗ܑ ϢڬéԹ츍Dz緊Ñʯҹ 袍ޯё몆ȵ՝ރdžȿ튴¯ӥ Ĕߧοևߔז夳εÄڽݤ Խм߻ˍ߻ʟ̷ީʠźצܫߌԖ ʭ׿׾һްϑ΀ղ싯җƝ Հ冢͖Ūۤ巫ݙƑ쩻뾧 Ñ뭧Թۓ啗Ŧϔٟź Ȳѱԣܱ➺ƚż՞Ī㋝ӔƟ޸ źȲϱԣܰ➺ᴆۦᄧ۳맟ן ìަФ˸ȩґϽƝ뀢瑭則Ӑկ ʻѤǯϜڹؑ떵鶊ǪٱǞČ Фնפ߻󯜸ߙ̘ګ ڢƭ󖺶֤ۖ˯ҹݖҫӧφ̙ӡ ǿź䕼橷ϸՕ҆ϖ菱ӱԣڲ̄Į 䈿ڽФǏ̜Ԉʑ֓Ե၃ÊϽ ԃ藲ƺȣҴ콙菙ӏրʴ ҿۮ˜ƐϠڰӤ렧ɦ뮇 Ӛۏڸԣݝ콩䔩֍ ݷӏΑ͚‘ʑƣȣεʻҡ͡ѪݝӤФ ҤȩӢͽʼܫ㨻ԃޮŚ תη󟈸ҥٖԑ򷛶ꦫܫºߘȟŢŕ鑽Ϲ Ҥ񷨛ηǭȷϼőƲݏǝ ÃdžӤ٭ąݏǝÃdžӤƸߋ ׃Ŏ䗊蕹֦ݹǝ͇盞؋ 푖ǽ򹺾ϰםƁ۟ⰜؤծސۍԹ龐 ԔݿŇӸ۽ٸôݐȓ󖚯ᨯɫ ʼnǑͯ޻Ҽ֦Ӥ̰᛻Ԟ߅ηݨә茽 ʡߩГ߳Қ׷֤ÇϺߦʼܫ߄Ůʤ ٧񞫚䉈ϛ렑פҤη䔩ڐŽ 𓐵푫ʑƣȣεڲݑƜГՏ ۶БҤη󭺝ѡڙ羁ԏǝ ÃdžӤȬÎͤʼܫ߰ź͈ ʼܫ߰ź̧ܫ̚ȕ¥ȥ剣ݏ Αࠎǝ٤Α‘ʑƣȣεꯦ󍺻ҡ͡ ѷݝӤݦФҤηȩӨ̩ԲԹօǺ 䔩ųዻ×Ӥȣε󍺻鉢ɗʝ ؠߏʫ߽ÑΧתηꧥє䥋Î ߍŚϑ·޺תηӢܛҤ㶾ڬ ٝ‘⒬ȏ铓ˏҩʷ䏺׷η֔Ԗ ݖźȕԖҔ˯źꯦ ȞԖݖȋȉŷů󇭺ȳŚ үɑ΀й҅ҢБ˟ʵ믰 ݮ˥רη򇝺ˠըۆƶ㮷ɚĿÖ ʑǀԴ҅ϬɩȲȿ﯒թ ҙз伏תηƪФۮǩҿȽӛʛε ܳϴÔ٤ޯҤȟշ՝母ԡ ߡەȲȲݱܫ꟪ܙߚ‘ڲϤőֺÖź Šεϐ՟ӵÖ׾퟊Ҥȟշ ԡ᯻⒬ŽۻϏ̙ӔԨη򪇝盀ꤊŊ˰Æھݟ ݷ锨Ϊ́ꤊˆܡݼ⫯ӧφՙŽ ԹцͧꋜŊܡڽНǏ޸Ǒ ʷἇϞی׶ዻޤŔ埿ĺڤ ߚ̛Ưٸˋ՛ⱖæ燡잸挫 ܫۏӋݑʤ탖г贻٤ۖž ބ࣢ȕ˶ &] [s5;= &] [s5; To get the image constants into your application you have to use somewhat obfuscated but thankfully short sequence of preprocessor commands:&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; [* #define IMAGECLASS TutorialImg]&] [s7; [* #define IMAGEFILE <][*/ Tutorial][* /images.iml>]&] [s7; [* #include ]&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|MenuBar menu;&] [s7; &] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; &] [s7; -|void SubMenu(Bar`& bar) `{&] [s7; -|-|bar.Add(`"Exit`", [* TutorialImg`::Exit()], THISBACK(Exit));&] [s7; -|`}&] [s7; -|&] [s7; -|void MainMenu(Bar`& bar) `{&] [s7; -|-|bar.Add(`"Menu`", THISBACK(SubMenu));&] [s7; -|`}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with menu and images`").Sizeable();&] [s7; -|-|AddFrame(menu);&] [s7; -|-|menu.Set(THISBACK(MainMenu));&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5; Here [*/ Tutorial ]is the name of package where .iml file resides.&] [s5; Image constants are represented by class methods of class defined as [* IMAGECLASS] ([/ TutorialImg] in this case). Image constant then can be added to menu as another parameter of Bar`::Add.&] [s5; Note: [* #include ] works only when images are to be used in single .cpp file, otherwise you must put `"obsuscated`" sequence with [* #include ] to you header and [* #include ] to any .cpp file.&] [s5; &] [s5;= @@image:1444&680 흉ԔdzˡܓŒܡވļЂ׼ɶʹĘ ͮ䂖蒕ѴМߠӽݳ܍Ãׯࣂ˭ ȼ՘Ȓʙʦ̲疉ĊקڬҺև䢝ƀĔ ʂǍҏӳʦ跈ݡۧ۶ۅЮ Š؂꜀גڙҡβ̈́堏ѩݝ ԑŇ貦皋⮌ׅ ޕ؊Ԛޛ̜̌ƤԳ̪눦г̈˙г⑧랎 ꆢшᏹ벐񞀹ܩځŕ瓋Ƚ߁ߓ ܥߵŮȤɥꔈЎâڑ ﭦσϻǼɳᶭﶣہ퍥ƹϒɔЬ񊩅⻙ ō܏Ɠˑߥųڸɹړï Ճį͏䭺۠ňԌδ䧲ڜ再̃˨Ɣֵ㷫 㶲麗ޜɚˢĩƪĥDZԌ̰󲎊š мיĎ˩ײ޻ت԰󳵫 ҡɣĠМⶊקܗ폭˕קڠݛٕƨҸ ъձ毳ųۤČ倨ٞ߄ ˑʅ턹玆ٟčৣ瓨ܰܜӜό ꚠŲݽçꀨ̚ʄӿցͭũ Ώظ˳ޒΙпҖŠ乌ϯڏ١ ޽Ԏ޾Ҩؕίνȣ۝ַɂ԰ÿꭟ΍ Ύҷ٨ձְ㭟ߖ•ґ߱⟙ ɨػŴƑ•պںӂĕӮѾԬ˸ݖѳב ƈ˳䔥Ѭ嫴̿݃埭՞֖ ʚט؇ڡ֢Lj̸񃦐΁餬 ⸒ߕӽʭઆϬڪ۶۾ځۥǵꈖΓФŇӶ ѸŢק՘̘﫜ګѽ˧ءଂØ Աݡɷջ߶ūߎՓߤ蹇 Ə˴򼦯ދ؉͇Β ᙋޡ㰇㿇܂ι⸆ː͈ջ ˷޳㐋؝ҏ܂Ӥ֍訒֞³ ՒᜣӇբהᝌ⠞Ӛ 굙ѬƕԔ䁈ϖϸ̾̀޾ҼЌ˷ ӰÎڍʉ̖̍ඵ⡇ܸ̎ʝɢ ٠å߱ɔݯŠڴIJՌݜҁ״鈈€ Ӭྔնܒ·ڞަҺ ٬ԡȬÂۜʩѬڭ🇹ܴ ЇʿҜҋℬ󆘻ĪŽΨҬ͊璴 Í؟꨷χ૦Ԑ⽯򉆠؂ɵ䱙 ẂψҿӶҟ޼ùˁ♸é켢Ϳ¸ ̿ċ˼弟ҧľز޾骲 ɸ᫽غ⩠״ш۴讚ɝٰضض Ӄ”ئɀ挝ۥտ˽ߣϥ 碻Бӈƣτώ՞؅̲㡞ҕ˳̥ ؂ǶкѴ¶Ԋ۬ՑԱя 퐚ϒܓ̢բ滎õܼ丧±􀁪 ئı㜕Н׈욚ˑט산ڂבՎ횎怗 ج䳹𡇴ż˜޻ҵԷƿݯԸ̦̈ Ě᫭殘؂ÛɪʊȉϺںܼؖ 譄εߚϬचےڽԬބՓҧƖ׬铇 ćЀï妁ߋģ߰оϡ˦䲿薻ͼǞ˯ қﳍ֢ͩ㾋ç֢ĶŦ ړı姭ߪ҅Ĺאϱ۲җ˙՘ ɼئĒڴۭġᛇ 룉᪅Ԑͼ۩ʲɏ
ρѬʬ ߆Ҏʎے鎵Ԓ䕴ҢȦѧ 㞅̶圠ȹлחߔ扰駩Ι܈؁ ؓ쵝噙ÜȪ߻ГʄϳѸ ٺ秒Ӈˑ菨ѽԑԅ֌ތڪƭ ӡֱÎ;͙谮ޣޣۡ܌յʯǜࢮ Β̧Аڥ§㺖ԇΌ̏󚔣ﵢ˼ Ɏ°큫ݷϹ؏Dz͘σȃЭ ̏܅뤩돔ήьȒ慭ЂݘֿٝҌԕ ϩ׭쫖̫˷έԕϪǎؿͿҤ֒ ̓טͿ宾ޯ붱Ͻ֎Ʋ؛Ӹã Ƶ¯ॐ˸фކՑױ菨ﬨ ژݡ̤Ð懕Ðٱ؇ԌÈŐ ⴍԌȊڿž֟⪰ⶁбǎҢ Ljڈͮاѱą鲬ꭃ͂ڣⲈıæ۾ԌÐ ׮۟܂ʪ߱бܱίߡꇃ 񽤾߈ӑ旨ԯΏŐ􃾪劔 惌əʾ˺ֿ̕ߢԠڷǟ бĮЌҕǞЋ߱½؉Ŧɔ卥ڱΦڀ産 ق³í⪴ͻ횖ؽȪܷĖ๕Őȍ ȱšŐббԌ鋊󣝝ه 轣ӴŔݥ慽εִͥӔɮ ۅߣӔވ܄ꂶʂΫĤ∂ÐбԌ䅕ÐŐĦ֌ Ԍ䅕Ðٱ䍕Ð٢Ő捊∢ȊЅÐб ֱᇕȊԌÐםȊӋб Ԍ䅕ÐٱԌÐݼá۝Ȋżб Ő쫆ℤ䅠ÐŐ舢ȕŞ˼У 񥏼ȳ捶ΐбҳڂܰƔֽƔˑ䱃 򛄰ϔÐȾޤͲҷܥ驅ڧ𗤣Ҟͥ٣أ񻠒 &] [s5;= &] [s3; 11. Toolbar&] [s5; Toolbars are in fact quite similar to menus `- they provide set of operations with names and Images that can be invoked by user. In U`+`+ you can take advantage of this similarity as toolbars can share the definition with menus `- if [* Bar`::Add] command contains the Image, it also adds toolbar button with that Image when used with [* ToolBar]. The text of menu item then translates to button tip. If you want one particular Bar item to be used with menu or toolbar only, you can do that by using [* AddMenu] or [* AddTool] instead of simple Add. Also, items without Image are automatically added to menus only and vice versa, items without text are added to toolbars only.&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; #define IMAGECLASS TutorialImg&] [s7; #define IMAGEFILE <[/ Tutorial]/images.iml>&] [s7; #include &] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|MenuBar menu;&] [s7; [* -|ToolBar tool;]&] [s7; &] [s7; -|void MenuFn() `{&] [s7; -|-|PromptOK(`"Fn activated!`");&] [s7; -|`}&] [s7; &] [s7; -|void BarFn() `{&] [s7; -|-|PromptOK(`"Fn2 activated!`");&] [s7; -|`}&] [s7; -|&] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; &] [s7; -|void SubBar(Bar`& bar) `{&] [s7; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn));&] [s7; [* -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn));]&] [s7; [* -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));]&] [s7; -|`}&] [s7; &] [s7; -|void MainMenu(Bar`& bar) `{&] [s7; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] [s7; -|`}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with bars`").Sizeable();&] [s7; -|-|AddFrame(menu);&] [s7; [* -|-|AddFrame(tool);]&] [s7; -|-|menu.Set(THISBACK(MainMenu));&] [s7; [* -|-|tool.Set(THISBACK(SubBar));]&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1140&464 ݀흉Ԕחހу절Уɴɉ ̦ދڐֿ߷ւه ʉؤҦ٤ԸӲ摊ֱי捑΀ ݑͮ僊хߓ޵Ȑٟ݅څ󻓢˜ Ў׼ݙѣݗȍ۠눏ˍ̀Ƞ흪āƁŭ џƢׂ̪Ѥ۽Ô⾂۠Ɯ㶦ęڄ޽ ţɣȬΗ¬ɭ֑Ҵ灢ꍓٰ傺˴識ﭶ ՠѬבЃ뀙법̋Ȉځ̯ބ͹ӕֳ嗍 ઻݆㻓⒋Ո׹Ɣߐ剁 敬ݹåн׸Ϟլܻ ♆۫Ӕܕ˟ȗ΄ꓲÁʐ圐Ҧ݉ҧނ 誱Ӛ捃ܲٻËݞڵл տߔڐɭ®Ćȡճߨ̄ն ≫ݟۆۊ烮ԯтҖƧȗޛȊ܅ ̮כśӰѼﰎ쬶ǘðޘ֗ڭּ׳ ũʵɊҫȝՓݚࡩփӯІשǺˎ־ҭє ʗլޓˋìפƮ՛݅ϔ냷ˢ쮿ۡ凄ݬ ݽ󣥾ũዅˡˣ䮮՞Е ױª١ˍߵϔߟ׉ɦ瘺ܖ϶ ġաɩ빜ǚ̩їɂ视 ٻʹ䬃ߩϴҏ庯LJݳ䂸źшՈ ֽݍ׍ܬީѲɋߧڠմ݅膍궮Ƭ ō×ܽۮțºԃ鑳ꪰ☕Ƌʶث 璞⬤ӛ͑囙܍ɇܼ콵 ރż®喒詪Ҕ勃ꒆפ޸ßӹĚՐ 룪埙ȭ˳ʿſâˣﺧ ӯۘ期ɬͿӜĥ ݍẐĒŁ똃댋樷ė ȬݭԛԚߟЦ񢤪ƫƨȤÕܜ蔁Ո ˛۸ θœƞ봖ϸ͖ܺ ᕦǰړɵ䐜잤ĻԐůʚ ㇟ƄˉɻƄڰʞ쑶􏒎ߏ כō䄵񚲸ƞجѝ޸ ˻ږҘƒ—ˆ㔯ũ¤Уˆ 珬ף⼥Řꊖɵꖏ؝ ܾɡƋ̵⚟ҜË؜Ҙ⬜ټ񉼶Ǵї 蔻ďɉ׬ܳ⒵ඪ麀ြοӥкƒܵ Ը׹Ê߄﵏ۊЬώߐۏ 񱒇ǝȯ߈ʈ̈́ߜȭýְڻܰÎ ކټӚҌΕص٤ǵʵܽ슶ԯո 䪌ݰԏͼ鰭ֳҭʼ밄 œۋ˾Ᏸ򐝺ִҵ͸Ҏ؈ͧ ł‚蘧׼۷ɩ׮Ǝِ 퉵󧉨劈ղɛϕ澥ӟ쬻묪ɝ ֡ѫѲׅ߼ǥƶާ궦ŒӘ 洖öހ֎󘙦ŋꤥĊ㶎܄˞ʗɄָ ۡؕ뀍ཅӘȲέÈʮ瓟ݝ·΄鄼ܑ ͑ܒڼޝړ𺌺Ш𺹧蘷׃ϓߨܱջΏؖ ɂ쬾ЊЧ񿤥ܕɚٚ͏Οˋˌˆ ݉ߑ⹞ոՑݶڙ誸޸ 措і̆쨫ܛơ揸⩛դ˷ŗ ֕„㷰򴓏ܢĝݼϜԈг 䮝̡ôߗńթν̛⍆Ō ņ޹ǡ믊ͬξט񝍤腁얜 ؟ȀĠړν܇Հբɒߕʤ ¨ݧŀֵĴ󶻛َ݁ܵʙ㝜 뀗ϗ̾ڝ񪘹āƵřݥ܎ߢҜ Րٱˡͫé׭ޅ늣ձĨǑ訫 ֥߶ؽ겪똡Фϟ礀ѨɺՊØ ݇ةΊ⤴ઝќ۰Ѩ܅ՠǽ֊ ۨ껛ݵ⯩ͰŖҬ␫эשŽׅשݏ ˮՎ⇵ʱƷՁɄ身ՁԺՊź誕ѻúݥջ ߇ؓڟ̽޺׬էר ߄살ᡸՊۚՊۥة燺ڕ߳Ҝ ݷҽМږߥՊ ן؁׀ڿө򌪐ۈج䉎ޮϛզźݿ ۵؁Ǖҧ蘒⋛™صᑻٳ Ԏ迧Ʀ閨 &] [s5;= &] [s3; 12. StatusBar and decorative Frames&] [s5; To improve the visual aspect of the application, we will add some decorative Frames `- those are frames that do not represent any action, just draw some kind of border at given frame level. We will also add the [* StatusBar] and connect it to the menu and toolbar `- this way it will start displaying descriptions placed to Bar items using a Help method. Note that decorative frame functions ([* TopSeparatorFrame] and [* InsetFrame] here) usually return a reference to single global object, as there are no changing properties required when using them with different windows and widgets concurrently.&] [s5; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; #define IMAGECLASS TutorialImg&] [s7; #define IMAGEFILE <[/ Tutorial]/images.iml>&] [s7; #include &] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|MenuBar menu;&] [s7; -|ToolBar tool;&] [s7; -|StatusBar status;&] [s7; &] [s7; -|void MenuFn() `{&] [s7; -|-|PromptOK(`"Fn activated!`");&] [s7; -|`}&] [s7; &] [s7; -|void BarFn() `{&] [s7; -|-|PromptOK(`"Fn2 activated!`");&] [s7; -|`}&] [s7; -|&] [s7; -|void Exit() `{&] [s7; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] [s7; -|-|-|Break();&] [s7; -|`}&] [s7; &] [s7; -|void SubBar(Bar`& bar) `{&] [s7; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn))&] [s7; [* -|-| .Help(`"This invokes MenuFn method of tutorial example`");]&] [s7; -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn))&] [s7; [* -|-| .Help(`"This invokes BarFn method of tutorial example`");]&] [s7; -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));&] [s7; -|`}&] [s7; &] [s7; -|void MainMenu(Bar`& bar) `{&] [s7; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] [s7; -|`}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with bars`").Sizeable();&] [s7; -|-|AddFrame(menu);&] [s7; [* -|-|AddFrame(TopSeparatorFrame());]&] [s7; -|-|AddFrame(tool);&] [s7; [* -|-|AddFrame(status);]&] [s7; [* -|-|AddFrame(InsetFrame());]&] [s7; -|-|menu.Set(THISBACK(MainMenu));&] [s7; [* -|-|menu.WhenHelp `= status;]&] [s7; -|-|tool.Set(THISBACK(SubBar));&] [s7; [* -|-|tool.WhenHelp `= status;]&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s5; &] [s5;= @@image:1084&724 ـǜ흋ٮᫌ҃洛Łʹ˺实־뫌 ɩח撲ϞΜ൘ߺϾο޿왳 ŕ̘ƑƼ粴ֲ̤՚Ƌ䘵ÿڶŦ 苳˚ޗߴۺ̉ ֊Ϊ转অ􂠣ܗԨџخ ł܂יãēɨׁ̒ߨྫ۾ͤ近՚ѹٓ֠ 캯ؙ̼Ͷ쐂԰γŌƞឫ 詁ًɒ݇֓׫ꀦ΀晉̭םɏ ߶ñޕΟꝰ҉̵֬۳Խ񕁨¬Ͽ Һʕܥ¥ﱙ٤̋Łԋ ֎쐋늺蓑ᝑ쬫٦ϛ̙Ȏŏַ ѹռɄȢՎő׾˛Ӻ Խˋ벞̫Ҍ˓賦ҽËؚƟԨȦţ ꘑŧ叏֦ع۞ڸʲ̯䃍Ǖͷøɰ ĴοӑБ˨ʡѯ͆٠ ˫˦֌ӊ㓉Όͬ嗶޴ѽΑ𯈪ȫڑ ʰȉׯϋŘ҃׍佚㳜 يÈռíϯؠˊ˱ǻĂتԽ ϛ͚ũԄ⼓쟍Ö溪‘ѕ܉ ͺ짙ՅԉšλȹكȫȎòƯȿ Ŭю琎ψѥ̯đʂёձЬʯ糰፮빞͘ѷ 줧ϗпؔ֔야撽؇̰ކً婬 ܈՜٤Ź萸ݧҫǬӫÊNJܕ𐶐χӭ ܛĚ̙񜰭ݞ봳ޯŕۏ٧­ꛚɯ ƚہދŽؠݢŲ񙼝 сܿþבېճ⿭ۨϸ 쥻ƁŐª㐗ӱ߷Ծů 봍韺偽ϯ鎉߆Μ굸ጣ ۸Ǜ쮖绥Ӟę篘լꉙƛȲʷÒ Ɍ뒡әȞij׿׺ ᔍ캝ߵך؊좕Ԣÿן㥖 ،ݵ켶μڝΒׇ̽ۆ 둧ֹ趑ωЛڥ匙Ց􉯃ɴΌӑ ⯑ž爱곇㿯毽̆邏ݫ ᜲִѩ٥Ѭѭ۾։ͺʅɛێޔЧЁ ԇΒ䧨ʞп񥙠Ų둩ƚՙٸǗŴʈË ﵊Ѡע⢛菚ۭω׌鍟ƘƖکͧҜ ʷМȡ˳ͧà˘߂חʾճߩɜ ؑزݸ֡NJ܏Մё̢󷤛 ݂Х巁䗌Ü忮֝ ӦਫÅ존β؞أʹÁ ĕ֧֨Ɇ󦙖ęɜƟӸ﫜°֕ َĠ묎؋߂Ȼʎޭ枡܏ғ ކ贪ҵҳ▲ߞܺļܢېɨ ԧα覗ߵڍͳЫζ䗵뽑׸󨓷ۘ񾛔 ë挅ᯝ̼̞̎ҭ䌀ȊŀԌٵ ㍾ĺĂ盃ַ䷃풐ٓԾڟʥ Էޛ֝գγåؚث؉ک色Ӹ瓺 ш̭͉ظΡݖֱҿҟΐƥڸܴ ʆߘȴîڇб쿤泪âňȭ ը⑄åҊɃ̹Ϳ ϰÑڈЄդñឡêՂ󻜼ܺȐӑϸ α򣇔ĎߟǥݯőýߗЄяс 데拹΂䖘ԋ߻ԡ蟤ݭܛ ۗûຐÃժ֧ؕdž™ۈꍶݲڬ ů≿ݕշÿܫǏ鄥م ̬너酄ˡ⣎ʾԂ珆䗆⺬ܥ ňѺ́ʜ͔،̄ճө膂󠮆 ɻ޲˽ք檫狐鿛ʑш۠šǨ ģŵꥪυῡ󊈛裊ԱӞӓՌђјᕂ갫 Ūĕܢ⫦ԑўё޸ԑʼnԑ ΀╅׬貮Юݡ؏Ռ Ӑ툨Ŏց޹ŧƆ Ͽގ׻Ɗ݁֎Ȫ鳭࣌ӣ׫ȫ՚ƽ ߟҞڑǝ˪͊ѸŒ҅Ü řҞŵō犨Ӫؾ۵Ա఑ Քƚ롪ǡЎŏǗȌԂᆏڽ׫שꤠ ґͩҝݺЀńƻޡ̆ʘ﷬ݹ˞ݝ 畽ԔƠȴ׶בŝٶʹԄŞ ẪإꞐԑ񳊎힜ص褣ƅĕčéކ覠ұԄ ōԑݧ≁Õ㪈ꤠבۣəϐ 톮֘ۼ拦騘᐀ 郪ƒܨ軕жěڢшͪȃԑ񃅨ΣΨŤ ļ訄ԑшͪɌ֜ѸՌĕĴ 㧊ԦōĴ˖Ư׽ީԻϠέ Α˖媊ו眏ŗĕヷʦ脵ۥ֡– ƪ̩둕ӗޡըĨȨ¦ϱէŭ ˯圭э؈敧Ŷ㍗¾ͱʥۧʟݑȽ ᱭѪʃƱʥѩ艨̿ۨ瘕իޟֻؔꕹ ۈ݉ʙ߅ՔѪ˦ݲɝӶЏԑш Ťޟ߫𩯫֣❰Ɇ®؄ռ򝩥ݞɷ唓 ڒҒܽƸȻȶ銗ʣ߰㋲޲ ו׀ᗬǔ퍦ջ܌Ōځۀ &] [s5; &] [s3; 13. Adding child Ctrls `- widgets, reacting to widget events&] [s5; If you need to use some predefined child Ctrl (widget), place as variable somewhere, usually as member variable of your window or dialog class and use [* Add] (or [* operator <<]) to put it to your window.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|[* Button button;]&] [s7; -|&] [s7; -|void Click() `{ PromptOK(`"You have clicked the button!`"); `}&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with button`");&] [s7; -|-|[* Add(button.LeftPos(10, 100).TopPos(10, 30));]&] [s7; -|-|button.SetLabel(`"Click me!`");&] [s7; -|-|[* button <<`= THISBACK(Click);]&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s7; &] [s5; Position within parent view is given in logical coordinates (e.g. [* LeftPos] or [* TopPos]) that allow no`-nonsense resizing of dialog. Widget events (like `"button pushed`") are reflected by its callbacks. There exists a `"default`" [* WhenAction] callback in each widget that is usually invoked for `"user changed a value or a state of widget`" situation. You can assign this callback either as&] [s7; &] [s7; widget.[* WhenAction] `= ....&] [s7; &] [s5; or use equivalent operator version to save some typing&] [s7; &] [s7; widget [* <<`=] ....&] [s7; &] [s5; Note also that to make the code more clear and less verbose, U`+`+ uses `"method chaining`" technique, where methods (usually those that affect appearance, position or behaviour of widgets `- `"modifiers`" in U`+`+ lingo) are designed to return a reference to `*this `- that should explain the line&] [s7; &] [s7; Add(button.LeftPos(10, 100).TopPos(10, 30));&] [s7; &] [s5;= @@image:2449&1489 ꁪ݉ѹ̽⻌踮è׌׬…ۡ㔥֊메 ˺ภǑᐂɚمιŞ򒖴 ׎ƝӤ҇算ҊҺڹ҄ċْ̓ ̊ϕՀ儢ՆȔӔ劳쌜¼ ⌀͜딋♶ǯʫ똥٬ͳըէ❻삒ܢㇾ 豄եΎۻ뽤䎀ıǓ籧ཅЄЏڲ ե«؇̲کȜ鋎ΊϽҎէÀ긧 ֐µŵյϑܳͪã޿ݽ霭и ͸ޕܥִԔپυ ТÏǜֻҼݶɐ쩷ʾڳӗыȎ ܘˊ椹儧ӊӺᇬ腚Ӑθۇڴ ϶ӭܼμףㆻӚݓ۪ޘãܹ歧Ιʿϋ Ŷ١ۦ޺ݟ½ǽ҂𝩶ؽ͙ ʯܼҳ懞Κ񋇅 މ巧͝͡ǯ诱ѻߖެ컢 ۦŧǭḹᆥ˷Ӳ慭“ͥӻ䎟Ͷ ãǝ̨ܹ֖߂Ҋغ ܈Džߜٔ½ѽߣєއݴΞѲijԗ ΄ϼفݚԻꚏѽג͑򓽸춿ހףܱ׽ ªݘƞ֯ݗ֛ۦԯ ۳Ȋݍ뽁׎띳˹̾̉î֘鲛ϱԻ ў˻͓֦Džƪ궝΀γׯϢÛ減 ́ǩ۔҂图Ѥˠ۬ӡѸܸ àž޶ݒޒ٤뚟ʞ֐ջú ﺩº޴홝󹗷αɯلȜ Ϲʖ¸ᅺ잠ė닫ːөήËݡܺ ĭ덣ҳϬ䖢ɚ ۿŴޤپϣΰĥ㎳ǟЁ ƙ͉۔婗ờݞŦ뾍Ա眎޶ Ŵ̆࿭پͻƯ޿ゃЬ ޥŖŃڢظݹݶ冲ǧߧǥ ⛢ׇ쌌ɝӴɨͦӜⱗ ㄏޅؾ᧱ЦܪݦדҊطή歫ݥم˿ 䄏ԛƫۚٓĦύ˗›ڲ玏͙ҡ ӫٽźөڠ演Լݗڦ ט徠Ӂۮ֝곫ݧ󋑯ٳί ƥֹӄǹߡ㔁ӛӟڷ֝򁾓Γޱ ț۷碗ƺ͓ﶯՆ֖Ƨ Ȗשּ×ܔ۫ɦΨӳܓŖ Ɯނ孻ڐ鍢ӝǏڴ볧įɍڲ﨔Ҫ ܨڼޟݾ󃢾򙞶ӌӽÅř摆ʖ Պ˱ް³ܜ܊ܸ̒Ŧ֮ɍٔĦɦ ⒝ͣťʼκÓúѳᝇǞЧю ܌Ē腹ִýиǮԃݞ ׽׼Ӊն򪗄ƁڏԹّ搱“ ܩ䍓̝ԪԿШîƓͮ҂ ۩̍ٸɳ͚ѹٜ񱃛옞ȩӆѰ ܻϷ곭ׄƦȯ躦貼߈DŽୟؔ ߴХʡޑ楯򙸱Ƽ͘Վ౟ ߞŠع鹲ǜڠħ ĜջҾĦϼЪ喟΃돇埜ٴӗ߻ ؇ϩ᳜ꍀД塀 Тԛ ½ТԛҤǎΡݢڶ ᷠز޹ϐ߲Һɷߟܐʌꞡׯ׍þݔ ͥ׍ÑݷôАˍӺꍀ҇ὁ ڵԛԀ½ʕ˥ꍀǰޗԛΧयὁć쿦 ֠ހ頸ϼǤٜ狊ֻΆ͠ϕҀ 烥㇧먒ũՊϋʇ┬ٳ جšހ頸٤Ñϲހ嶴μϕ ½ֻ䀇иМԛཫꍀӿꍀӰޮԛϖ Ѕ֞ڽҹꍀҤٲ̀АزټÏӲ ݔׯȗԘӽ޶ʻի݀כЗهݹȷ Ĩˑ葩ꍀŨހڄ葩ꍀŨހڄꍀŨޭ뵿 ӳЪďی҅ޱֲŵƆٰڪȯ Ëԓޥϰן֕ŵݱ氏̮𲯯ލ ʹ®±쑉ޘ򉽑ׅữõ֏ߕ腀߿у ؅ڄܢډꭒЫϴ֓ν ٪Ⱥ߄㒿ۆн㹞 ͎Ŀʷ˅Ȁןهگ􃀁ĥώୀ憟缊 յգﵩ͞ԋāƒٶ ⃪Έմٝ嬾׿褒ןڄ擀 Ӈᖭ̛̼ٿʇϣؿӹ ãǞӽַآś׶ҟ𝅾ɋ ԯťՉ󫦇ƏϢؔľƠյ ٭½ՠ뫛볯ϴՍ꿅Ճљ嵙ͭޜ 쉕ӃԦត걏ޝϼ胪 ̏׉ýޟ묷⥺ެ濩֦ݚ遦͡ńƠƠ ߰ˇýӖٽٍփͭ޾ދڽ뙅߭ ʌҾ䅚̿Dz뽟 ׽ݣճÊ璧ɚijݰϷϿ ďŠݏ޿黓󴃗݅󍦾㦨׶ְي ޏضĖąɄǚ棰ַɿӾ՛μ śݬ׾½ˢ􅼟̜ۜϤ⚸ Іσڟ硒ٶ￝ۍij߇ ꐞȑ鳆𣻋Ⳡ޽ݥ¬ׄ ߣ󡣽Ҁ˄ˡݽʾڬÛɢݽ اۢЬߏՏ쯕րØѳִ䁕 АƁ㕟黬ޞϕя鵬 ̥ϮޢӛЙ͋糮ƛ˞֫帶ףӘ ޮ֋ﵴٿ͢îǽƹ역좀 П˴ɟԵܼ޸Ͻջ扫 ۍ؏ڌýߑŝۖȅμǡ ϿͿƾֱݶǘӟ폱އʂ֑ Ũ߽ƾլ±ؙ昽ژۚыާ ڔľȚϞ֚Ǽ܉Ï ׹喃փ凡ϖԍɠʺЗ ̤،Ⱥˉ׷𖀧džгǷ ׫ƼՙǼݕ՛Úƽަۤ ĉŔ׽ߑڥѲΙԖɫǬƿڿī؏՛鐎 ݱٍ⾘ԗݫߩ皑񜱏ع㏕ ϫݏձ礌닕߶Օӏ֓ꪖ Яҁч𳼉ޘŻ恏Վݺӿֿ ͷ홉ۍ仺׳ĉղ︥ߝϽ Ŀ۝̿ﻍٞбȜƞϛ갩 тܝ㡃ǻΣ ﳭޱۍテﳱ跉ɋƧ߮৯ ޺ٝۼ諭ЗǎΩ۽ý ҲΓ܆ܐѫ֨ǧݬ߼аꭆ ୕ޡåꆹי𿫤̗ Ԛɥۆ밇شıǥΞκ 򻺖ތ˽ǯ瞫бԵ׃ޖ ὼ隳瓺ݹċﵠҠ ݶ۳﹘ﵠހ۠긫ԛێۍڷﵴ ЈꍨԪς﯀ﵘ՝݁ШێۍŴ 뷟ێۍێۍͅ睮ﺝٖۨ ܯڭŽʽνݤۡý뗖Ĵʎ͗ꭇ źޞċϿ聞馧͔ꭇꭦٽ 딧؜ܞ˥ێۍگǭƵ ֝΀ֿׄ멃꭭彼ͪ೦ٜю ͠īˆۻħ⍕ٯֻҦͪ͐ꭥ䎯凑ʺ הƒȓꭇꭆ߷ޞẼٳƺͺ̗ ƥ׃Ǡۍ׻嫺ݭݽԛͺëʳ ۍ˹ݼϽ솠ޠꭆ័ۭ携 ѓ퓶קּކײݳ鎇חٶߨƒ󥮮˩ ޶Фת݀ýՠ󿑷ؘйᅄ懯ߏа߬ ƺﵨ訵̹РﵨѦȃꭇꕭ޵žג ۍǽﰹܚ׿½Ճւ긕ۡ ШҎۍ﹘ﵠހқǽՀȁˁچ փꍠꬭꭆԛێꍨﵳހҠӠՀȡ ׎ꭢԛҎۍߩփꍠꭇꭆԛێۍڷ ڠހǽՀȷ߷ķϠ喃փ ό߀ɮϠݢسӿϟޗێ ۍγ퇟ýՀ鎸ͺ귰 èѽнۢݒƍ뾆햸Ǯ ΀փ햸ׯу迚ƽ½Հ˗Ǵ҄ﵠ ⭲ħٯۢ팱ϡݒіدփ햸ծ섯 دۢێۍۥꭆۭ񽫫ʢ俚 ﵠԜɏ½Цþ횸ӹ۾گݒ ﵛ࿕ݒ׻ޟ˄ ˁ׻៾䅛ﵳѽΒꭇꭆ οɛӺӈص𪥇ﵣۅ՛멦߽ ﹘ﵠб磇ȷۨߛփꍠꬭꭆԛێꍨ ϡՀȭˁʗڀߵㅨǸӯŰ뗤 䳷ċ՜ҝޟبۍӃ ֋Р½ʀТԛР½ʀТԛР½ʀТԛ ½ʀТԛР½ʀТԛР½ʀТԛР½ ʀТԛР½ʀТԛР½ʀТԛР½ʀ ԛР½ʀТԛР½ʀТԛР½ʀТԛ ½ʀТԛР½ʀТԛР½ʀТԛР½ ʀТԛР½ʀТԛР½ʀТԛР½ͽ 竁ؼάٽ鐀ӈీí &] [s5; &] [s3; 14. More about logical coordinates&] [s5; Logical coordinates can align one or both sides of widget to the side of parent view at specified distance(s) in both vertical and horizontal direction. If only one side is aligned, logical coordinate specifies the size. There is also specific kind of logical coordinate the specifies the center position.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|Button lt, rt, lb, rb, lv, ht, hv, cb, rc;&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with button`").Sizeable();&] [s7; -|-|`*this&] [s7; [* -|-|-|<< lt.SetLabel(`"left`-top`").LeftPos(10, 100).TopPos(10, 20)]&] [s7; [* -|-|-|<< rt.SetLabel(`"right`-top`").RightPos(10, 100).TopPos(10, 20)]&] [s7; [* -|-|-|<< lb.SetLabel(`"left`-bottom`").LeftPos(10, 100).BottomPos(10, 20)]&] [s7; [* -|-|-|<< rb.SetLabel(`"right`-bottom`").RightPos(10, 100).BottomPos(10, 20)]&] [s7; [* -|-|-|<< lv.SetLabel(`"left`-vsize`").LeftPos(10, 100).VSizePos(40, 40)]&] [s7; [* -|-|-|<< ht.SetLabel(`"hsize`-pos`").HSizePos(120, 120).TopPos(10, 20)]&] [s7; [* -|-|-|<< hv.SetLabel(`"hsize`-vsize`").HSizePos(120, 120).VSizePos(40, 40)]&] [s7; [* -|-|-|<< cb.SetLabel(`"hcenter`-bottom`").HCenterPos(90).BottomPos(10, 20)]&] [s7; [* -|-|-|<< rc.SetLabel(`"right`-vcenter`").RightPos(10, 100).VCenterPos(40)]&] [s7; -|-|;&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s7; &] [s7; &] [s5;= @@image:2444&829 遦ǜ흋գǧКڿ 냟أмށĄ̦睝ΜΙ˻ ɚƔƖԓʄžֈၯʢڙ܉õٜϠ« ᴛ۶飫ܱק筿׳ׯɹں䌋πʮ 턎񜙎ȐӖҾ힎۝եϹۆͯΑǺʝ Т⢒ɹ˜ʪܶ䕊ͭɋϧ馳ϼڊ“Ӟ ϓ̕ɋ΃ڗԧϭʄ̸νɫӪؒڨȩƜ ҏƞ„񰰭Ԥحϐ΄Ɩʼ 쒺Ɇߗ٧̜呞ن鐨֋ ߝӥᬨ׬氧Аប żϓۙ۴ۙ׀ęրͥǪԿ ϼϞ鞪ץݵާ̷˞ܢ іםσГ췢ݾՓިԮڎŕϭ߾ ٞ۷ַ߲튉ŒЈ 멮ٷ۵竕ϭ桱Ӌϥʗ瞽ʀ 㶟݄ջ߬靤晣ݾɴ붬 矩쾺Żςςӆ׮ֻ뫾〃݀ۻ խ҆އ䗺Ϙٔ𾛵ߚٺΡپ՝ ٰϊӞ߄Ѵώԟ̈́ȂȀ΃ĺ˗ 峏ܳߦܰ릔ၠ󂏴ٷljܺҺ ԺǷѥٹݥء֡ڎ֐ ėϜٞ޶߾Ҭ웏̺ӣ߻ٷفäԻϮ 괻ҮҘ׽ХЯ놝ŔŬֻރހƛ ŬܶչʳޑۋݭϫӼþɺ ݟӼ۽Ğ·ьόξӸ㋤ ͟Պ̞牴Ě˝ҼҤ昁ޙ ۫ķҩ˸﾿ׯٸ˲ߨᔸڝ ׄם鳫تֶ̜ꗆܑ ּ巏ӥ񧷲׼ߧׯ̲⍲۞ӻ 篽ƶˍ⛥ш፼ԡԭܱȥԎߪ퀜ٕ͙ ۷ѩǦѷ꽓̸ΕϝեБěݟݭ̸ ܗܜݝ嫙ĮȹωΟە ߷ź㠴Çǃ̼ܰܵ٬ ۊ҉ኍׅ㄀οϳ׻̖ އ٬ɺۭﲹ៿̯ Ӳ˽ُғٶΙՒϾŎʏϝ ňظܽߍƐ̾Ǜ럥䞽ȴ˦Ŕӹ ڿ̹ƬӪ̺紀쮠̩ěǮ ߈醺ӼޚÄŽȆɣۍƒ ĀϬ߬ٗӵ墖ͽ޷ř 䀒ﬨѯ˖޿졽÷ʹÊӺɯ ꬒϾϪԨڈՒ޻܅ԍ殸¶׸Պ 孹̱҅͂ܳ̿򅣼ͺ򑗗 붛Ҙݻߗ֝ûܶ◡̿ɖز̽ǐ 忑ۗƱ뾎לʝ ݹʢ͠˙쯕ߋЩ¶ ܡ䟅־ӆݑǔϝޤݻ렯ڟ֥ ߡ݄叹쟣ÓӜźϬ¾ ԁ؉þɢȴϙ۠蝔̴슸՛ƾҸϡ댗 ljŭԞ۩֕ԏ繤ەƐ𘢟ݒֶ ޺ƺﰧޟϹʑ͹ܗĬܩěݿޫڷ֝ ł𝦀ѕњӁ񄚸р˾Ź妹 ՞̿襄ٷ޺М謿ɺ ϗƴ頪خΜݽԣߘߕã凇 ỻϽޜۮ¦فÉ⑩ܦ ޹Շߟ˷ֿߋ߻鼭ϻʶ߿녭î ػ͗ϑԋ˾ ˬ̭Śʑڟՠǃخ켂ϕԠФ͟ IJܵɷȬޤߖ矝ߝϔ򱇗ߢֱڅƘ ጬފѺ֝ᙘɎԂ ̀ϝް݀ई݀ฒ݀݅֍ˏ݀ ݀ฒ݀݀֕ݹ투ͰݙГܓƬʦ򖼳 بԢƒǾҧٷǩǿׁ̿񦹑ې؁ ə퓺ߥ҄𡄈ުֺ릹՝ϢɄĈ ϚǂĈĿҺěį ЯLJڝԴߠۍղ퍎́Еŧƺϝℇк٦ ͕ƸѓʀǬᯇăƺă񩞒؂ޥǯ ՟뎭ڈ’ύ؁𥴈˞ɚݠƿ 뜖٧ղ͏ɓ渒ג̦êì ғ̺Їɀͺܚײ꩏ꥩ ЇҭˉƸ‡ƕÖěĪ˸ݞ Јљ֎̐əͿ׮Ӣ񴒮㼢ԋ ə¤Ŏ݅ٻɫĈƽջڴΚ Ϛ‚񈍝õ݄煳 ѓƞٷ۔Ȁݤ݀ฌ֍ ݀ˎؾϧΡҮҲɐ藼 笘۞Г藒ܾגߡ߱˻ѓڿ Œó򛻴Փ‚֑𠎖ѬۘӆШ盆˜ لބ㑬˞ձКķ̠ 㑪پ܄ݶ藼ҏձ߁ӷݍ 㳺Ķįֽ̠ɬ豽߄񃁰Ǘ쀊ղ ۡƭ۽ʆʶכѫۛ ƺςܡ񥧳ۺ˜ݧւܡ 񥧓鮖ɶФݔ㕂ٚۜ׸įōۅ ȗƃ͋ٴƴɘ‶׉Ώٿǃƺ؅ʶ񷆃ƚ ѫܕℇۦÕнݖݖ鄎Ýѝɣݕ ڣُʫ࿋֥ʍɆݖ֞Ч窏Өؽ֚ν ןҾݚnj˧ւղ́ܧԅ겙՗х ̟ݧڢ罩؅䘳ƛΒͨ܊νҤ ܪҬ֞ɱѕҦϚհ˗ կܡҿꔳو݀ͪǴ׻鰩ئꅫɨï 鶓ϳϴʰʌ箁ꌀ ƺ޷ݾ򲠈Ɉݍƺέ݃ ݞ׶ضط稸ѓʥǀàی ٷħ蕇ݥղʆܻ ۔Ǐϊ􁰃رﮂρ崭۳ ڴߦ޸񦍹į̠ȺﷶԒէ ֤ơʴ뾸ﻴįྀ̠ݺטҏ߇πѣ ۷т㍂̺ت؎ݸȀ苞؅ غ؅кǀ ʜ뮬؝ϧ܄Ρȅသߜȥ˞ԭġ ۝ڌٷҏǥ׼󂗊Ā菺̺ϧ 󻏵遘ȇ֯Ҽ񋐦ڴĀ菚ޒ ʰٛٍÖʲ롚ՆҺݗ˞ʭŒֈʁ Ḇݧϙג߲Ցᬐ۔αǡ񞒛뾖ְԕׄ٦ תç˝թՎĠݎـɕ͚ݵǧ묜 תΕϧΔұվ֝끮ᘺݚǟђƌ ˫ԇˣ䪔ʁƱܩՕСЇиʑ֕ƶը뤮 汨ƾǷ綌ωƌ߫ԇ˗Јثݽ ̎͌˗׶貹㡵냁՛ʔĠѧଓ⠈ Đ꽐ھбԋᏝҳʏґڇۇ׏‚㝳 ƻæįҁݩ搡¹󂅗Āآ ˺Ӊ痓ǡҤ䡕ڌٷӆ铻৊𰀱ڃƅ ؈̀؈̜к ܽ﯅۝߾í¾Ѫذ±ꬫ ֤кβ͟׾¬٣ꦌ؝ᝬ֧퉌ルͲ ٚ벡̪¹¢Ձ &] [s5;= @@image:1640&1460 ȁǜ흍ëꂢô℅³˭֑ ۩г沓ݙ̽ϳϽΞɼ 쎀̲ݽퟮ޵ɭϷ  탊꧄ָԕэؔ̓߈ßǫ߱ᦶ͖Ѝ ʿ؝Гۀླ횡ݿМ萤Ÿ ЪԚשӠřרխ˭а΁ʎíɗ ƣɷĐޏŀ鵬˛走ٻ؛ԅԀ ɇϢ﫢ݔ⸅ޏΒɯȤ󪉳̲Ӣ ߊڃцƑ瞍۷ʿ¯ƕĩֳņڝ ȍ򚸅׺ɍߘϳڠ¿ϯĹ؛Ԝ߸ѣ ϻ뮛Ą򜸻µࣳޞտ ͘ܗ譗蠨ͤոꍯǤ ބёΣշּҹܛʹ ɷ䁩ߏڝⷞŔް˿˪͊و˦޼׽ ꩥ֬ӽǍ׮ضLJރŻ ٷәԆۯّ˘骡̏輺㛻սϏ ɕ¹͙ڰ׏Т赂ֽό 揁ƿ޾˼׉Džޣե ū۲әϺ٣Ɯ¸Νݡƛݾҗϙח ϸƵǶުϔüʵ 塛ݧܘẺĭϦϗؿǕ ޏȡ位갽ԥꌐǁ䨰͇ ͮίЈǷ΁Ăޝܾėɝ˗߰ վ֋ԣ젉缄؎ˣ׳ܳÀ讟 Қʄ릛찔ǭ󃋓ͽӧ쯥ڦ οԸą޼՛ϣʕ룣Ͽ Њн矖ݗȽ 򯹫ϏУ߾ބʷܐ ϥ£ϭϾå ߸텦Ԋﵜ䌏ѦȒ݄ձ顕¿ ݩΛե̽߱޼Ҽ։ʆݩ꧓ѐ ƽ꣚Ͽݺ꽱׷ܚ Șպ􈑃ϻֵӖ库뱸 謚郪ӱ×ßȜб̨樧ξ块б킰Ӯ Ǖ׼蠑Ͻܷɯ ʹĮÆ亢գۮф윝ŭ ϼ̗흿߿ګ֐͜ۇޖۣ߇ț Ծװʼө׋۾ϐԅ߳ڎъ쬧 形գАǐ䄍زи׷Ӫ鮝쬛ƛג فュʇݼ雛ۯܧȵ 뚂󆾵БೞΕ݇鋣މЯĩ ׎澢Α¢壯ܪہ؝㦨ކ Ƥة۽؊Ҟ׸­ݸɽ疎Ƞϭ ӵ܄ǤݙǛה֮ݔ֞ȿ ϜڂބÓٓ߆۞ҍ޿޳诌 ĸϑԙюƩΕڔҁђʐ㔋𴒁 ɟ뉃ʦନջ꥓̬ܜȪ늕ѯ ξޭʔޞ˫٪ɋ Ճ׹͘ըɋهƚш֛黧ՔܥĎ ΩǷꜤŁ͍󊐦㔈Ǻ˾޶ݷƅ 䍮܄ܺƑψۯי ϰЉُڠǬݰɗڜ׳挨ٛ ց몶ͯûզ޴򚮗ѯէ۞ߛ ޖځޱَ޶ÎοǸ෌὾ Ƌӛ٣ˏ驛ޙڽԘҧќϼߪ뮽׾ ֽ훹ߘ޹ۯΕ޸ڧ ʱ͡ѓ嵾΃Ŀ߈ Ѻߌ߄Րۨ™۴٭ؘ׼̯צՑڄ Ҥ񡪄ۢɆ֧ק‚ בМ͓Ϊ’㯇ۣ筫˘跶 ՆƐԀԃƐڃƐԃƐԃƐԃƐËξ묒ۋ赂ؙ ̠ΟĴҙв飱׎ūքŭ혤ü Ԯ偪뚧Ъɺ󚮲—ڍѕɎܱ㯃᪀屨 柦⚗ͤ͗ܕٟцʪ˲ʢ ͚؟ΰ㲀۩Ƣđכ̛ԧߠ߫݌ ƻӲ͑⌼ᛉߐ伽ܰNȌվڐ֫ 񥯍靷ԅΤ̑捧؅Ѥljּ ̆۟آڐ捇욣ڏʿˌƪܙÛ˯䀁ڶӂ Ȳ̡Ǘȼȭ˷Β.ʓԁ⪎ܽ΋ӊ霁㱿 ĴŕͰ.ԔĻӻÕӐŒȾ偪󓇖ӄԾ ɞͬȲמØ۴ƒىݻ͛ ڀсԈꍀ⤝ذߌã􏛫ɠĴҙ׀ɚ ɘ鈪쵂ʂތޣޣꁘޣޣޣ걁ޣތޣ Ⱥ˃Ɓ⚈ëҠޏ̆ᢂ䬶 ߽Ţ̃Ϥ۶ӷޛߵǸ 膢ޟߍ޲䷅ڤ˹ދ赱ˠמާϠƂ ϣ˖頢鬖ۯȺɅ샑 ȟʂޠȃԕ훵쎫ޟѾݎ ӤގȃɒǸ„ߚ 򚤉ݛֆȃɒǸ„֡Ĕܙɢ׺˝ ɒ쎫޷˖頢ɒߊïϞŘê Ӥݛڂȃɒ菵Ǡ򥚤ېﰊ頽 ɒ߫Ҍȃ͡򚤁ɒǟ􎫐޷ 頢„ٝ֡Ĕܙɢ׺˝ɒĘêȟ ʂ޻ȃۯشɒΓĔꚺ ȃᯛϠ̸݁˝ߗ؀ފ˙钤 ê­ק頢„ߚʊΓɒޟ êפȟʂ޻ȃӯ됦‚¯钤ʹƂ 쏘Ϛ낯֖ڧ噜Ơ§􎫒 Ӝ깆؏ɢɕשϞ٭ʧɛƙįһԚϝ ˜׽릦ǘ̖Ø׽鴝Ҽֶ̖Ҹڂ ̖Ƙ„֧셫۽һԚ략ةᗹ לă׽ƈ–ۗͳަ嘆˃ŵ٧ۻö뭶ǯ תݐšνݵȼ܈Ǭתǒ׶ω˱ݰ҅Į 똭ӁХ׵ǫŁ뵗ժûבҰס՛֯㰷 Ž밨Ɨޫ⭘߶͊ܵ©윹 ϒ敂ާǫ߽ɛǃћӸ陿٠؝휮Ɂ棱ܕ ˱ա˼ׄŨѽ嬚ڴ̠Χ ԇĮ۳ۍᄉƸҔ֤׎ٟ ȂӨܢǭפ޴ס̸҈֖Л략؁刓 㯼Ҩͣѩ̛ҨƘׅ̈́ ƓҸ„ٳʏȡ݈ﵼהϩў˖ߢ妧 Țخ۴ץؿ؋сԵȽ򽮪Ę ذߌٛ鳍欜ȃ ļɦՀȃɒǣ˯ݓê Ĕ܎頽䴬ɒکΓ끏􉣬赱Ѹפ һšفȃɒǠר򚤉ޚˑѸϹһ šǘêہӤܴ݆ھӤ羕 ֡Ĕ̸„ߚʊΓɒʘΓ돉 ̛Ғšܴ݊ھӤɫ빳͒įӤɣ ȃůʐﰊ頵݄һšߟң؅Ѹ 􎣫޳˜ê­NJʠɺһšᄉ һš쫂݄һš„֡Ĕě񥎽ǘê¥ߕ ê­頢ё¯ˣﰊ頢ޯ؅ѸȺބһ šץš‹֡Ĕ„逝֡Ĕ 􎫐¥ׅﰊ頢Øêǭ̸ ͊ȃ˯뛵􎫐ץһš٢އ ȃ˯فȃ˯„֡Ĕ⯈؅Ѹǵ̶ Ӿɛ頢֬ػɺ͛暈ڨ뀵ֶ޼ȝ޶ 𪽵ʃɣ̑鯆ٚ皸̋ˊσʌ嵀Ѡ 望Ӹޣꈢ赂ڞ赂ֵ赂赂赂ߌӂ Ň㯋۱֜Ϣﵴҿ֠ىۼͰМ茎¼ Ӆծӗ̦谜ǥ¼끬ąՋݲѬܕ 鬖ѝܔڜڏܛ褎ʡ‘姘Ǘ 󺵵űɸ㸢ϒ̛Ѥύ쯖ӗ ¨܄Ɠˈ©ݒ׸ɴ蒆 㿎뫬Μ㗜餺Ȓĸ̚돇ãƢכϷї ٯ©սõԬدةɍñ ܔʒұ曯ΖɸǕʒ雸ұؿ׼ ⪷ޛͯƮǞѪЎȸӏŪ׸Ӊ噡ɘӃƃӪ ˃եǏЙꗤƧ҇ѣԸ⊃􁧯ޥ߁𷇄կβ ͣ𒔝נݐ痤茧щЦ͉󋒘ސ„ɽ넄ɽɽ ޏƯʤس̻òȮߍޟ畞 ߉ϴӢֱαǻ蒝ЇӏՇڅ ݵ󁋭𔷵ÝޜՇȚͭȊ &] [s5;= &] [s3; 15. Font`-zoomed logical coordinates&] [s5; All distances in U`+`+ widgets are always in pixels. However, to respond to platform setting of GUI font, there are `"font`-zoomed`" logical coordinates. Such coordinates scale distances by the ratio of current standard GUI font size to design font size (which is fixed to the default Windows font):&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyAppWindow : TopWindow `{&] [s7; -|Button button;&] [s7; &] [s7; -|typedef MyAppWindow CLASSNAME;&] [s7; &] [s7; -|MyAppWindow() `{&] [s7; -|-|Title(`"My application with font`-zoomed button`").Sizeable();&] [s7; -|-|`*this << button.SetLabel(`"Button`").[* LeftPos][*@6 Z](10, 64).[* TopPos][*@6 Z](10, 24);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyAppWindow app;&] [s7; -|app.Run();&] [s7; `}&] [s7; &] [s5;= @@image:1640&509 ȁ怀흉Дד쥘߶ЈѼċ򍈇⁒Ϝʦę ڋو֯חࣘܳݯԓ ߥĔԲӏ׳ȼȽ’ɅɴȈ⃫ Ѻꥱݻ߫ĘŔ짾ġ栶ܳ԰М Г΅ܤ΀내戂؆穞˕䫠 Ƴ܃崁ʅ邆օݽݒ񨵔 ֯͛ޙ̲ǖ䊑ŎÄȩ梮妑㯰̅ҭ즐Š •IJ’䣞ռՄ᠗̟Ŀȷڜ ϷȲ±ŐϪБ ËЙ⓶䞸ĜɄ Βޑ蠟ڣ摯ªל˼Ն͌ʏݜ ɠҷՕռ޻ý֦ʎ׮Բñ°ȁǚя ޹˗ޢ͇礊̖݇ӣ·ۻᖚҾ ͫ붦ׅխǧȘکǪꧾ˯ɈٍŔϯ̓﫜݇ ݄ͤ훙ݯּηٚڄ˴į嬤ˢҦDŽ 򗌼Ά¯ٰdzսΊљ̊njՋë ՎЃϭ柖婍œ׉ʳ㫁ӝԻ땝ڽԭ ѯӫ•؄Ȟاϝʕ𾁙ރ㭧 ۡߗϗ溻ã箶Ե݈桖ޫ 붮ޢܽъӀȓɓפߋѳ݌귤׿ԗ ֱ߄戇ۅݦ̰ ̨甄֬ЬωϞЦϘљ醿ؾΚ 믢鷪ШÝжạ̄셫кǬ㻔⛯ح̮ ֲݰȓ鐤򾠲帏ះϐ趆δӼԪ ȚȸﵨުЄΡջˉšŹ͇ͣЅ浍؉އ ˗۰ږԜ鐦ֲĚ뷊ʌ󤥗 㼬ڊÎܐ֧͘˼޴ٳʹչճҤ̙ܝ ǬޏŃ㴳ߝֱ嚶գӭﳝ ǁ舉ۂ˺ǵ˻Ɏ͐ϻힳቂ̶ǘ 楎Ȝޞœ٭긩鰋ܨ𳔗첃ơ̱ ϐ䃴ƀ҈󬜖Ͽ쮱ѝ կ֥֧צ֤ƛ֫ӦҦզƏƏ״˞񚄇 ߆Կڬ赟үیկԙϿݗ̷ ȟͭ׶ʓڢϨʉ麤ĭȍιյхܺ ȟȾҦٜ၂沷˙Դͳۄ ýﱧüǯƩ咡ȉ ܽ˦ߝ겊ֿƙƟӰӾʔˤҒف𿟮̷ LJݍǮ֛̉ȚΘտ޻ ̝ɴѢɭםԿگŜޏ౭ Ӟ׹ꎮ럕܆ȋӴͻڮ ӺޞÇҲϺݤ짇۫ۍآ浛֜̇암 컍Й֭͆չǽ͊ۡՙφ̉ꏩ濱 띕ɂ但֛˲޳ݯҐ疧ʃ ֛示Śۅï׼ׂ鰃糯 ֓쥳食텆ﵨ֢غݯͦ杨˔ 籙ڍ⍨Ώ׮ݦڝÝЬŵȉʧ굀 ʍۇ۞ј߅孀ݓϪ͏鐠ׄθΈѪ Ɩήɪё᪒ΗӶꏍ؉芅̾ϧێɉ ذʸۆʔഖ𡐏ϼښಇၹԷ ه능ʊԯޞ薎ק ⤏Ѣջױ겈ȍëڵЊƒ鐾܎ہԪɲ þ׸ɺ̧Ǘ؉씑Ѭıۊ ʹܘʕ՜씮ץٶہ䧆߀Ѯ׿ﹸ ʟÅלߦѩʜӽ˨ܑʌ׭ׯ󂵋҆濡 گד途龎Ͻ搀垫 ĽČ䗘թՋ”៊ѢްʓѠ͙Ѭ ˆ޿﬉ȹ֤ǀݚڗٽƐٗ俑 ܠ䲑Й򖟲֔ɞϰLJͽꓯ鵸 Ͼ򍤑ꆫگɯсѬË܌ܔߜ樉۲ ҉ղѪ؏Ԟȼμ淵퟽֡؞ɜ؈Ů ʟϝްɱĈާɛКŞƑԫ ݔޔ䂸隓ٱ򏖌ׂ³ڼ ƛDž€즍锦ʿ宨גŔ ̼̞Ϩא⢪ŀ屢庻͈ҩظ݇ ⵴Ѕ򼕑ݟСغ݋ޑŐ浲י ܃׽똄׽׈׈ůޣޣޣׯ Ϙ퓧섮؁ä׊ܒ뢭ȧ¼ ۋ̋ڐǐఎ 졧œԛܞגΝՅ͂χ޷Ӵ žي㙫ϥƄʔӫ뤛ݼ͍Ҁυ 뛍ҷػ䇠ȷൽҀ驑ʪƺݫځ쓤Ĥ 馓֩څϐ뾮뤛ҩۈέȬޣ݄ծ Š߸ꂽƺŵܩ鎸߮Ğ ƯƱߞ뽽;ۮԠԊĠێ ރβ́ᯑ鲠׈׈׈׈҈Ҟ܏ ܄׈׈׈߽܀܏܏¯ޣ ΣƐȵܟ׈ⶈ伟ޣ烿Ɛڣ׈׈ ӼƯ៷ƐֵÑč밄د҄񣬽᳊مȽ۾ ⟡ʕՠŔūŃ۪딺臚 ͘͸šϪ㛏Տٿ݊ч޳ջЎ Ш @@image:1749&524 ށ退흉ؔǣƳ߯ܘ񈃞ģԁАăܛ ٿ͋ܜԼЎ嘛Á̼憑սӣ Ȉ΁רª֖ԓϺ̷斒ʥȨ񈎽ǘ„¤ ɺΗˀзۣ匓܁ֿ ĎՄ򹆄ہǒ񷁞񺎝 ̭ƸƏŚގ֍Ԅ׈ڀ܉ ®◐񣠽¯إ̧Ж횂≐廙ԃ ؄̈ФĒƢҿ溘ܠ烺͒ĈԄء ˅ܶ쎝Ǘ߷À𜛠쐂ǶǸ ⃖ꐯΪ狪囯禂߈䆋 ؿǴÐѤY☖ꋅͰɿշѤڅ㐒ØË ȁކϏâퟶ٨Ƨة Ϳ㝕߯ݺѼ׍Ռӫ̯Вʪ㲡ɶ͜Ⱦƌכͻă ԓñМ꽯㳁溆ӫ׳͛ިӫƆߦ տ䑹ѲԠڢڸܰߩݲڊ ϥ֧֦񺡌ƴ⫤郳ꆘŌϵ³ȎǢ쓑ő ĭՍ𚜜㨴᛽ۂ챵ն᱙ɆՉ ‰ɡד̌膇̌㭮˾׀ﺍë 陁ׁޛۅ吴џғˍцյлݼ˳ ‰獹ۚѷۂϪ׈ ۜЍ҈֖޹ċͪÌ݌ӫ㳩܂ڴőڅ Ê猨ؘꖆˢΞ恸̩㘶֤ ŠąЭ÷׽ҶŰב㴘Ђڈۜ ӻܶ禿ә㞚لǚ՛갷ڐ׎̸󥞖 ְɘ᪋ɣᕍց煚؅ΩÄȻ،ö ֦ۚΨٌˋ଄̵ߩ۾ՑƦ˅‰ ɠ✆Ԗ⑘ʖ柾֯Э񜡹ڤڙʱڒۻ 䞝ֳٕϳ㠽̾ōۺеӖ јŅُ㵌Ԯ䍛符ץ 쥎¨ڿ³›ګԒ嗊Ƴ쥎ʳ ⣇ʒǚǛʳקѯž˙ؗߒۗӗ۫͏Æ߰ ڰʫȫ̷隧ʫꫮ݌؊ԝ鉥 ȁȬŬ𥉵뻋ę˥̔݀А ߓډɘН«뗦칃ŧ쒚ܵծ ʅʦ升ę爤ژ޾洋݌Ήҳ ؄ㆮﶲ݋˺햋«ճ譤 Փ䪙דŐ穘۹ǘͿݝΨ֎ ҸؾҨ˥藝Šĺⶮթϥɿĕ պú璸ǏŅՆ˦ч̱υ 庀쳤…߱ʽ޼Ȃ֫щͮΝª񧡥 ҥСϖҕ񟷚➙هٟܬ Ñ҂Ŀ׸Ճߕٵдʙڄ ㌉ƸǾݴݮٻأ„󙙞̌ԂҺ͙ ߰˛񒬿Ųɇ̂ݩ ʣҖك迨ӯӧ珃ֈ ުՈ֒ₖիеϭǗ߈˜᛺Ǚ ǂţڨ㻨̀ȁ̌֙ꁷޥ󥅫Ш󿰍 ǟ䛚ݒڝӢ伇뽴뺈͖ɢ ה쾀ϸ߂܀Ø맒ԉВįۜ҉܀ 芥Ө͔⹣֧ϫ蟞ϱؾѰמ ѿϟ☟ĊɺÌ戰ȷ΄̷̳سÏ د׈ϫɏЇ膳ʒ䈂ٱݞޭ֕ õŀԜք͜Ҭ܁̭ˋ戙ӒԞ˕愆 ڃʃ钮ԎŪҿɂܹι׊ֵ晤ڢӠ ·ȏϏЧԯϚ§߂ζ ı۽ކӷֱ곝π̼Ʋೃ̮ÂФṂ՟֋ 򿦉𩜥ᆬэաՋɼ٦뜭ĩۃ׀ 籊ʛ婞Њɲ̀ꀽĶ۝ӉɚǕ Ǩș⼮ĊƾВڅԱԧʣ€ʶ ְϴၗߏŵ؀܌ۑ򰞻ʢ —ѽȕ܀ָ͚Т١ӟӸ §Ўʹܶʁ؞…Ў瀌膷߭ڋځ θΰ͎ԊӑʣڝΌޛͱ ʙԸЊIJ͓יի·̫Ύн ޟûáȞײȧ̀镌Զ󃲝 ³ᆍօ֮۩򁴐ѤϻԱŠИﯻ ئǧךܔֲມ醻⯋ӯ巖Ȟ ܡ٪Ӣ߆Ėʑ짭Ǽʳ܀хдĩ憫 цᄢœ瓶ҌǤОҘوΒ栈 〣茘ȌГȌȑ øǾֿބќDZƭݥڛ ċཹРČ𙅭ۓֿќذڀ׶ ȁċٴ怑ާЌٚởȾ׷Ȍ ϡ䘧樫˳ޱ͚ų謵ՑힲӴ܌ 񾓕݆޹ݪݠ߫ݠ߫ ¦߫Ӥɼʒм̭݄֮땥Nj몦ȠԔ݅ ВʥС݊ҳݠƸۋ§ Ɲ؏ՌՒ՜§晌́ɶ܋ޱ̠ ֭𩱼⟆‚ힲ҃Ō̻ЬȌ ̳Ĺӧپ焹禾ػഀǕЦ۷ Ǝדާ昁ѻդɭČ䆂 ϴ€怠‰̠͐栈“т ۇˏȌȌȑ栈䖂͘Ɂψ Ȧͦ栈ŽЋ̳͊քýї޽ڥ ꡈƹΊ҈؀ڻŎ닝Ǟ Þۑϩֿٌșϖ ؠτ &] [s5; &] [s3; 16. Layouts&] [s5; Placing widgets by specifying their numeric logical coordinates is time consuming, therefore TheIDE provides visual designer to simplify this task.&] [s5;= [/ @@image:2249&2129 ǜ˾ǟɀȅРıȖɊҝđ ϖ囉ӓޞŮ쏮ǐŖݵݽߏ ϯɺ욷ӧΌӟ哋圥Ïم ϨƬϛݢ˼隚ҴϪϪӄĞ҄΅؝з Уԝ•ן챻ӥ鹚ٽŗϾ۞ ۪Ƿ䧳ܦ觎ǿקןЙޚ灞 Į茶Ҫ׮Ҵۀۓ㕦ѩ󱣿֗㖪ߧ ܻʃܯ܎뺂巩ݚ֫й Ǫ޽ؕş ꘽Ǝ䋷矑ҟꘒ ٶݶɟݎ쵬۬랃ꥻD 󬐚墾Ʒ₝ŽƑĮ❪ܯ υȼϢ뇟ϛӬͿշմ˧Ⱦա֍ב߮ ǻⳝ㯪ȍΠ鹐Կܻν͋ 酺ߊ휕﫲ﲋêߊҸ ւôǡɅ٘ϔּ ųݼ߇߼߫²߫ĺٓ ʭŵл̞όŸ瓿γȥՌꏾ գʯřԧ穂˾پ ݪقׅͦ؅أ߷왊Й̫ϻ ܬѻȫϾ̮ϰߩܬޟ돨Ǭ޾ö ہ׮̉γȥ仩空țﮞȋӡȯ ѥ֦ӽۘ߳ ʱګގ֐էدзϺԣ ٟ띇ꯜעԨ瑘޻䧗òȍŸ ˻񺨄ɂϟӿߏ拝Ǩ ؍мћ󯱅׷ުףیǫ 򊲊޿Ө³ҷаԆŏإǐͬ Ճ󴙄層猿ܹɥ݉˘ꇇᐤȀ ުۡ߸Ƴ˂Ҟߺ⋚΍ϗ쯐皎 ȇҟϿٻ禎ȣɇ⧷ϣ΅  фҼ䍿ˀ蹟޽֡ї٢ ﴹ͙߽ۏϝۉǻעɹ ӬŠ𡬚ڜ߶ڝؽәיֆ㕋εѰ䜓 ݼ팺ﯽ܏ԜǓ㳕ڜܪەΛ ɨᰅڴ켣Ǥݔ⑉Ϟс醘۾ݙ٧ ߬ݍٹع韨ꩍꚎɟ뺎Ӵ̭ԸӼ뼝 Ǽޡܜڞۙ韬׍ڳʏƘў޻߫ 纮Ź󬾮够Ӱʢˇߥ؋ꮝꞅ͡ ů˽εǨءڔöƻ⭊󠾌 ֍Ǻŏʕѽߩ쿘ijЄ糄ř۽ ЖݝƘ兿Ƽڨ夿т؟ܪ ȓϛؔ줩΋ʄꩵڄև݇Ɲ죌檓ِ ǢއѲѕϱʧѡȐͬڔ–˝םΏ ˔֞턡ɕԥܤݱ߯̃ɒƵ֙ ߿ΦѵѠձ땎ڮۈй۟諟슴Ƙ鰨 ͚􂲋̝왽́ݸ´ǞĮ̮ՠ߹ُ崊хǻԮ Զʕۃͷᤛūߙ斵Ĭʝਨٮ ഓϻ̘櫺餮ݰ׶Ώ֮׮Ɲ㙕ǝҭ ׂǢᄹ͓ۧ烔ޡ۞ɢȇǟə 푬ƻ˥е燝ʻΉݏۈij 󟇲㨭鐑ţڇޫܲ޿٧˹ў ҵƲԵΚޚʖߩ̣ε֮ ݵךҶ̙ß򃬚ۑࠄ脋꓈ғدśĚʒͻ ⯞ٴҖЇޒţؐ׏飈 䔏œوצۑԖ砙фѾݙ֬捔ֲݹ ķÞٸʐşۀݠɮϬͯіΎ읬͹ؾɖғϲ ԟ嚥ƋՁ𰛋·ʽڱ减闞߳Ƭ͍̆̕ 紨ձЈݡɓ͇ܧʼݰ͛ڟ˛ƏÍ żԞӕߟɎғמꎎގۛҫ˯׭բ שİԜボ鮣٢޼˻ԛų ԌپԨ襮ܞĴі͇ߛ̭꫻疈͢׀Ԩ ֢ȟʯ˯ӨɆ‹ڑڔު՜׾¤뷨簪ׄ ì뵙ش܎ﳹ˞크ϪТŪ婊 Ųңע۪ׄÜʆőɝݲ͸ϡˁЭҾ㑩 ڔ냍׌싰՝ˡ۲Ѡ޺Ӱư ϵӜүѫ՟ڏŹ䩠ڐەɳó傥ӱٗ ꫲ㙪£꣫鰨֟ٹϝŋѝѲɞ̡ߋŢš ŕ¬؅ֵυ򅊷̥Ͱ΋ ᖝݠϖۗΑﭙߪ̡נЖϹ㫼Ƣ 캖Ѣ㑬򥆝¢۔߅ءũՒʩ ˣ򗍠Ҿ̓ŷĽߋجߝ٢ˑ쬪ˑǟڠᖝɶ䗵 ߟҢٟݒݢߞڽ轋쇒ϷؗؓŪЋ ă߿骧֖䥷Žԣц׋ޤ ۴Тŋߪ̮ע륰ԳѰ枋ͪ ̢὜͙哥ǸۇȢѮ鎎ׯğۥڬܖ ؇̀ܫ裓ŊÊܴ񍶘ú΋ рɩߋ֪ݢȲɨś܊ƐلؖÈќ æ՚Dzќæ՚ф͏ؔŭƋѢ 䞽⦢ڃ֪͋ػր欺Ǚꍍ Njȼϥޏ˓լط՘ҐԚؐŌܾս ĔߗԚٚŸд߈ ﬷ɳ쵴ߢǢۤδېҚϻԨѢ ݼ̧٘ӟ͏ͷ̡報ǻϺӳ ŽȔ˦޼鿔Ї͏ͱۑҌۺ塀ט ԬԂΊޭ턷ݢ㔭ʡӮӬ߬ݚ忆 ˧ǿȓ宛ߢǹ۴מЧݯѝԚ ׸Ը휽﷉ⶣҐѸ诠ιķ܉śǯ ֵ隷󓺌ୗμ͛Зʎ噵أ͢ ۮҕδϺ㢾ݿ懬ʧɍӢӑکɂ وת䬊ݗڬӢݻҷ󖿂ڐԈŘՖ ËӴū˦ꤍڷȅϻ˕͓ŀ۫ߵۼ ؝ij⛰ͼφٴ買ҫՊОߣԚ ⇜烯ُ٪Ŧߊ֢͵ٌΘ؈ ïてۋڑþ͏شӱӃŭȰҴ ٔԚ˵ȡ⦇Ì՚헭ފѢţţ ţţ뀈ţţ财ś蝩Úŭ ͢⛀ؔش‚Ѵ󶍭ڈᯥ؀شѴ͆▍ش́ɡŋ ᖍɰŭĀŭŭ¢ժ ✛śɖ˲鋮ꂀ񊲰 ͸شѤ뭁ٔٽѪ׽֊ɥč˴ւɒڃ ߅疽ہŭ͊Ԛǐ˺͞ݢ֞ǯ͊ ԚŗŽϜ̖جˀŕ͇˔˞҉ݲޞ شܤо˸܆ٴӮƉւ̢ȶ ŪǫíʣϺׅꆍ̢Ưɕɷ豨™Ѭʑ һ׮ӢɓÏŢތ܄“ɥ ũڝܢʧف۔ު򋜮ܝ㶨Ҭڴ ْɹɾ࿿斦٥΍çŠۓ Ԣؔ–۷ѩǺ䌍ݪٶы 񛵭朶ޓ͙βг㮝۔ɤڴϋЛ ɖœﮬғץ̈́ܤ٥ijݧ͵ڀƯ 㓸Ѥɗجﮏ񭞲ѢӖޚՕʥսݻߧܜ Ś͵αߡŲɍۢ⸨ ΰìʊިܔ߳触ح詴۔Ŕڜ띜ﵢ賣 Ő▥ϒ·䷟ϟ̡ݳի˶ԷٴĽ사̄ފ ݏʛՊǢ߿셖喍솫 ¬Ϣꅺߢ丢֎ӃՍыԭН 􊬪ƢɧؑѠޕê˻ʛۋ ⲨҳٙڻҼի׼簨˜ُޡ촧ޘѓՊ ܬԞݘ놝Ƀʧԧɛ̡̤ђѵ݀ ͏Ƣɧ߮Дʽߪ܄³ѸǏڴۚ ݧڔɣ߅ظɍױߤ۲ؐԜ潻ċ 몓Dzܕ玟ꎌѤɉƲ—ĵ߯۷IJ ̸̅ѩǠόʓ鋂ΐڤՇ –ؔ筳ҳߺԓ̛ԇőْׄݓŵ֋֩̈܁ƀ≎ טڔЬ׉󸨐񼔂Ŭܑؔ٢ۢޤؔ хŝɊ̬䙕ѐ͢ƞъڴѥؔϲ⊰՟ ٥䟑ˈݝ͐거ԝۖ̓ϒޢ娍 ㄦؔȭشѴ์渙ȬĖؤы ߙ署ّ݃֙͡ʇҁŁّꇚ֗Ѩ茜 ܫڐ穞ӞԦﺭͬƢǦͫѠ쫃Ő ݝؔţ˧Ǐ⩗ꎸӷԘܵ޵ߩش٨驷ҋ ٱؔߗ態ɯąᡰɁƀ Ë檕✋؋ƚƋƅﮭ퐤疖 Ƿ֩܄ځɼʊ·ʥڱҏ߳ 묹獸ʲሖϒ·ϟܢƓȳ ͞Łųѻ쒬ɇŝݗݥ ¢؀˕ξΠٝΑɘϡѾخϡ﫹 íʆѤήȂ۔Ӹ֨фѻٓήȢ 쏿Ĕž̐Œɥх㮬 ׷ߦǟ˗٥ćҁߡ骧׿֖ȥȗ Ȣլ؀ŭ̸ѩǠόݮĂҬфѻ 估ᑁőő袳ѻđ绒﷒¤шդ䋦 ̓ۗʧӺۺŹ¢ ˡάޘܫՆ份ݷΛΕŪÅр̢㏧л ֥ƭ̹ҚܘٴŁ۾ݙ뤶 ͞Ż̕ƾޜڞ韬ǡ׍󙬺Ѱ עۦࢺσїԹɹ쭁ǰӽ ϫ߱–Ѷܝι¦Ł٣ӞԦ ݤ͛աٵӭέĪٻ΂Žŵ݂Ύ Ϻʀœߥ۾ƜӃɁה갑 Ă喽ڱʕƜÍۃ̗Ʈĸϊͫ 燫ƜˣΥʥŏ羫ϊﮅڨ߹ܺ紏 ܹ䴏윘ҟ믟魿Ǻѻȭţĉׯ Ŀ󛼷籩׶枵޿ʉ͓ݥǞəؔ 㬳ؔɷр‚р‚р‚౓ р̐Ėشр̀͒œЉËƄѻ Ώ힋ퟸֺڹ؅ҁԎڽ忻էێ р⁖񢴊ޚݡߪݹ腡¢ʀ퀖âơ ϧ҈ߞ݅ۅ Ŗ̸Ѣً󽗓燩ʆʊҨҊԦ ֽ׌껒ʞύݢޅԹҜ屪 ̨۳˓ǥ􊋂Јݒžדȣˌד֞ ʓߋ󜽼Ǣ܍ۍ۠ٵսɈٞ р٨ѷݽپֻǍ͹ݵﭛ誹ѻ Ķ␃ĹŝʼnǏͫۗΌ׎ˌḨ߂ ҽҞɟɢމ№âުɡǺ щ͙ǭݥڑѨӁڨÂ񋂐ųؔ 󞗖شѻڀ…ќŁ̀ؔѓ賍ځѤ ą¢ؔ㲨ޘÿѓ͇ꇰ謖ȿۮ ױԖڙ楰ߑس兞ɣɽ¬ؔԕƆ рх䞕šԎǠʾШ˙ŏСܴ ඩͼŖձ皖ꆜ΀ӊҁٶ ŚꀺսЀ꟤Łؔœ퀖Őр̀ōޭļ󸰨 ځǟؔؔќDžŁشԎќǁŁɻޢ ӑԤ黬שּׁ̬͗ۮ؃ŁԤܢѐڀ ͊ނŁߛ܏늒ԉЊǰӜї߹ͧمÆ䊥ʡ р즉ԸؕƤ†Ц١Ԏߧۓ۳áϏ р쿦ԍ胆Ўݴ걨ǖԄ 󅲳򞅣둦ȵؔΦ聀¢Ɓ漮ꇰ ¢Ë漮¢漮ꇉѦشр̀󐞗 ѻȗԂĵǏ͂уԎѓߋ斔ѮƗވ ƀŋѐ޾􀀺Ԟ誷оԢ簚ذʒ Ǐ۾ߍꚞȠŐǏڀѰϺԴЃɅ卵☣Ǐ ѻф冕ۧ漮Ԭ¢Ɂ㢌漮ꊀ ¢м¢ɁМ󞗖ش̀淰ศ ¢Ɂ㢼¢̀Խܢڃ왈ش âұԈިŁꇺע€鋬ђČ ⬪ʴʇƀ鬚Ӣ̨˵ĻŞÁӀ؋Ө գข¢ɿم̩р¡᭚Ćޔ —ŋϸ٥DžŁؔќDžŕ퀖ؔѓ㭀 р̀߆榗NJ׭֞؍ЬѠԤ̢ʛ ϥ賗ڡ۰Ǐрɖ 鮯վؔʢ֌ߦӁźͻԳ͖ՀѓՊŁ çُҭЗศɼԊܿԭЗս󸰨 ځ󸰨󸱰友ځтȓȮ漮 ¢ݘ˯ѻōؔ؀ؔؔՅœ턀р ߒўؔ˃䢱ŵ߱ϩр ؋ؔ͜嬪ʼn¬рⓢ؋Ł ꞖŐр̀ѠشԎؔТٍϚ૸ DžŁöꊀ¢戼ꇰµ漨¢漮 иꇰ¢漮¢漮ꇰ¢漮µ ¢漮Ԭ¢漮ꇰ¢м¢ Ɓ漮 ]&] [s5; Visual design in U`+`+ is called `"layout`" and group of layouts is stored in .lay file. Format of .lay files is such that it can be directly included into C`+`+:&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; [* #define LAYOUTFILE ]&] [s7; [* #include ]&] [s7; &] [s7; struct MyApp : public WithDlgLayout `{&] [s7; -|MyApp() `{&] [s7; -|-|[* CtrlLayout(`*this, `"My dialog`");]&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Run();&] [s7; `}&] [s7; &] [s5;= @@image:1080&480 ؀ǜ흉׮߀ɇچčѶʴ ߛųðﶶᘨ۽ݖ廢 򎄕Ұَ܆敎ɴբ֤Ŋﴍәʦڃա 裳տŒⴻӕۇĂܧθց 脀ݞۈŦۉ֛·͑޻ծВ朗ޱ݅؏ʴ„Ε൵ Ǥے؃݋ݷ߶̋݀Öމύ ۷ɁגˑهТҺ䄵ƪ׌̂יࣆك証 νۅʑҴʹˁᠧȊց򍒆󯳣΢î펞Ǝ ፛П鳠ҫ󜏙ꇽܜט鱒Ƚɰ ԹڪՇ޴ۮܥ룴뢧ⓑåز ΠᦜžɍݏȻȴɈĶު푪 ̳ε˾̓܌ƻ工֞ӰƵ ݖж縆ͦνٟÛëջ ٴôìꞟłµީۍ ߠŖƔĶ͋ţ̰ꬲƠ򈞾۳悲䒉𐟢 ܴȨۚՇ޸ۊڲےټô͢ʌڞƵӿ ԏ𹯋𲔵ЦŤָё쨦빬蜅 ¿ž򓪽njѬوҴӯ񐼄 ۩픭ꆖ著Դ݈ďĈدޕ΂׭ö ٛ٭̛Ŗϑޑǚݼ Ǿ׏۩ǰݑ֡Ьέԥ 䵺ߎۍဆ᭘ֶ݂ۨ眢όӑן ƍ߇ǻǁ񻤮޺کƤՄﲬĉ㟯 ؑȌ†񵿐ȇϬ߷ر 쯖⡺ԑɡ茚ڊ֨ǡÛդҙع Ғ׷߸ҏڂƘ򪛼͘ư얗蒡 ܐ߀ήċͩ񎾯ύʭ݃ŠžпҒҼ Ԗ̶ʮ׌۩ռɧ סDž񐼜ȕǭ഻׵ԥ탖⿪왍ۚ Żۈ✊ߍˑָѱӈзۥ֯NJ ¨섦ÿ쯑߁׹ĩ樵߰ Ƨǭ܏҂ܭꮔ߇֦ ڭי͌כļ́̒© ֚Ԟٜ۸Ёⱬ񐺀ӎҍ ֫㠓ބɹ䌺ݴ㲢݆ƬĞŐ握ʫ ’̴㡶Ż₷оߠɱᔆݽ﵃ëڏ盎 Ո؆ጚ쌲⅋х 쾄ڜ΢톩ݨĐ̏ǙØ͍해셡훎 ף΍ᇗν؁ܶաĕ–ԝ 黿ŭ׼찹Ƹܑ陱ϓլ٬ ؘܘń硄Üݥīۋ̌ 捳ɇԅܞӡݛĔȿɯܕԭ҃ҧضԗ ғ᥊߈Ԅ׆ƒξ㦏ȷ Ɣ򧟃݉‡іͪՒߒؒ㮯 ۜߘё֠ɰګ눁Ї ѓᩙӉԈ硾Ɠپϳ܋·ߒ랇޺ ףĘƴƱԩŚعܶë妅Ҫݿ 냜يٟ葼NJ֮ˈțĦʅӢ ٢ۅĢӢ٥դꖠīĊӋ局˹Ё ȒɄϻЄ̣Оȑ⡏ 貹؈ĀЫȑءəЛȊ ԁʱΰ߬ř̽Ҥŵ㡨ܫԓ½ж ۾Ѡ߯̿ЇڞſÁ 橏ޔЙ٦ģĽϪŵЀ ЀԑÊĀ憨͇ߑҧԿ֭׳Նߺ Þ쬧ҁ߽ݏԚґ蓇齹롓̄۟ ۊѰÛȋŬ尭Ñǒӏ줔ǟח şݏ΃ҋÁ̽ĎŸ ຮDz憨쯻蠞ĴކЀȑרҨ 㷂҆󽥞ֻ҄ÊЁŌЏߛЄӨìОᴿ 򞎿ıǿù缉зﯯחНŞ Ҩу &] [s5; &] [s5; To understand how this works, let us examine content of .lay file first:&] [s7; &] [s7; LAYOUT([* DlgLayout], [* 208], [* 64])&] [s7; -|ITEM([* Label], [* dv`_`_`_0], [* SetLabel(t`_(`"Label`")).LeftPosZ(8, 36).TopPosZ(8, 19)])&] [s7; -|ITEM([* EditString], [* text], [* LeftPosZ(48, 92).TopPosZ(8, 19)])&] [s7; -|ITEM([* Option], [* option], [* SetLabel(t`_(`"Option`")).LeftPosZ(8, 108).TopPosZ(32, 15)])&] [s7; END`_LAYOUT&] [s7; &] [s5; Header [* CtrlCore/lay.h] includes [* LAYOUTFILE] several times, altering definition of LAYOUT, ITEM and END`_LAYOUT to produce C`+`+ code which simplified form for this example looks like&] [s7; &] [s7; template struct With[* DlgLayout] `{&] [s7; -|[* Label] [* dv`_`_`_0];&] [s7; -|[* EditString] [* text];&] [s7; -|[* Option] [* option];&] [s7; `};&] [s7; &] [s7; template &] [s7; CtrlLayout(With[* DlgLayout]`& dlg, const char `*title)&] [s7; `{&] [s7; -|Size sz `= Ctrl`::LayoutZoom([* 208], [* 64])&] [s7; -|dlg.SetMinSize(sz);&] [s7; -|dlg.SetRect(sz);&] [s7; -|dlg.Title(title);&] [s7; -|[* dv`_`_`_0].[* SetLabel(t`_(`"Label`")).LeftPosZ(8, 36).TopPosZ(8, 19)];&] [s7; -|[* text].[* LeftPosZ(48, 92).TopPosZ(8, 19)];&] [s7; -|[* option].[* SetLabel(t`_(`"Option`")).LeftPosZ(8, 108).TopPosZ(32, 15)];&] [s7; `}&] [s7; &] [s5; This way, U`+`+ keeps tight coupling between visual design and C`+`+ code.&] [s5; [/ Notes: ][*/ t`_][/ function with string literal argument provides internationalization of texts. ][*/ dv`_`_`_0][/ is synthetic member variable name used for unnamed layout members (0 is index of member).]&] [s0; &] [s3; 17. Value of widget&] [s5; Many widgets have some sort of natural value. E.g. the value of [^`:`:EditString^ EditString] is String entered by user, whereas the value of [^`:`:Option^ Option] is bool specifying the status of the option.&] [s5; U`+`+ provides unified interface to determine the main value of widget via [* GetData] and [* SetData] methods. All types of values are passed using polymorphic Value.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|TopWindow app;&] [s7; -|app.SetRect(0, 0, 200, 20);&] [s7; -|EditString text;&] [s7; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] [s7; &] [s7; -|text.[* SetData](`"Some text`");&] [s7; -|app.Run();&] [s7; -|PromptOK((String)text.[* GetData]());&] [s7; `}&] [s7; &] [s5; Because this feature is used very frequently, U`+`+ provides operator overloads for this interface `- [* operator<<`=] for SetData and [* operator`~] for GetData.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|TopWindow app;&] [s7; -|app.SetRect(0, 0, 200, 20);&] [s7; -|EditString text;&] [s7; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] [s7; &] [s7; -|text [* <<`=] `"Some text `- operator version`";&] [s7; -|app.Run();&] [s7; -|PromptOK((String)[* `~]text);&] [s7; `}&] [s7; &] [s3; 18. Accepting and rejecting widgets&] [s5; Ctrl interface provides&] [s7; -|virtual bool [* Accept]();&] [s7; -|virtual void [* Reject]();&] [s5; methods. [*/ Accepting] is usually a reaction to pressing OK button or similar approve operation and usually involves testing for correct content and finishing any pending operations for widget (this may involve e.g. updating data to SQL database). Accept must return [* true] if widget is accepted.&] [s5; Default Ctrl implementation calls GetData for the widget. If ErrorValue (special Value content) is returned by GetData, displays error information contained and returns false, otherwise recursively calls Accept for all children, anding the loop and returning false when any child returns one. If no false was returned so far, Accept returns true.&] [s5; The opposite method to Accept is [*/ Reject]. This is used when Cancel button is pressed or similar rejecting action. It simply cancels all pending operations on widget. Default implementation calls Reject for all children.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|TopWindow app;&] [s7; -|app.SetRect(0, 0, 200, 20);&] [s7; -|EditDate date;&] [s7; -|app.Add(date.TopPosZ(0, 20).HSizePos());&] [s7; -|app.Run();&] [s7; -|if(app.[* Accept]())&] [s7; -|-|PromptOK(`"Correct date.`&`[`* `" `+ AsString(`~date));&] [s7; `}&] [s7; &] [s5; &] [s5;= @@image:1029&260 ΀̔ޫњы⯄ȯŐݠҴ 륉߭ڴЬȽ삨͛ݝŷϦ Ŋǭљݝ談塼㡼ݑőۼ؁ ϚȢ܏יͷ̺šܯ냵 ౼ဩլꉚ윊ʲſߖ⑔˄񆈠ݢ 鹁˨͎Іπ뢻ĶɛєՒ¢͐ ͣ럑Ñ݁綕׬ԝۨƱꀔһʸę 划МƁ˝ԑЪܞͪ٤ žնɊ駑֌躨̀ɨֵЀ ၔǝӅϻŻ͎ۿւֶӒ䵞Ɋپ ȇډߢǰֳ°Θ༒술ЀЕ¼ߺ ˍνΗϚ۸絥ޒꦚŻӰ˭Ĩɷ 𱍏욞ҠܼއБȿٜӾ ŖړøׄಾĹرڇǮ ҳĶ汍˹篶ʵς򪶍ӻ⃀Ҵ¶͙ܰ ̛ߥǔڊ켻٬ܮ۫ӡ합҇ ؽΜтĥ撒ͦ흍͈ަ이 Ʋ⚘̆ȩ됀뚖ôٰÝ˖̕ӗԛ͊ ŋϙȇ̫̓Ȓ΄ѷꁥ̪ؐأ˴ڞ䚄˥Ԧ ˛Ц؋㫧鄄鑵Ò޲ͲŒا굵 ☡ǬтӹƝشкͥÂķàǁ ɸ秨ߛⰌ镫떞۶Ǟ̖嬱֐ߵӰ酩 쾯ӼՔֻוŹ̨ò؛̾ǽћ㟰Ŵδ ښǴ馏酂ɮخǢɐ٫ۢʯ Ňť멘ɂٌʐߚϗәܩ鏶 ՚Ӕ̓ʱ«۷Śෛ؆݅ɍ˚Ә ˏʹãƴ݄뾐𜣀ԊÀқ־ٶؤɭ ƻ报칏ɻڶߔӺѪюĠ ⿨թ۟ٲۊߛܸ̃ͿʨϗĢ ˖Ԁڐǐ칫ՌԘ ͚׹ײӠ鏍˦ˈͼ떛Ƌ ՓŸ᥶ӢӒƱ؍ű팬󑶭̣ Ķ̭֛˖Ҍ߸ቔؓݷƷ礴Ϟבά٧ް ίɺǾԦӵ团ٸ߱ෛǗ䏭遇 أɱϏ둟НӬʶš坁¨΅ ϗ㕝Ŏܯͨӓʏ俭㈥ɷ 󽐡ꚩɦ܅ēӰР򔢘⬪ԦˬЍƻʚ ߕʕۤËॗڳ҃ԟΨƻ͐ͯ ˞ƉݹӚ愵ϒޘ󠘖﫦 ͚óÂۋ㚵ڹ鈡뭨巍ѻ КԌƴcʠͿČԤ뭩ô͋ ϴê܆ՎִۗʣߚɈܳЌʻ؜ ֘ԴĠבѸƴ̭ˡơҚ ۴̒ⶻÔ횭ڔ㸛Ŵښڍ՟ބԵ ߦشշ޵ @@image:854&629 ǜ흇ڀî܅٣ϵƣє ƘѠ셥ϙ®·윳񽥇Λݰ 閷ą辜ԒŠ╣ΣꛫۈӱÈѤ䧩ҡ鸚 趙އ◡暏ǵ̓춄ȼ񄦠 Ñۉߝؿ񟤣ƅرЀ̂ˀɇڦٙ ꨠЂ潑۶葍٧ފ‹ 暞䋚Ѫځل؀ʀЈՆɰ幄Ⱦຆ 䩐Ŋއџڟяعт۹ÎΩߪ ҚNJ킟ܝɍ⬾Ւʝر ޢŔɒ˦Ȗċǂϑ懈ɲڊށƄО ԀםᾇٽՖ۾ ʓLjجȅۼ⵱ĴЬԖʸӔ㭺 ࢊЋо޿ؿÍͯߌԼܢӥƋ乶 чݱÿ͡ͿߙÿπۣΈ嘈ߎ͞۶־ ɓѢƼτŢ󟴛ʁݮ ɫş߿ׯ빟ѯ̹ߘ˖ϒްœ͒Ň̎҈֢ Ϟʉ̣炠ʇϛ崩ⶖՀҡֱϴڣߓ Ͻ티٤ⱐ֣ك킄Źʙ‰ Ƽɧګݖߨ될וүȀϚ쑑ǿ Ⱥ󿓠덵ɢ̐ꄋɚɜր˘篼 ϲ߈ÍͧŹ֐ǧ䫀ۃƝݖ됁ށ ؠ߷󻋢纊֢喂ĮϤӠա䝢 Շ˭Ѿۀ֐Ǣ蔤ǒͼ ոၾò狕ߕ֯ʍ򙩚ꎝ̿ ѯ®۟㵺խʅԕ”㼅آɾˍų ͝܎ʂЋˈȏ҇싰ۚϐⶐͿ 샲ωǾǮ踩יю峂䳺ӻ󭉐Ā䆀 ʲמʭ뙨䀳񺻱偞쎋 뢰ψȑﯙ΅ȜωõӦ殺 ׆ݒï胧ۂʩ䯼ڢDz ʄŖઠˍұˋƼЇ鶪㓳ϢIJ㋩͂ 즯ְ﹀űä˿کѾͰ䳓 ءˏ޶͋벭㟹䑠߄ŝ ŗ饟Ќۊ´¸¾ʋئ ńӑ瀈ܱӓ퍇ېԐ ԊߘШ˝宁р¹åҸҧ ɸެ̂חыކ̭dzȵſ񝲧 иѡ¹Ȣﮙ렺ҍ瑇Ԗؓ齄 ށ߁ީ̝ꐔߜ֤铻߮҇ »؇Ճ襎΂쮅¯¶ڟ ϊӃߓχɞրԐրӶ³珧 ٩ӂ׍̴򙀪ٻ؂΃և ׀ԾˋѐǶůݦͯ߅ٔLjݹƕ 뗍ɂŻљ㫠ҵ샞ᶫԢڀ〫蔁Ϲ ـߠ﵍۹Г΀ĉ²Ɓ﹁Ԁ΀ ؁Ā΀υހݗԩςҼҢ®т ѡ¿էގ𚸯ժ왟氦΄ɑډ˓ Զƛׯ؁ҡǸ㩠ͷ³ѠЊ҂ӊ܊ ߠùؓ񻓜𹚺κ𘎊򀑵ݥҊ ܍ӧڶڵLjЮ؊ѷԏ ̫ٞȕфҔ̠޼ 񷑣ܖ䂂񤇐܀슳ۄ Ř㸷جć쯲ƴᾊعЀ҈ϡܴ罜ȟ ɑᇴދہ鍘БӜ⅃ ؀ݻ池ͨìڧ݅뒛ȓ莕砡ݣ ײɟбūᶫтվƸ Ջήô󡰿ٺœݩƀ廫ވЛҦ΢ чՠ Փ̀ѸڽΓ٢鄓㮂͝ư ȏߌ㏾ŝ޹ӭߤԑǥؿ腅 ²҃ܰ˿č݌֭̋؟塯 ބėڊʊ͂ɠӬ́ˁ͊ 缅ЉٷړȘԾ֚ޓȯ›޸ ̖쉴Ԃ㠁˸͎ͩʟŊ 冸څŨ毜㳼鏜ӪƦ廿ȭɽ܅ ᜫɆɯʶ۱†ާōЊ魿 ҂܀͐˂颲ԜӂʳԶǺߞւَؠ ޥǴϜ٨يכ̌ 얙˫̗̓ߢḍާƂމ—ո ̓󣝄鲲ͱȇɪ䖀ߚ ʾ֠Ɂɸӭߊ貢߷ܚꣀ‡Ƈ ڴޗϊ︼ۼڊʽקϺ ꯀǽႄ𸁼΀Å𸁼М΀𸁌΀ ŝӸׄ뚬Њ莴堝׀˦ɞý£ޮ״㿳 ߄яᄀǍțܝ̴ǣ݄֗ɻۅ 㫋΀̭әޫ֯σ酧 섊갯ɔւѧݶДحמɐŞб˶ ǑրЇڂ׆ǁ繹ߞⅠؠݑԬƣ 󹜀ϪȺ׷ȅʡÇѶۖ ӊ΀뚻ڣ׫ԀəޯӁǣ€Ⱦ Ŏ΀ք򎵫ؚ֋Ԉ򫠹 ɀʻ뚆Нۄ߄م뻼 ҰݻՎˀզΓ琗鞺닀 ®؁Éêڸł ҂Β—ѩݱ넳ז꿡׹ȡ ޢȫρ &] [s5; &] [s5;= @@image:1029&260 ΀ǜΟɴ̛ڋĬ򔖐ߜ Ӧӓ馝دౚϤ⫠સ߿￞ݽ㻏炖 ؼω֦֖􊶖ͤӥҶڹࡸԒͽ ܄Ѓ닒 ˱ۗۨȥ몵󪁾υَܒ Ɤד΄ڇнʑ쒐ۥӠ勵 àνۥ袶ͮԅΖѢׅˌз烺 ګˇʸ͙Ԉ񉭁񬭬أ쮊 ƠȞҍןﯛ圥аɈ֙î ߠ䜧¶բѫé՞˄ȡܿ˽ ဩɴ¥ڍӔ֤ӌфҌзžށ䏜 ܅ޭлëԯȵܻ̻̥ژ Ƅۮܳƫŋөㆦ ԅӖܫܷ궘ĴΛ׼屄ϚɬѮϷچ ʗ؋ĞΚн׍򃀼ʃƶͻΛӞͳ⚶ Ϫҟꥎ˨ɲȴ鍥Ӧ܋螺䨚ƺꦠȦ ý愻ᚦ٬̓ԬӂМۜ㹌Òٚ혷 懎⏿߁׃Օ傞ˀ뢣鿮ӔӬ˓Ǜ ֊鱲۩ϣ͚ܧݯ΂ВԓаŦӃݙӫ Ǥ̚ۥ̨̇鰪ёۘظٴ֦Ȧ Շܑż䳧͏НҲʣʺ۪֨ۆؔ ö҅幡Λ扚˳ŶͤǙ饊칽찉ҫIJęڅ׹ ʦƖ¦̓ʵ俌菄ᷲڔ џȻ츚Кʙͭɻ׎з剦ҬړȴӺ ٸƱب係ǠƖЌחƲճеݤށٶֻ ɍ̓ꮙޝ楏ԍåǾᏠȟų̱܉ճЯ ʅڵǜʻԈԆ衒꼀ԉ즃˽Τ ŚБͥŰꫡñߪՋԻ̛̛吪ã ŴҔȟȈĚюʥ݄ۗ쯗Õ𨂎Ү ٴڄŴܾٴʘ͍확̣܄޸ޜ Ȱӹ⯙ؿȶߍ٭р欛 ο⹷ϿδѶ⫳ʗ՗笑̛߫ ÷ө٘߱赮ݾԘ䳅ͽ굥Ӯ늝޼ܴ ɗآ֝ѳձӜʨ߳ƾƇ݇ ϸô非ؠ܃ϱ㻗ﱞɧ ʿ۾氞ļ晢ŵ̾܋Ԯ買в ޠݍ܆ݦƴɏ񇷇蕮эݚ⛮ˤӨ Ϥǂ›ٳ̛τÑ⽚ڤ̓錱Т ӭӆяϏɺܡЙ¼̟ė¦׆ œ߷ՐDŽ䬃Ѩۢ킷ǑТ˄ 񼞋ף뚱Ù맆ŸƄĐͯӆ їËȯ̓ꏧӨö́߼ĨՐ ُ㮝ƕƠ㝅匙뻼Ʒܮ Ő߸ہ @@image:874&629 ǜ흉߮ڂԩē؂ԭʵք˨Ƣ ¶䛬̿墦ϙΝ޻܀еƒ ܶڐЄ؝ᴫ۽ĖƂ֚㐓ূ̡ܿ֞ ꝶُ܎DZüƨםܞֶ ӥ돆IJ湁˧䜦ҀÌܢ ʙЃƄҕ䁬㻡̫̼ד敶 ̷ᩩ槉©—شʰø吮晦Ɋʐ౬߅բ 憩Ƌ璂̂ӬՉ֞Îծ ͉눔֦֞Ď몌īԐⳓҴԵ ٢Ŗōрǘ͚Ӫ͏٣ 뫒ۧĵ埨⵿ٍ·ߊſĻ։ 󄛗ᮙ齛Ӝӟַϴݙ֔ﱹҧ ۭʃϫֲﵣю種͛ ²Г➗ꜚ윖ކ򆍔Ƿ Ɍ۵ꪞθᬜ񜳴ᝰဖމˀɷ͈Դ߰ ɠؿ±윧ؾʝ΂Ҵ˹Ơݱ Ͳ蒉Ǖהڨ۫ǩ隚мޡﰆƃߊ ݆ۖʞ҂ذ懙ijȀ㍿ ۫Ġ̶ԐƺȗȿĈ󧺑쁚μ σ̩׆ߤዛ𳏕ҷ׎؏ͤղ ׷ɝƆڬڂNjΨԍŷݢڵ߮ ځͦˣ⌙έۆЇ݃ЃɍȲ ʝσ؝Թ嫴ʉş⁌Ψ׳ Ԥ׆ŧ͜Ԑ۬ݩծשѣ ׂفʙեỼҝņ֕󇹃 蕞וƾՓܜ˰ř޶Θ ܍ВЂـ̓۰׸ݻ˞Ʊ̀ ̧ղᢵةֶ晖ឯʍԫӍð ԏٟ䮛٨ԩѳԻʙƓˀϱ҄ 䛚Ȍ䀺ꔃרÜնﶯՕ㌿لͫ ɝǼø҄褙뽾ʡׅה别Կ ⠩ݓШߚת桅ڀⶏʩ֎ه ܣ롃♠˪ꨭ̀뜜Ț̆ஐҜՊȕĒһ ոև΁±؞ªݻܲĴ隷 ޽կᲂ˓䚆Щ›ꀧڏڐᴳ 갛ïчͥ䐲쌅ڵӲШϋСƥƊ΂ܟ׮Ϩ϶ 킅҂׳ȿ䀘⌐؆軾ۍݨ̸ ͖擷ΜЦ·쯁ӻǃ 䠇ڲƘпŏϺ͝ЫӧΛޣҧȚ 챝̞ڇǯϚβ†ʲ֎Թބĩ鷦 Һȕފڇþ藺ʹӜˆꃹą ҂عɬϜɂʁ垳ۆݎו ڦߢ˂ƈ݀׏ˉ驵ȃƙ Ƕŝˢ͸ڕ䙁תǘͿ ŲﵿŁ͡ܭՠҼݜށć茴 ޲چڹ٦ɡ堻堡ɥввдܘ ⱔґ̤ā񂣾죣ʐˮպͲد缯҂֖ք܌ вŴ뜌͗ə摱עŦÅ޺Œ䐈 Ѳʵ߄±Ճ۪⊵Іޕ⇉ ψ퍃˝ʁң򨙺웳糹ߨځ ΗÃꑃʉˏ⟕޿ͼϞ¿១ц‡¶Ϥ ӛ׆Ԇݦ䬻۝זٱȃĺ҂ɾ푡 ɵڢĠ䤗ᚫͣŠ֬­Æܕ⩒ˌҍێ䧵 տϺij˨ʐɋ񅏅ؿጫݥ⩕ň鐒׍ȉ к׮緡Ž̔鞵ꬥڏ虞Ϭ柧疔겤Ò؃ З߿ܾ᣷߾ԑፘԕnjҠ٥ྸֲҳ⛣Í DZ˽ڷߵȫ䥸ˆߙ΁ޅ ɁùȐ邑߹ꥍíعآ⫑ ɇij쿕Ɠ艜ْІЊאӆ 𿹺鍣辥ߚ֓Բ葈ہʖĖ Є𙚓㳴普ƨį姉ӠÖ񢢘Ъ ĩ鸙½ɔߪۓ˳ÌƓ 陿ϊϱ趋᭛򔦉‚Ѣ؊Ն ņ݋Ɏ㧻̯┡鮂؅ӆќųќ聛 ʮhϺ†ЄѪ̩”Ԩ㗒Ϧ ߬􀶪̼ŷӀٗ¨Ȩİ򙤂ɐũ ۔ţ͞ⵞ螋Бƍ滣հ𤴰 硫ل᛬򼨤Ł䡊ıοߣ ζ遄ۃ镼뒃 ہԔӄ̫䵯籾؏榣Կյ핉İד ˱ҮܽÃɥ֐ˌ֯ײʷ矽 Ͼڮ缽ڿܢ冦ۋ폫ߞ ܔǢ։ᱻÀӏﺷŽޙ Ęݗᇼ㷲ɽؐЄͪĎ ܖƳύͨԓϽ𾷳ܮ Ľ뜉ɯݺϯ۰½ꩲ Ȱ߶̹݇칑ݛޫݖ霺 ɓ۴ֆˀ֌׎͛빾ܒ֡ рН֟ͧ브ϵѲٟ䃾ޝ ݗ݃崐ԿԶœƟü侀Ă Բ׆پߑҜ߆ڢߝؘΰǎΌ о뻾Ʈդӆ掭 ١堡堡ުܢޟ ̂ޱ倮ҾܒϷ躙١Ƕ҂̑Ȗ نȉ藆̜퉲ΆΓڮ񫠹ّû檘 ˦͇ʙؖزƊօв҆Ќڮ¨ݍт䈽׆ĩ ͝ƣөڕʐ׮׮ڭځв҆ʠۦ ܸᄇܑйͅΚ“Ѩ丕ͅ Ҍڅ¥ԩѰ Ѱ䫚ܔԣؗ…š ֘๼ݔ႒܉ϊ᷸דÆԸΡߌے ҁΧ둡ΙŸҿóّ ƥʼnտέˊլ١û㷚мτ艤 ɀ訨ΩΟԴ‡ѦƓֱ͡ ּʙќ߇瞫Ըćד؆ҟۚ &] [s5;= &] [s3; 19. Widget edit status flags&] [s5; Ctrl interface provides several edit status flags&] [s5;i150;O0; [*/ Enabled]/[*/ Disabled]. Disabled widgets do not receive any input. Disabled status is usually expressed by altered visual appearance of widget.&] [s5;i150;O0; [*/ Editable]/[*/ ReadOnly]. ReadOnly widgets receive input messages but no changes to data are allowed. The difference from disabled status is that ReadOnly status allows read operations, like selecting and copying data to clipboard.&] [s5;i150;O0; [*/ Modified]. Modify flag is set to true whenever data in widget change `- either by user action or by widget`'s interface. Flag is cleared by [* ClearModify] method.&] [s5; Note that with exception of suppressing input events for disabled state, implementation of widgets is responsible for correct behaviour with respect to listed flags.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|TopWindow app;&] [s7; -|app.SetRect(0, 0, 200, 60);&] [s7; -|EditDate date1, date2, date3;&] [s7; -|date1 <<`= date2 <<`= date3 <<`= GetSysDate();&] [s7; -|date1.[* ClearModify]();&] [s7; -|app.Add(date1.TopPosZ(0, 20).HSizePos());&] [s7; -|date2.[* Disable]();&] [s7; -|app.Add(date2.TopPosZ(20, 20).HSizePos());&] [s7; -|date3.[* SetReadOnly]();&] [s7; -|app.Add(date3.TopPosZ(40, 20).HSizePos());&] [s7; -|app.Run();&] [s7; -|if(date1.[* IsModified]())&] [s7; -|-|PromptOK(`"Date was modified!`");&] [s7; `}&] [s7; &] [s5; &] [s5;= @@image:1029&460 ΀܀흍ГێޫʡѢʗؠԡ޿Χ ǝܹ۴ޯܧӁဍɶĔҵͲقʿ ޯˑ߭ގÂڮŀݱ߈̘ Ǜ鸦էڡƷŠȊ ¬﹁嶷ñζȥ΀Ȋ怱 ශÀ֓仓ɎɌ¢ɼű疬 ÑÊڤ݆öځծƔϢƬ߈غ ‘ݎš뼧ŒѰ֬іŠ ×̦Ӹᣰȁᒪﯵʸ§栘ߞΦӏМ ‚􍇬٧ƞͦٛڍްĔ ߹ŝش㈙撵ˠŵԷ͠߻X ˭۳ڟڟۋ揭ʞ΂姳ē횚 糵֟혁åˎϏ߷³̷ɚۉ ߹ɇÍٷʦĐ韒݊֘ദͳ̏۬ӷʾ ̴ӗĮسؙ҆ܰ ј򩼨㥘ĸͳ㜭ҦٶڝѬʳ֦˓ϕ ͷƽ谜Ԍ嬉ӴԺʣސ͸˳ ʖщ两ܝ龎ШሤÎ۴ɭԣ֬ ȗκڃݞ욃ѻ̪۰أô¼ ǃ͋۴ΉȖúլ у۩ȡָے뚉Ԇ޼ꃇ㞣 ɦ񩀧Ӫ۷ۡﻹ߶˘ŢƽѡǛ ֠Şͭѱ殩δη޶ġԅÿք걬߹эޱ͢ ɰ浫皋ںǴ隷鮍͢믩߽П͉׿Ɓ Ѥ߮NJ۩Űݝ؋Գ̶ƿş 槕ӄ왁Ѩձ͑ۚ Ǘ߉۔޴شʹۭ٣ݿĴ܂πlj醁˰Ů Ϊ驓꡻޽ﺉґҾ̓ŀ򚨉ĥѲ΂ю 搩Ʒאן͍̻Ֆֺöά 񄶭ܶՎӀءȆ՛ĺѦέ ɫժڼƻѮפتٷͺˤٙ뚄δ˯ݶִ ̫ȟ̹犖ʓߣФʓ̡ˬݴƟÅ ˆӴŦ˦Â٘򢵗Ćى򧡻 ڹ͞տ鱇Əŵ܆׆ ޣɳ⏦ĞӱɧǗ؈؟ˎ ݭûۿǣ徝ڵΏʖߙ dz޿dž엀՛dzۇ٭ᨾӖ橺ݑ ުמˋϻØ˯Ì؁槶ͥ 盨癠槜ݯʼnˣ餴 Խ׍Ӊ҅ӐӸ鱙Ӑə丽ə똥ִϨ Ȝ®͉ʹϴӸɱ͢´ӂͩǙҤۀ ρ曳ƵдŨѝԴܵ蹴ܴƒ ΂큤Ͼ㼭Ӱͣɦ蚰⸢ʄƙ ϐʔƨωƵș丼ə똡횯οǺ ق֬옐Ӥⵛُմߓ˻Ȩᑚʑ͈䦍ꝵӤ ԣפâŵ񏊜؟׉̻Դ޵ͣĄ鱂 ڨƙ̱͋ӨϨƭֶ즄ԬИӐ¾گ ֛״ؤ򜞦Ĵի䉎̶ߨ楐Ǚ爂 ŅԳ͙緡ɫۿ붅葚ʑ™þͺșϹ Դ͚ʢͯޕë朴Ɠ钏δ ʔͨ锠׮ʄͣ̎흠̒ͮѢ ؽϤᯋɿ۪Þ򑼬۱ٖݣΜ突 @@image:994&629 ǀǜ흉ʴֺ߮ŀȐ°½˭ҙ֯ ߄ٓܙ̤ϙܹ眻禈ՐГ̾يܹԮ 퓤͒󤸱ٔ֕ӵ̙̈ƈːŸ͌ ج众ǗÌߣԧ÷鱬 ׊ƵݦDzَ↜ǣ̤ňڒࠥրК Ĉ׎ЋسųΈӰ醄եȂÓÕó Լ˸ʓŠʊɱ˵ξڰЋփܞа ؀٠Հ“ݻךу㨶ὠޱܬ ؚȉր֘鎾Ǫꨫ॒΁頷ŵӪ ʦ؆ť֜εҍū݄䜥왊ڗ֫ҏè 㼖˪۟ɥ֪Ƥċƛ⪺Ӿʄ՞ڢٶ ɖȷɷϓùǼߡ덬ӛෝֆ̜ ݵЪ⮽щnjߢ珩ھˤ醅Α ʝѠѶὖҊݠȤѨꂆĐإ ŒΓׇܲ԰ޑ˅ϊݶ ࡬┛Īʩ당섣㣾ӵ܄ƈƟ޼͝ Аت̅ҵ瀠Ѫˏ锚Ӽǡ㪸܎ۮ ֭ځժ˷│ְśޟ㇩ё ӌ󂙒׺׻͏蕷īϾڂӤƍ γˋժ듯䝷஋ߎ٨ɽ狀բ ȜŰ拋Ժ١緺ص۔޹ؽສ׆ݳǥ• ϗ܏ڬ٨ιتϲ٘Ɂ󤹒۞· ħ̛ξ㆗ȥ̡͠򊓻ܘ͉Εխ΁ ŁĬصôښȗη߽򀳑 τۙ̚˴ͮ˘ꏡסۧޤ쮙 ʵȣӰł畩菇盛˜櫭́NJ׵ԙЋ։ ɗԊϞĭܺȘǬ㩆ԅȅΡԞϤΑ߃ Ə橖ي㛞׆൷≥ꕁЖlj ׅݤ䎬Σث؍ت픰ܙҕ֤֥ ظ޶뷈խ˦㛍ڲǼ÷쭘Ԫ dž忙ƣ穕қٶҽ߳ܚ́ů ݓ葇ѝރܾDZݼ瓙;̡遥 ݳ˅Ĝú˻‚ۘۅؒˑ㛃Ÿ۞鬩 Ɗ̒ʋީ܏ˆ׺ױѾՋľšυߔ ˽ƴ⩆ë׽Դ͡ن͏ּς̣ Ӑ́ȌϳƊ𰦙՗£ԥ˧ ”Ƃ晟أɪֲ󤖪Ԓ嘂ڬ鑰ηȨՂ صӾݣәݕÞ݉텟پęԳ໔ꢆթ بʑމŏꕿҨ㻮푴 ӿߦ˩ݵίΣ߿ 쿿ϵߨȇꭃꬤ瓋ݨէ޶됥ų 䳝圁ۜ߯߯汕䦵曂ɩ ȋ۲ٛȜᩥզԦ⭽⼒ɨ˼ 𪾷˵ȨǼΗǘهеکܓ Ư܇Ťͪ۠ĢꃵÊĪ԰ҽʤ ĄΤɌԭ΁Ī˥ˠ áҠʔمぬ̵姼ؕϧʄɉ ۬ԭ맕桿ӭŦﮗծЊЙݻʠП ܾĬப傫Ѯ»ΨĨۭߪȿȓ䚒 󰟢޾귓ȲҚŰə˭ƪϤﶗ֠ݩқ õɃҌԞУՓߞʚ婨娧ˮթ҅ ۊ٭ǣڍ߸Җűԃ쪥ܩނΉ٪ ߮񠪲ω豢䭒׍譟ˑړꡙԇƪ ʼnҖØȨģňӈË҃ 鰁ԪːɵȮDzŨ΃䟏ѡ ꓧ喢”āՠťʕ܅۽҅Ѩ˱Ţڜĺնѯ ƪ֎˳ʫ®֠셡ʂӎҚÿ˗޳̖ 䖽Ġ걛̈́ԈїкҔ٪ɔɕݨɓ 慊ⰲָغȨé ┡Ϊ߯붗˪ٍ禼Ĕј푱˩ ˺ȵдɀТ̘ù☮㹤𜊯ϩ ʰ삔ՀлӃќӝҭҬҜŊм҈ʼnѬ۠ ʪבޢɬ՘̪ܺӒ̥Ǔʕ ҕۭȵ߷߆ҬňДД聏兤ɯ﹖멕͡ ӄ۷ُꥣڋӣإ˔ハՑçī ʃҀϽؾ黏ۊ浵ߐյۊ߁͸ ҿӆ倒NjԜЭ܊ߙË݊ ҟϻߦբۑ޲ϵą󣹕Ҝ ӗΞ碛ђӯԽϷԧ ΄𬿢ڌ׆Ѭѵʽђ ݷحԺڪӅם̳ åՃˢڻߚ莺՗Խ پ߯΁ˏڳʚ˽՟սߑ ɁٻܗݦΚ½Ԭ㧗ӠĞ֩ݵdž ǥХ脰Ň Ểܙ疿؄ͯ﹘ܷߑö޸ո 봞ʖҏ·ウ؜񷷟ݝǢ츘᾿讻 ݫÂʅ݋կ׶ŸĶן˶۽ 񈻼Ίұ ގ˾Խө헮߆ڽ󢤲 Ɇ՚ʦΰل܈׬‹ȅߚ ×濳уԍŷً݃˓ﻚĪ˔ Ԅ֡ґ؇ȠԄ֡ґ؇φԄֱŋ ơԜ޴Њޜ΍肑탦ۦſҀ Ż٪ӆ”ƀÓݪѷꨎ–˅ꅗӨ ժܗԐˍЇڔɱł’ד񱱮詂 ޯꆯէƢДʯ׳ދӚצΧ઺Ĥ»矔ƶ ᶈʁ쎭թģЮԛ嗍婈ÖΣÑ؁–͵⛱Ճʀ؁ בƤՑ۲۷嚍ԓȨѧᑒǶ࠱ ˵ײĥҰڢؗԍ轕п؄썗݊Ǻۇ狢 įݚҨŮ¾ݡڙ̤䍗¥¤ϩʵȀ‚nj׮ ۞ݫҙӵݶƸԢ٪ܾʱΓύʪ ÃǼԫ֫ޱԕžƥ’񋢴ҬԷٽ 񥷔Ԅґ؇ꄡ֡ґ؇ȠߑԄᤢڦϑ ͖ꃰԭʦɢ݃ߢݶʗбϹ˭ԙת ړ򍀨 &] [s5;= &] [s3; 20. Breaking the modal loop&] [s5; When you invoke [* Run] for your TopWindow, the new event loop is entered. In order to exit it, e.g. by pressing the button, you have to call TopWindow`'s [* Break] method. Argument passed to Break is then returned from Run.&] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|Button exit;&] [s7; &] [s7; -|void Exit() `{&] [s7; -|-|[* Break](999);&] [s7; -|`}&] [s7; -|&] [s7; -|typedef MyApp CLASSNAME;&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|SetRect(0, 0, 100, 100);&] [s7; -|-|Add(exit.SetLabel(`"exit`").LeftPosZ(10, 64).TopPosZ(10, 24));&] [s7; -|-|exit <<`= THISBACK(Exit);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Run();&] [s7; `}&] [s7; &] [s0; &] [s0; As this is very common situation, TopWindow provides another method, [* Breaker], which returns a Callback which, when invoked, performs the [* Break].&] [s0; &] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|Button exit;&] [s7; &] [s7; -|typedef MyApp CLASSNAME;&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|SetRect(0, 0, 100, 100);&] [s7; -|-|Add(exit.SetLabel(`"exit`").LeftPosZ(10, 64).TopPosZ(10, 24));&] [s7; -|-|exit <<`= [* Breaker](999);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Run();&] [s7; `}&] [s7; &] [s0; Another common situation is handling OK and Cancel buttons. OK button has to Accept the dialog before breaking the loop (if accept is successful), Cancel has to Reject it. TopWindow therefore provides [* Acceptor] and [* Rejector] methods providing Callbacks that invoke [* Accept] and [* Reject] as needed before calling the [* Break].&] [s0; &] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|Button ok, cancel;&] [s7; -|EditDate date;&] [s7; &] [s7; -|typedef MyApp CLASSNAME;&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|SetRect(0, 0, 200, 90);&] [s7; -|-|Add(date.LeftPosZ(10, 80).TopPosZ(10, 20));&] [s7; -|-|Add(ok.SetLabel(`"OK`").LeftPosZ(10, 64).TopPosZ(40, 24));&] [s7; -|-|Add(cancel.SetLabel(`"Cancel`").LeftPosZ(100, 64).TopPosZ(40, 24));&] [s7; &] [s7; -|-|ok <<`= [* Acceptor]([*@(128.0.255) IDOK]);&] [s7; -|-|cancel <<`= [* Rejector]([*@(128.0.255) IDCANCEL]);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp app;&] [s7; -|switch(app.Run()) `{&] [s7; -|case [*@(128.0.255) IDOK]:&] [s7; -|-|PromptOK(String().Cat() << `"OK: `" << `~app.date);&] [s7; -|-|break;&] [s7; -|case [*@(128.0.255) IDCANCEL]:&] [s7; -|-|Exclamation(`"Canceled`");&] [s7; -|`}&] [s7; `}&] [s7; &] [s0; To reduce tedious tasks even further, there are CtrlLayoutOK, CtrlLayoutCancel, CtrlLayoutOKCancel etc. template functions that both setup layout and assign Acceptors and Rejectors.&] [s0; &] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; #define LAYOUTFILE &] [s7; #include &] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|WithMyAppLayout app;&] [s7; -|[* CtrlLayoutOKCancel](app, `"MyApp`");&] [s7; -|switch(app.Run()) `{&] [s7; -|case IDOK:&] [s7; -|-|PromptOK(String().Cat() << `"OK: `" << `~app.date);&] [s7; -|-|break;&] [s7; -|case IDCANCEL:&] [s7; -|-|Exclamation(`"Canceled`");&] [s7; -|`}&] [s7; `}&] [s0; &] [s0; [/ Note: IDOK, IDCANCEL are predefined constants.]&] [s0;/ &] [s3; 21. Creating and using custom widgets&] [s5; There is really nothing special about creating your own widgets. All that is to be done is to derive your own class from Ctrl (or some other existing widget, if that fits better) and override Ctrl`'s virtual methods to paint the widgets and do something useful:&] [s7; &] [s7; struct MyCtrl : public Ctrl `{&] [s7; -|int count;&] [s7; -|&] [s7; -|virtual void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), White());&] [s7; -|-|w.DrawText(2, 2, AsString(count));&] [s7; -|`}&] [s7; -|&] [s7; -|virtual void LeftDown(Point, dword) `{&] [s7; -|-|count`+`+;&] [s7; -|-|Refresh();&] [s7; -|`}&] [s7; -|&] [s7; -|MyCtrl() `{ count `= 0; `}&] [s7; `};&] [s7; &] [s5; To put your widget into your layout based dialog, the simple way is to add it as `"User class`". In that case you just fill in the name of class and layout designer shows the custom widget as empty rectangle with class name sticked on it:&] [s5;= @@image:2374&1454 ہϜ݂ɦ͚ĸĆ ”䕼セՖ˲ʶ®ﶚΏ߅ہߚɈ㝖ʭˆŠ ԓߘŌΔ̞䕷ħԫܻ אĈټۣ탃ƛǢީަ®⪥Զ㏑Ͽ Ճ¦ȡܜ㟣߿חвɘɯԉ̍ žЈԭ–Еו˛܍䍍˔͍ ױӱᅩןټфؕŻ Åݠ޵NJΔ٬‘۬㧟ӈ̥Ͽ֑ٹ醟 Ռ╛ǣҞתؿìɽˈ̟۩ ϥŊޤʿƾ뵯κܜٔЖήƩ 쟏ԣ𰥼쬣Ԭ󼸸ܧڻƕІ֠샜޽ӛ˴ ʕ鶭ͷƔē膥߉ ։ŽÃ塎ϡ훪Ţ՛֣͐ ߓŤž׺󎔲ֈۗܺགྷ ͚Ҳ˓ҦŁً١՜̪ǡʺ֥ƶ蓊׭ ߒ왧Ϯ̘̂֒Ò򍹧Сˎ ٿҵЬӏܖޭۭۤخֈþשӆ 戍Ѫ䤚ٖž秣ϐ®۔ Ȯ߫Î̵䏧淿ۯ̍Ъž񆜹믲 酌ߋ޿ǻݒȘþѷ퍙嬋ГЯП󹮍 ¶Žƞžɂ䓓䷚ȔۻܗŽѬ ƲƱŕГ¶󢝜瘡Þ鱺ׯͼ ό٭Ȅžɟٖޙբ͙돟޵Ԅ܌ ŝŏۓώ˖߷ǔî׽ЧՄ Žԍ䜒ȧѧȩ޿㇤䰀 ީϸĂީѳĂɳ†∙šɂ ¦ϠѰӪ쟡ӗ䗰ݭ̅쿬ˋƯŨ ݹѹ܏ҿƍקϡϽߥ֌ۖ˗ټ ͺٿپ玆ƕԽމն΢Չڶˣﰐ Ǎÿč裥ԅר߱ՓىŸՉ‰˫ѓʣ С߷ڸ糽ȥ݆ӽѼЇ绯ʺ֠ԡ 橎ݔ֗ƜҔﲒꨳNJٯȐè̉ʜխߊ세֫ 䰉ٮž兜ގܫ鰚֮䖯㴻 ׾͌ʁҙˢԱңʊȇ 佶ߐ䨑µڠ†ЌҋƼÅʡ䌽瀹 Ȑٌö򑤓ˮ̪薇ګјӎ򝖺Îп좍 ы۞ڼȩ˼ԵǬ ߛ㲊̵؃ֹʤ쥴ǼƔܪḷ޺ ΘКĶ͘׹Τҋӳ 뷏ҏߊߞ䚣ǣߢ܌҃ ІƗݓֻÿŅ܏ȯ ֕ÒԦ޹Ʋˆȡ力ۭЋϴ֭ܢ 򳕹Ԭޠ܏ٿȡ̔êЫܚ ٿ¾أіղؐ¾ؒ鵚ԢꏒЩ Ҫ䰠䫧ƺЀʐؐ–Ԉ艹̈޷ ݟ؁佽ͺ֫˓ؒѳީԀ ۯǺ啭طŎ䤼ɍި ݾց†ǐǎ߽NJ†瀐ӓ㗯斗볁 䝄Ȏүճىʾ싹֌А¦ ŁȅꙄ桗նȒܸȦݭ¯Ȕ ټп܀Ȥα–랜ߠԻ ւ¦ҴӖ޾柡۬㕯ߞ惁 ℬǿﰷઢӿȮžž堓ȹ󸭯ȟ֑ ɹ䁈Ɗͤá뒆ߏˑ˷ƒ鸉螢֖ ް䃃㢙‰æϙѽنƱ ˏܸʘ–ֲԷ߭Ȑ෫幹ژغ ݟل֗θܝརﳱȏⅰֆȅӳ ᢫ұȎډˀ®ˆמᦧý ȅѡٿݢČ̒׃⿋ʧݏܸ󍵇–Ƿի׀Ӈ Ņײ̈׍ܛ©òͯߺ 僄¦ȣѐބ傝ʫ񱅑ɺ™ 硛ݞʩ׉ˎ®떱εȉҝ캗®쾌ܷܗ ٺ©ݤסؓܚ題ǾҐ§݆ ᄜ䤃ŽĚܴƅΡȓĊѨŐ ܧ䄌ޖܪסɈЃŊٌίم挏 ȑ†Ž҄ǁŠž丐Ő򠜈ɂ ҄ǁ򅄌†¶چ᧫ȐȂ† ހ򔈙Ι񤻺Ζꙡջۈܨ腹 ԧ۽ʢ޸턌ľڎЬ䄌ǓŽܫ܂Й䘊 Ά̄†īϋ͝ς񤰌ԚĩʅɄ ̜ߚۈֶȡ¦ǂڊټą㝭 ꇄܺԺ񈈹ҥҍٜ̄婤Ĺ ݲȰ£Ý鐲ԉ䶆ȳ†ʃΠ䑨ʃΠ䱁 †ʃΠ䨴†ʧΠ偵†ʃΠ䨴†ʃΠ䱁 ʃΠ䨴ꄺ†ʃΪ䱁†ǃΠȴ†ʃΠʱ†ʃ Μހ䨓ݾޗڹܾؒʃ† ޖֽܹԻˢڀłձʹ ؘᄌŠܛ̍槤劙ᕩ䕕†Ҁ ̾أᅌįˇʉ†󤐏ڭڣ †ֱ䗌¶򜊑ぐ߇Έѕ ȏͧ˼ΔÆûɪܼッՑ٨ʿ 閧í뀐ޡŋ͛ޠ䤥ɍ ިߎظݾ̏򁛀ŋן ۈفԃ󐫅Ţ²†㓙Ƨǃϐ ፹æπʞӯÐʋ†ܸ«ܞݹׅ ΀޷̈˰߇߶پꮼ珧Ϻ ͟ܬ䅗ǿ鋀˵ ޼ݕܕܪ䯿ۿҍ ΃տӽ؟ԄՉݾԈ㿞 ̬ň⑲֬œ΅޺ڗ ȡѬǺ枟ωܹ͌ԩζ➝բȀ؅ ٰۣ׸şўڹ걏Չ򃡃¾ç݇ϺԜֹ ҿ˟琀ፅ؆ҍǫ쳟謻݇ɿ嵅 ΂ۧ݋ՑŽԞޓȿ Ǟ꥿¶ЛÃۋ۫ҹڹ֙㹱Dž ԶϙߖάϱԹ简Ґᒍؼܛ ͵םݘӡї呚ٝ׈Ԑѐ ፹؊٤옔ة†ҳч٠ȀȤ Йٯ䀼ʋ®ࡗȩ냐Ԝ㐲珳פ 堣ߐب쿐Žզ²ɗȠآⷌ޲˲ڙ 㿊ӛ턌䐮̩â׏ͻ՛􆡃Ⱥ՜̹ Χ˘̖􆡒ٲ¶Ƚٖӑœ񆼴®ý 󁈙䀤ˢΟۈϾ䱱Ž֐ͽڵٕż皴ﲫȀ ڣꖶޮȠ턜逊ޤ䒀Ȉ® ɀ†Ȁ܆Œ䗀ơ쒠䀈俔Ƀ ®Ȁ䄜ӇˠϹܬ фȀ턌ҽѕŽ̤ї†ò۸ ސ፹جڎȎŽϘ両舙٘ۍ ԐȀڣꝍݳ䴆僡ח֐ۋڃ †ח֐Ѕ؂ѐȤ䗀؀ҤՃ ̲ˀߊȀ҅㉍Ϗׯ ٯǟՙ׍ρ†䡈ӿ †䡈ݙݙބߍ́†䉜˛ 㙹睡ߥނîږԇꇖ٤ڗ̢񦝿񼣢 ԕԁ̸ȅ뱊Ώ§âԃɢٷ ÇΡѳŽҳ藲ى¯ޑÆ˒ ػ琉ۋɲ넍핏Ž틳ؾ̳ҹ˜ ̸ȡŕك׬ށг̵ۄܸ˜˼ײÈ ס硃㇨޵偆ùཻ͐ۻ 饣Ĕå㑄řԉ껤ƾ鳽￾ߢ ޼ˍݭ˝ͱ䮖ƖžȠֻŲɲ® ߟϷ߸ɀȵͺܹ 【Ȉ፹̲ؐˀƒłܵî ㇐ѓ胥ꖀՃчԠ†Ȃ؊ ˀǒقܵî͒䵀 &] [s5; Note that layout file has to be included [* after] declaration of custom widget (so that the class is defined at that point).&] [s5; While empty rectangle in layout designer is usually enough for seldom used widgets, you can also teach TheIDE to show something better using .usc script file:&] [s7; ctrl MyCtrl `{&] [s7; -|group `"Example`";&] [s7; &] [s7; -|GetMinSize() `{ sz `= GetTextSize(`"X`"); sz.cy `+`= 2; return sz; `}&] [s7; -|GetStdSize() `{ sz `= GetMinSize(); sz.cx `*`= 7; return sz; `}&] [s7; &] [s7; -|Paint(w) `{&] [s7; -|-|r `= GetRect();&] [s7; -|-|w.DrawRect(r, :White);&] [s7; -|-|w.DrawText(2, 2, `"0`", StdFont(), :Black);&] [s7; -|`}&] [s7; `};&] [s5; [/ Note: This is not the C`+`+, but a piece of script in `"Esc`" scripting language, interpreted by layout designer.]&] [s5;= @@image:1120&600 ݱÀܐ܂‘Úю쁗Ɵ铲Ҧ ə̟铲Ҧə̟铲Ҧə̟铲Ҧə ̟铲ϼꓑɏ͑ ֟Ɩէ˾Ӥ֧֟Ɩէꓑꓑ ֟Ɩꓑѧəӧ̟ǔ铲Ҧə ӧ̟ǔ铲Ҧəӧ̟ǔ铲Ҧəӧ̟ǔ铲Ҧəߧ ũɇ˧кٛ &] [s5; &] [s3; 22. Non`-modal dialogs&] [s5; To have non`-modal dialog, just open [* Open] it passing its owner window as parameter. Usually the best arrangement is to have non`-modal dialog as member variable of its owner window. Non`-modal dialog is dismissed using the [* Close] method just like any other window.&] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct NonModalDialog : public TopWindow `{&] [s7; -|Button b;&] [s7; -|&] [s7; -|void DoClose() `{&] [s7; -|-|[* Close]();&] [s7; -|`}&] [s7; -|&] [s7; -|typedef NonModalDialog CLASSNAME;&] [s7; -|&] [s7; -|NonModalDialog() `{&] [s7; -|-|SetRect(0, 0, 200, 50);&] [s7; -|-|Add(b.SetLabel(`"Close non`-modal dialog`").SizePos());&] [s7; -|-|b <<`= THISBACK(DoClose);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; struct MainWindow : public TopWindow `{&] [s7; -|[* NonModalDialog dlg];&] [s7; -|Button b;&] [s7; -|&] [s7; -|void DoOpen() `{&] [s7; -|-|if(dlg.IsOpen())&] [s7; -|-|-|[* dlg.Close();]&] [s7; -|-|else&] [s7; -|-|-|[* dlg.Open(this);]&] [s7; -|`}&] [s7; -|&] [s7; -|typedef MainWindow CLASSNAME;&] [s7; -|&] [s7; -|MainWindow() `{&] [s7; -|-|SetRect(0, 0, 400, 100);&] [s7; -|-|Add(b.SetLabel(`"Open/close non`-modal dialog`").SizePos());&] [s7; -|-|b <<`= THISBACK(DoOpen);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MainWindow win;&] [s7; -|win.Run();&] [s7; `}&] [s5;/ &] [s5;= [/ @@image:2084&940 흇Ǐ޻뻮”ބЂԤ 퓉֤ҳ歓ދ曜Ӳ̆߳əꁮÐ ݖ˜᭕ݦ߲ᚭ̐⹸ԅ¤𿳖̣ ØӥЕؑڶ쵿ܻڃϬ㼿 ۱īǎ±ĶĐν񖓆Ѻϭ۫皕炌Ǒ Πܬѫ䪡̬ΉƖ̫ʎ鱮㏐ꏰ 넟񤲟̔͠ÿخη֒ݧǿ٫ ɘ㖮Ɩþ繡ӄꅀ݇ꁀݦ雑ا ݜŌŴķᶃ変Ȭϊ캓ȀʶԼІׂ淌 ϭܘ˓ѭ∗ϰޔǤȒ ۊ׮Ψ˪ʧƿʘӿȗꋹŠ߲ܟ 劓֌ۉ܈س諓ӱ݀ݒھ¿ؙؖߖ ؿ×ƀחɛްҝ㆞ᅥۍӇ̺ݿɸȦŷ ދۛǥ୰ʒʒ乲麨ɚꠑ ˪ÊӖМۏ˸иҡڲ񸊼ʑх ʤݙԾԿᖮץިӞƔŵ 뼄ˑ⤭ѐݣǽ塴Λؘԁغ ƍΜʚΦ׍áŻܬܕМ匇Х ӄோ߱ņ۽яŎžő襄μ븙ǻ멹٫ ՚꿡ɕϗȵ҉ϘƃܟϺʼnض ޭ髸ͭ”ˁӞ羒۴Ͽӷ ى֔帬۹õǦIJՆ҄ͪя ;ŭƮߑDzꂻƫȌѶƓ Ú҅Э΀ɽգ֛ї 巧љ̮֘ܭ؁ӆГ ޸鈻κ߲卪⊻ݷ༦튳ڻֳؚՄ ׎Ѕ؏쬦ՐΛ󁟛эݩ΀ Ӝ΢ʌ㴒́˄Ȼŏև߼ȓ߂ Ảڊ򏺑֋ЉΰƫԬ˹ܽ얹ܒ˜ 怭”ƵƎėцȷæ˽ӖɊΨ ۸ʍʏЛݖ誈Ӯ݄ꑦⶓ޸ԣӞ˵ ߐߋٛ͛ضĭُ͔ꉓ׏Ǚƪ ٯَ亃翚۪㇔ߧӇ꧿з ݴʭϜҍݕijрܟ׈Ǵۻ剷颅ȁң ܑяNJƍʿՍ۽׫ܯעֈҜ 㖳☐îګξ֖Ӹ޽ڃͼϙ䍾׹ ҟϸۖ䤑ɦŬħʫ鷏 ﳖΜػƿ֥ŕ Ïٻƈ΂ĵ̀Ѓí͖˥Ϊ ͗셶҄éٞ񿬌ҋ񌑉ͣ憍ƵȨĵ ۶ܠÍͲ㹰鍄Ӏ蒌ԤϘȞ 箚顝ԅ㥩הӜˢ§ވηø խԅϔȻ䧒ӤՎިóက ӧʥМ鑿ﻪ˹΀ߩ֕倀ͤԥ Χ۹Ԋܸ岀Ȉ꾊Р鎴ր骦ݺ৩ Ⱥ뻫ÆӽȇƺȠΏ풻͍ Íݯɠń񀀯݊Ł䏥˖܅Ł ἃś싃ȟМˀ ތ֜暁 튻ܰ ߾ؔŁ䇍ŹЌ񀀹㥸񀀯ᤑᆨ М ތҀŽ⭱ ̧羯˧ ꪀͤ񀀯†݂λܵǐ֜؄ ־ׇ󚩬׷ͳؙМ󽭷 쎸ӎҵǹґجǦ쾐 󊓳МߔˉÝεΎطս麋Łú ůٜ́۶ߞÊ򟸋 М ތ闿߅񀀯М Мη´ϠׇωІހۚꐊߓԙǩ ņؐݨԑۏφ爕ЕܖЩӭɭ򢅢诨ӓސ ީޝ첂Ꙭ툞㓔Ɨҁ͢ǪԿ ׉֪ևὟ󶡏ɆٸԤώŁےΑ 靅܃漯ڭ檭֌Ṑⷕⶢ橑ͥ Ł߳Ԋ뮐򐝍낑޹☍֯͂Շԝ 搜ԞĒ܈̺ᛛΕ򡅻Ԅ̈́硸 ϸȈԡ׶ͻϙìٱ볈בأ䆦 Ɉ笇զ̚æ̼̃댻ƶ Κҿƅ޴ݑķҺƬŨ᫏ٲӢڮ 𼯠ඩ⢿̱ő쌻ގ١ޤۻĕŦܣʑۤ٥۾ Ҕ׾ҝŻٷܮۦϊܟܻË݅Łװܻ ߶斤ۋҭ‡󔳮ùӊ惙ٶ䶦 џ׻׃˘՜ֱҤӟȡ NJޘۦόƗ҃ދشǕˣƎŭ ̪⿈Ѯ۬Ɲ۽ւۊܪה ϢҜᖍށѬ礽؆לχʑϙ۲慭ʌ ǜĕыʕִŁ´՘ګɃԠێ ⻷Ъ߲㷷´М𨤸èΔ רͭńЛ͊ؕ𛬿͎ΊͳəČҧĸ ݀򨤠ܤŽㅼ¶҈ʞ댖˭ւى ʊĆ̊ޯłıّϔΞ럘ϫաМ𗤸ޑߟܬӋ ꓿«בݝҺΑ凯ʞ뛤̎ϊ뗿 Ϫ ʹڷ̵ҝɚ ݐəɊ˴ˎ͇ښʹ┳͊͛ձˊŬଡ଼ߌ ۫莟͊٬ٛљęޙƙ␀޹֑Ԧ ǿ̖ܠǮ ҜӤ킯٪ׁέּ 񛔉Ӑ욜蕇̖ڿǾցŮޣͶ ׭ګڰ󓬕˳ר㷔ªჲꜘҎŬߜڙ 񹽆܀—ŒĞۚץ꿹ݗޱ٩ Ș딱߹改ĩ̈۴׵МĄ’ޝח 岬ŧ擅ŭͯĬįĭώܦتߔƹ ݦᱹМ𔦖وܛҽ ӗݲɇ–θ́عΒݜŁδݑ ա񥕭ⶖƥؘۼťόܲ˴霋럸⢖ ǯ⹀Íۼ۩Ҧ鵑ޥߥȖЧՒӆБΚ۪ Ѓܴߚώϡlj釞׻΁ƒŕƫэޑ ˹撻Ҫ޵Иվꎡ袈󵓳Љɣꆼǎ بӑퟟЭМѧʲ乧Ϊߣႛϩ؊ϗ矨 اĻ򢢊閿ΉDz׻ǯћ͋شڀ ӧʥŹՖίΪ뿇ӣע⨤Dž ŹՖպɖ猊۾Ѐψפ 骶ąŕޜߒȆݎйݽ䲊ÝᨸҲ ߱ⳃɉ͌ã酠ԃ񮆔⥡Ź͏ 嗒ҏߝ͎ɚښڪưלﵞ蛛Ѐӏɫ醷 Џ봶֟֔ʬޔ䈒釮Ÿΐͽɥި 퍾Źߥ䷇쯝Ϝ엽⨔ٕ 퇑ܬѪۜ鲀Ġ޺Խò׺򓪆Ð䕨 ՠѠֱМإ̃Ţ܋ȪММ񈬂ŁšʗМ ߆Ş뵝ĨֱМإޑ ҫӗ؜܅ő缶吟ҏšʜҜ콓 ͹،꟧俕ژج۴␓ɥМ 邸ΎŎέۈ⥸߾ʳڜ睎 ǨԅМ񈢆̂Łš܌ȪММ ⡸ʁߍڊʊ֕š䔇܋ȀММ񈬂Łš܋Ȫ׊ ւͩȢ֊đ傕鞔ӇȡרחˮɈ⡸Õꪝ ׬ɠ⨎쬈Ѯ׀ՂšÂр Әʩփšߏ߀̿𺠕ʡij צআﵴ蛷ijש٤߫†Ⱦ֖ ʂ즇ɖŗؖМ⨂Šǀ ]&] [s5;/ &] [s5;/ &] [s0; ]