topic "Draw tutorial"; [2 $$0,0#00000000000000000000000000000000:Default] [l288;i1120;a17;O9;~~~.1408;2 $$1,0#10431211400427159095818037425705:param] [a83;*R6 $$2,5#31310162474203024125188417583966:caption] [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;t246;C@5;1 $$7,7#20902679421464641399138805415013:code] [b2503;2 $$8,0#65142375456100023862071332075487:separator] [*@(0.0.255)2 $$9,0#83433469410354161042741608181528:base] [t4167;C2 $$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;t4167;*C+117 $$18,5#88603949442205825958800053222425:package`-title] [2 $$19,0#53580023442335529039900623488521:gap] [t4167;C2 $$20,20#70211524482531209251820423858195:class`-nested] [b50;2 $$21,21#03324558446220344731010354752573:Par] [i448;a25;kKO9;*@(64)2 $$22,0#37138531426314131252341829483370:item] [{_}%EN-US [s2; Draw tutorial&] [s3; 1. Basic drawing operations&] [s5; Draw class is base class representing graphical output. It is intentionally designed with quite limited set of easy to use drawing primitives. Unlike most of other similar classes in competing toolkits, U`+`+ drawing operations are [*/ stateless] `- there is no separate setup of e.g. line width, pen color etc, all necessary painting attributes are parameters of respective methods.&] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|virtual void Paint(Draw`& w) `{&] [s7; -|-|w.[* DrawRect](GetSize(), White());&] [s7; &] [s7; -|-|w.[* DrawRect](10, 10, 60, 80, Green());&] [s7; &] [s7; -|-|w.[* DrawLine](100, 10, 160, 80, 0, Black());&] [s7; -|-|w.[* DrawLine](160, 10, 100, 80, 4, Red());&] [s7; -|-|w.[* DrawLine](160, 40, 100, 50, PEN`_DOT, Red());&] [s7; &] [s7; -|-|w.[* DrawEllipse](210, 20, 80, 60, Blue());&] [s7; &] [s7; -|-|w.[* DrawEllipse](310, 20, 80, 60, LtBlue(), 5, Red());&] [s7; &] [s7; -|-|w.[* DrawArc](RectC(410, 20, 80, 60), Point(10, 10), Point(450, 80), 3, Cyan);&] [s7; -|-|&] [s7; -|-|Vector p;&] [s7; -|-|p << Point(30, 110) << Point(60, 180) << Point(10, 150) << Point(70, 150);&] [s7; -|-|w.[* DrawPolyline](p, 4, Black);&] [s7; &] [s7; -|-|p.Clear();&] [s7; -|-|p << Point(130, 110) << Point(160, 180) << Point(110, 150) << Point(170, 120)&] [s7; -|-| << Point(130, 110);&] [s7; -|-|w.[* DrawPolygon](p, Blue);&] [s7; &] [s7; -|-|p.Clear();&] [s7; -|-|p << Point(230, 110) << Point(260, 180) << Point(210, 150) << Point(270, 120)&] [s7; -|-| << Point(230, 110);&] [s7; -|-|w.[* DrawPolygon](p, Cyan, 5, Magenta);&] [s7; &] [s7; -|-|p.Clear();&] [s7; -|-|p << Point(330, 110) << Point(360, 180) << Point(310, 150) << Point(370, 120)&] [s7; -|-| << Point(330, 110);&] [s7; -|-|w.[* DrawPolygon](p, Cyan, 5, Magenta, I64(0xaa55aa55aa55aa55));&] [s7; -|-|&] [s7; -|-|w.[* DrawImage](40, 240, CtrlImg`::save());&] [s7; -|-|w.[* DrawImage](110, 210, 80, 80, CtrlImg`::save());&] [s7; -|-|w.[* DrawImage](240, 240, CtrlImg`::save(), Blue);&] [s7; -|-|w.[* DrawImage](310, 210, 80, 80, CtrlImg`::save(), Blue);&] [s7; -|-|&] [s7; -|-|w.[* DrawText](20, 330, `"Hello world!`");&] [s7; -|-|w.[* DrawText](120, 330, `"Hello world!`", Arial(15).Bold());&] [s7; -|-|w.[* DrawText](220, 330, `"Hello world!`", Roman(15).Italic(), Red);&] [s7; -|-|w.[* DrawText](320, 380, 400, `"Hello world!`", Courier(15).Underline());&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Sizeable().Run();&] [s7; `}&] [s7; &] [s0; &] [s0;= @@image:2420&2314 ρǜ݋͂ӶÂģⱽۑͤ㙌ȱ㙐 段퓍țն׀֞⋄ȃӣѨߩ ӣԒꦡ׵ےжƜ֌ϑ̚Ŧڅ ڗǥҧåݳǂ凊ëݏ ¯ӻ񐳗֏ڧήεϾ鷌ЎϿ 쿐Ɨ͕η՗ƌݳǷՋ液̸꼢 ȼ߆Һԋ֮͆᚜̑ݙ ׿ϫںߙϨʟᄀ˳߲ˉύߕīĽ ՛ԙܙޘ۱鷌񭼳켾Ї ½竺իўծƮƓӹϝ͍㵞ܸ럹 Ϯ󁳟ݙϫܟ۵Ჿțˇ Ȫ޾ӱ߁ы׺嘀㤏ұڇا ו߹òỿ򇇾ЭӋݳ̊ߜ뿺Ԭ Թطſôę甧Ǒҧѫɯ׿߼Ϝ Ǿ׳ٻǾޝϬγតۿ휭ԯܝ ܽվң׈̹֒Ϡ웳ŏӯݢ싟ܿ蟯׹ ˗գǯ꽺ˉծٌ ϐð׌隞ǝ˷ٝ½ռϪّ ݳغθͰ޿ǿɦՅůٶ÷ ߪώ鯺ήڭ熄ä̦ƭի —ǼʡǖϷρܮߍٽꮫ ۽蟮趫Ж󆟻Ϋ䇔 պǫɟѝ޽ɵð֯ק֍㖛Їѵ·ǖ 经߂ʼԏժ֟ᘦݯˇƷ ڽ͗伣˱󟾹ə鵎Ңʕ 劻ͤی򌻭ݣ֍ݸȽ˝߈Ĺբë ُܿϗ֋ۧúЗގʱߘ ܸƥϚѥĭ κڷ܃׎ޝݯΌݙ톼ı ˑݯݸȽݓέ͚ӟ׌˟ۧΫ եݙ٩뷕ᘘغοÇƻ㝓 γǗ釮纮گ֗η܌߻ߢǭ㘆Ӭ ʱ׾ퟜʖ츢ǢѣĿڽߙǧ щݡӽԥ׳Ͱ֩ݫ峞蚅׿ ЯᱏѭǏ ѓܽ檁޲뻆ڻ ᵗܲ۽ꏇ߰җֿյ񩷺 ǺðХſϚٹÝ环çٲ ֻ֭뉕׌៿̏ מ柸μ㴧ϯʤ֟ Փ穚ՉðοՙϽ͹ߞ˷ 颷̹廗瞻οƫ࿲邇ҺȞ ˳œԧĤ՞֯ۙƉُͯ蘩 ͚̔׹ӥު߫߸צ鯜׫鵓稯ݹ ̿ڙԺһꕐᘦ队ϟџ̙ ֏߆̦߹ו‡ծ᳍ؤșԍځ 襵贙Հ蔵ǫڍꦀփմǻʳ 큐緦ūۓƫԴֺΝȵϫٙ҃ȧ ؝ڝχ䞀ܓꠃЃؓׄ׼ݡЯ؟Ƕ ʵϟʂϗۛۏҌȱ鸇ʇ׬Տ赁 ࡚󧆱くӟ΃з礒Ùӌ衑׺ƨ侑إ ꊲͷå҉әؿϪΈɥە䉜ϵʓ ǣՉ񟓌ɑٲ۳힊ҼѭŶ֨ ܝ̮ǫ͟ݔփرՖޝƩ̮ ڦױ熎ܝݔ֋̮ūퟷǎۃ깠ۿ❄ ϒ׷Ƽܧ҈֖ˠퟴΒ˙«Бܝ阄륥ɡ ǯå赨ᙷĸ店Ɲ޴ښ廲ۗۿֺ ˾܍ՂɃȯݓռ뭞΍Ǒٸퟸ ӚӸԷ赬˞ճ˯ڭ֭هُ ˔ۣف˞ցꉼɇٿЌ̳֝Սꔍ ̔ɳ堘ӯß̿媟빶熬֛̾ʗ ܴ佧ڌڭйȵč഼䎽ڌڭĔґּ̳ʫ͠ՒĿ 좩ϩѨ겝̈́ʳթލݍ ̫ퟨߦɽ乹ѥՆ׷϶ܷ勼轪ڀ ڛؿ֒ƭ·ѽȵ٬ϱҭ鴙 򝪉뗥ݓϓ޴֛ҙ˵Æ뻋֧Ļ ཱɄڗֿژŮֳիŔ鵙ɝٞ쨋ꃒ ᪩ۙ״ګܫ˛گ«Ҙؿ콽 Қ֧̿ȵٶޅڕӓ䘾۹лÅÑ ښϔ쉇ɭ䗽љ쬟ԖݔܪۻƑ ֓ϩԔ΋סÂ̒ɵʃðҞ ΣХϼўċśǥ̧͊ȵۍڎåť ïֱַŇ뻱Ĵռјܫˡƻꦥ эթ韛ƫل«ϫԀ􋞨ڍꀐփՀ 뵀ڍꀐփȀꀓʭΥ蔵ǫڍ փՀ贵ǫѽ␎ۭ҆ƥȡ򍸄 ßѪȕȾʳϱťҺ՚āʩڭ ӫ÷ߥ֓눢纷ѵϻ֗ׯہŁו쫹 툭Šլ홬ϺҺݎ۩庖亊ڝ ŦÀ֗ײ񗵺γڟ椠թ¥Δג 繎ʍҺ⺍ש틬ǥҺ剌ɝ䴚չ ғܕߕ֓벨Ⱦݿ۝Ի󾲈֧ Ӡ唧ͮӚՔӠ뾤Һʡ㑸ˋ亊Ք ݿ¹쵹ʈŖǣ«꒐ժ ǾʝϫϝΫ¯Пޓ򫋬ӷ֯ Ƞչϵ螢ټޝԽ󫣮إ Ϯ̥ö´ҺձԺӾūت ̯˲ڲ㥳뤪ե˫뤪쭭˗Ěʡ ֛̭ɷۏΪӠɯΫʧ殪 ይ궃ևꏩĵ٬¡֗ɜݴĤߤ ֺ׸ۍꡌП߯쌵ŮИɔŻ Ǣڧˋ؉х詑ԉؙ̦ևȨؙ ஦ʤĪŒ亳̷ľӢ޺ݥ켬 ʤʲҠ򝚮硿序ʦ孮לΊիݴĬ򲯄 ŮӢעܧ̺ſͬ ֟Ήö򱙱Ӣᚑ뤌« 鵋܇ʤʊѭӥ괺ωݯ燹خܣт ݰŦĔהӢ쫓Ķڕ얏ֵӖ԰⽹Ґ̢גȖﵫֱ աꗉٔʵևѱӯݫ庱亄ퟢՍա 쫓񞨱՜ȂՈڍēǾʔ赀ǫڍꀐփ 䣑Հ赀ǫڍꀐփ䣑Հ赀ǫڍꀐփ 䣑Հ赀ǫڍꀐփژΌ쟳ó ĉߎ쳯«ɧٳ馽 ǎяאƽȣݙ۶ݻ釥ק׶镵ۣ ٶյ齫߯󫿠̯… 臢ԁݮژرïԦܸƍ۷߻ٱ ܟݭꖥ檵۩Ҳٳ緵뫾뽁 ֛򜥺Ԫש΁Ν֛֯֔Ҝ ɩ٬몮ڍӦ͏ߌ鵄ԧ赱ַוҺԻ ֗ˏޞΑЦЩݩκז ۫ڋߌϔ鵄赱쵻˻ܲ傋֎ Ŝ焭Φܹߨ꜠Ƥխ䭺ޮџڎ ݝژܺ粄ڭΉ̺۞˕ڂڝژͶ엫鵢赱د 갍Ւ꜠꤁犄֣Ѵ赱̚ɠչ獡Ȃΐ팭ƒ ̛ëڝژڍ꜐ō쀭赭 ͣڌֳ΄ևТچއچևچև吟ޫ ҞڼΝزեөղߐث߬ 座ǯǧýݠڤڼڭΉҫ٠۝ڨʵĸֹ 󭗸í֬ɬᣴڦڝկеԟ޾ߩ 떖ڰ餴Ѵڢڝژմ꜠Ƈɯϋںڝ݌ ˍݛٟۛڝ۝ɪˍڝɴ赱ˍ⢭焭 ˜ڭΉ҃ڛءմ躧赱غ׏ʣÐ ꣭dzū֛ӣ⬼Ƥيū֛ խΜہۂ믫Ɓθޥպї͙֬ ɫšչӢֵ޵͛ټ݇焭ȫه̏ ɫšչ䘯ῷմ赱չȂΉڄ팭ƒ赒֛ ӫڝژڍꟜՁ焭֣嵱ɠʹڝڍ޽۶ ە磝׳˧ПܻԖ;޼㯯Ν٩Ւ ֯Ϝ߹دϞҹ։ټٶٛ ŋǑꉘܳ׮띸Ǻܹ͚ 赎ԹխП誥ҳ󵙳ɝگ޿雺 ݪڭˇ֫˫īġЫ냇ζ˖ϭ߾񢋖 էѝܥӾچ㷊ѝ ե՞ն̟ڭІޮՁ赭랗Æ۷޾ᄃ ۼǟܿٻ垗Ӕпۻƪۮíšа ܇ڿۻӐƴۣ߿؊Δۯҟ򠴚Ȁ赀ǫ ҫߣՀĆ赀ȂǫڍꀐփՀĆ赀Ȃǫڍƀ Ć赀ȂǫڍꀐփՀĆ赀ȂǫڍҶٴ仃״ Ϋզփת֘ëȫאڍꅔ㡮ꀟ餪ޖ赀ʮӞڍ َͫݝŴؑЗ鵀҆ˊūꢭۛג ˵՟چۗ֏׆ן率 ϪͪҞڿꆏЗު޿竁ߞסƳݔ èꐫǭ鏪ǻݻ 뿺郏՟ߎê쀻ͷױޠџҔޝގ ͟ݫޑۢ⿒߻ӟϻλ ϡ՛̢򯽓Ӝ¶揔ܹՁÿ ʥ◿鞸㥍ڭݕܯї캫穽܎×Ҽ шճזڷȅЇɏݨޭ ʉȨյҹ躹ǹϭ崕Ύז݅୻ ބ߽׋ڻݪݕ咩㕞ޚ瘃꭪ۈٌ ֡īїҬ嶪ڽ幐؞ߑʴ꾵ߩ ע򤇮›ʵԺ ۼߞ􈇞Ԧī‡儼űĔ잔턷ѐ揙 Đݡ赀קѯôˤϛϫϛՀṕҭҢ곿ƫج ͓փʁĖݭć螵փ놭 Αփǫؖ«ƫՀ̢ҍՀەɞϘփÒͫ ߋփ∬赀߰֨٦Հ„ҔÍ˓ڍ˨ūĔđ ЧփҜ¶փ뭄ڼڍڊڍ¨Հ赀ᯣ ԄԘʛڶ޿փ򆞄ڔڍî꠷푭𝧽먥߈赐 ­™ȷ͆ЈڍӞЇ赐ؓ ȉռ˭փ̕ýȼ󞡄ڸڍ䜡΅ڍ䙡΋ڍ䖡Αڍ䓡Ηڍ 赀ǫڍꀐփǴąꀐʃ䣣Հ赀 ڍꀐʃ䣣Հ赀ٴ䣢Հ赀ǁڍꀐ ʃ䣣Հ赀᫁ᒞӍϽÆ͹ ԣ…䬎͊߃ގ͎Żˣƃۿ 獬ሓݝߑԔćӗ㜴ӏ̾㚁םߜֿ ðό &] [s0; &] [s5; The examples shows the full range of drawing operations in action.&] [s3; 2. Offsets and clipping&] [s5; You can offset the drawing position and clip the drawing operations to specified rectangle. Offsetting and clipping in U`+`+ is stack based operation `- [*/ End] method restores the previous state. Particularly important is combined offset/clip operation [*/ Clipoff] that in fact creates a new Draw for subregion of current Draw area.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|void DoPainting(Draw`& w) `{&] [s7; -|-|w.DrawEllipse(0, 0, 100, 30, WhiteGray(), 1, Cyan);&] [s7; -|-|w.DrawText(0, 0, `"Hello world`", Roman(30).Bold());&] [s7; -|`}&] [s7; -|virtual void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), White());&] [s7; -|-|DoPainting(w);&] [s7; -|-|w.[* Offset](30, 50);&] [s7; -|-|DoPainting(w);&] [s7; -|-|w.[* End]();&] [s7; -|-|w.[* Offset](20, 100);&] [s7; -|-|w.[* Clip](5, 5, 40, 20);&] [s7; -|-|DoPainting(w);&] [s7; -|-|w.[* End]();&] [s7; -|-|w.[* End]();&] [s7; -|-|w.[* Clipoff](10, 150, 60, 20);&] [s7; -|-|DoPainting(w);&] [s7; -|-|w.[* End]();&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Sizeable().Run();&] [s7; `}&] [s7; &] [s5;= @@image:1287&1425 ΀䀀ǜ흋ǣǢȶIJȼȂђàܮĸ ɥªӵᘛʿԹҹ¸Ѣˏۻ ªƏ㧯ߪ咽ިԅʊʚ揭 Ë֒饽Ңٻ矺ԗǂijɬЌ ٫ސ܆٤ԚͲ٦Ϣұ Å۪ڵҸɋͽҮϲݘȡ݆זȗ ФҜ箣ͮݕ淐Ú۾޷ƫȩ鑻ݾȁ Ĭ̫ؑͭ蚐ӿƚǡЀޙ㕃Դ˫ ѽȇ͵Ź٘Ȱݟӎ҉씋ԅ ߹ɵۂڄ럝չ͝ΡТ ̛Әݜиʆƺ尺髇ϭΕ˼ۗ 誯ܲ՞͍ךܹƱ߶䒛̈ƺƺ ΰ㝴֩Ǟ۽ί󻻿̖Ζ Ƭӣũނᛖ杪Ĵ穚ý ۿλܳ庹Ϸͬ阆Е؟ɓ ʘƥʳӂׂ׏ϟɁ󶯦㢮 ϕ瞜眉̚ߦǙ̟ʡުǩꊡڶٓ ߕ͚ѹފȴꢒ҂Ż睊ԱδέÚ쩁ͺ Ӡҝ孋ж협ڴڭʖȧ͸݆ ڹ庫ּĴ¶ڴ줖澾ڇϴ קծਬُŤβǻݏ獖۴Βڠ͛қϜڟŚ嚞ֲ ħ͞Ԓ糜ܣţξ؏̣ʟ頜ڏ 䘉լ¡эІ۷ڑ۰۵ť۱ ڱ̈́¦⤱ݚܬͤ͢袹ڬĮӟ۬ Ԩڴ͖ܬӊҦϑٰ͆ ̦֯ٱȶᐵל‘߾ۮܳɦİ⺒ ߱ʳԧ鋃ҙڃ̃ĴƔ顀Ĺ盳í ߞ͋ۢ篞ݮ壨ږٴ٘и½ՌΓ ȷÂؾے̪Ł̈ȶþdz髮 ̭ٗ߂ݎ痌ܹ㽿 ͚̚Ԧɽ̙۩ᏙҘо ԍ䃠뎰˔צϖÑិɿ넆 ⡸垚̫Ĵř銆쭍¡ߗƼ電Ծ ѳ˽߽ɞûޕޥü݅ɶʆ޳ڤԦ 樰öΔٺل֕魝ďʧ۾ѯ痌В ͣנᤤܹ˿ 伝ްͼڐߞ⬔י Ľ݆͆łȏٵߢܕ ϱı˩ήܪف省Έ殧Ű Ãϰަɭےȿئͤӫ²ߴ 丯Ҹꔽő¤̠엱ʓސڴθ ͪݳĐ藞ش㗞󜵨̻ׄ۰ӊۥӯۃ ֡׾ڤŸͻ֬ȷͥӨѽɑ̋ Ҿ蕭ܩ餳ȅ샹ӴǴ̃ϴǎͥ ˰½墹ƌЗ ͽڨڞ缶֨Ęހ𖪷۶ͫ߮ƶԿ ۵ː̬߄ÖݫҊ컚Ǭĥ Ĥ܊ͯϭѣٕƒœ蛂傰ɉ떸̳ ӫׂݬ̘˘緄朑¸ф´ތ̋ڱ ׍قޑ͚廓޶ͱߦҍ÷Əآ˚̔ٻ˱ ϖ׬ʁڑˋݤ띥٤dz֞ХÐ͛Ӥؤڙ ʏɌ߈ݺ柌ʰ쀍깫֕Т̙ӌ ۿψ̗鎾귓ŝϺņ庄̓ݴִï͆Έ nj젂dzꉘ݋߬ϷӀšʘڙ ë骹ʑ鑌̏ꑶޑ俷 ٠𜛐ǹݝۥ܉ɏݫŸÔЯ‡ڨף 紭ȫЫѐӴ銺ȉϴ䜭򣶃؏ԃ Е򏥠Քƾсˣ遷 ߅˘Ĉဓ̻҃Ỻ𴍑ĀӐń Ӯд鈘дČ蚢̍´҄芚дČ蚢郌ǐ Ϻݕւʮͫζ҃Ʈ߰͠ӆ㶼ķ 𿇫沿ޏʷʋɩﱟӛٜɝд՝ٮӤÚ ͽö稍奲ʹ鱙ҟ󾌞ِݴö꛲ܟ١ 򤾹ԄʎƲߤŶٳԶ˔Ţӌ䊳䨂 ĹҠ̳ٚ馶٢ِ⚜回ِ͚嚜 ܛ̚öިۢϹܸ隴ȣٿŸƇߦܢ쑟貏 ېӬ馒錪ݕ鈍̳Ȁ͎ĀӐ鈘дČ蚢Ā ȡӐ鈘дČ蚢ĀԐ鈘ЀČ蚢贍ՋΘ Ø祶ãьިڸ򈜳Ėʂَ̳ū蚢 Ɉڥ鬁ɞ盖Ėмى܄޳祙򟛖Ė‚ζ ى܄³ѴЖښˋ⋷ɞȂ祶𓐙욜⋷ɞ 鈘дČ蚢Đ풂մɩ蚢ĀܐȦӏԂ Ӑ鈘дČ蚢д鈘дČ蚢ڙؽ猞 ͪ̓Œȯд쁵󎩲͡¨ΓࡉɛǨם رپӎ륣鎤䅎άӂ㚹ӐԚӐ̨ ԠҟΥ铉ʜ䨟祶ލݤЫ޳ىԚȆ Ԧ יىіțŨǒ떛ꚲČ򆲤ڍ̓¦ Ӑ酈дČ訚م蚒߰ĀӐ̘ᨇ𼍑ㆈĀ Ӑ鈘дĂּӐ鈘дČ蚢ٲजٌ͛ Ǭ񁟴ʸ󌢖ŊƨϽȷ ᅃǚŗԯ񨈱궾ꊽ߯ѿ򊁑 &] [s0;= &] [s3; 3. Fonts and font metrics&] [s5; [* Font] is a simple font description value type `- it contains an index of typeface, height of font and additional attributes (e.g. italic flag). [* Info ]method of Font returns the more complex [* FontInfo] object that provides metrics information about the font and individual characters.&] [s5; The most important information of FontInfo is the [* GetAscent] value `- distance from the baseline to the top of character, the [* GetDescent] value `- distance from the baseline to the bottom of character cell (height of character cell `- [* GetHeight] `- is simply the sum of both values) and the individual character width that can be obtained by FontInfo`'s [* operator`[`]] (where index is in UNICODE).&] [s5; To get the list all available typefaces and respective use [* GetFaceCount] and [* GetFaceName] static methods of Font.&] [s5; Position given in [* DrawText] specifies the top`-left corner of the first letter of text.&] [s5; Different than default character spacing can be specified by the C array with integer widths of characters.&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|DropList fontlist;&] [s7; &] [s7; -|void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), White);&] [s7; -|-|w.Offset(50, 50);&] [s7; -|-|const char `*text `= `"Programming is fun`";&] [s7; -|-|Font fnt(`~fontlist, 60);&] [s7; -|-|[* FontInfo fi `= fnt.Info()];&] [s7; -|-|int x `= 0;&] [s7; -|-|[* Vector dx];&] [s7; -|-|for(const char `*s `= text; `*s; s`+`+) `{&] [s7; -|-|-|int width `= fi`[`*s`];&] [s7; -|-|-|w.DrawRect(x, 0, width `- 1, [* fi.GetAscent()], Color(255, 255, 200));&] [s7; -|-|-|w.DrawRect(x, [* fi.GetAscent()], width `- 1, [* fi.GetDescent()], Color(255, 200, 255));&] [s7; -|-|-|w.DrawRect(x `+ width `- 1, 0, 1, [* fi.GetHeight()], Black());&] [s7; -|-|-|[* dx.Add](width `+ 4);&] [s7; -|-|-|x `+`= width;&] [s7; -|-|`}&] [s7; -|-|w.DrawRect(0, 0, 4, 4, Black());&] [s7; -|-|w.DrawText(0, 0, text, fnt);&] [s7; -|-|w.DrawText(0, 70, text, fnt, Blue(), [* dx.GetCount(), dx.Begin()]);&] [s7; -|-|w.End();&] [s7; -|`}&] [s7; -|&] [s7; -|void NewFont() `{&] [s7; -|-|Refresh();&] [s7; -|`}&] [s7; -|&] [s7; -|typedef MyApp CLASSNAME;&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|for(int i `= 0; i < [* Font`::GetFaceCount()]; i`+`+)&] [s7; -|-|-|fontlist.Add(i, [* Font`::GetFaceName(i)]);&] [s7; -|-|Add(fontlist.TopPos(0, MINSIZE).LeftPosZ(0, 200));&] [s7; -|-|fontlist <<`= 0;&] [s7; -|-|fontlist <<`= THISBACK(NewFont);&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Sizeable().Run();&] [s7; `}&] [s7; &] [s5; &] [s0;= @@image:2103&725 耀Ӝŵȿьƨƛچޒɮٜ ׏Ĩ٘ٳⅇʷ܁Аߞ秧ߪ ػںƮㇳנ׹ۙ弞̐藷 ߖԎ緻ޑ쫎 ߢ옓ǔב딚½ä˼ ߒѿĒ̝ɦ 汒ܟңֻƑ˿Ώʄ҃×ĒǬ޳ ܟΎœݹ샳ˠķ ˅ܱ墻ʹՒΟ겱Ǽ ʟŽ埽㝿ߚ׀ΩȹǦɯ߮՝ ş񞃲م邠޸ȷѸˮ񥌳 弧٪ָݯ˧ 㖋ljϤڧ򻮾뮸ܿĻΤܓ ӽ߉ؿƭ߻ ܸͽ޽¯傗怰ă ̽ͪ߿߾汩ޯ˛׵ 靷ݶ믹Ȓ͠Ó۰ΧĿΪ ܦݏ͝޻篖йΦ܉ ˦ă﻾ݲݳʺش˶ꫳ ןյݯӗĄƙ脲ߵܽ暿 ʎۦ;㶙枽ij⻗ ֒߬˅ެ瞷מ㗞ºύǗ 㬊ͻ򠈂ÿķכ󞛺Ӷۛ ߸綄僒ݝכϥف÷ϖ ·߭םֵijϸϨϛױ玸㯣 裀عϻݽ݀玫񟝍 ƫۮϣߝߖΞ οݽݹמߵӎ߸񓷔݉ ڤߏş펌ѠʯУɴ⠧ ޽ݳ̾۵񻘾 ơǧɐЧ퍧߰󎫺؁ܹ Ϟɣēɴ݉×̿ޒʕ ǭˮœҎ獪ߜݵ窿ҏܢ ݯ肀遢齈鴝ɴАşι댳ϿɈߋϻŗ ͓矱ީΩ≤רəǬ ԞΏζ۾ӷήӅܺ΅ ډݷ×ǤНȓ׿ڼǬ循 򉂠귗ڿ鿝̺ߵǸ޵ԝ ʓijåŌ՞ݻן޿˼Զ Ƿͽݕ׷֕ǽћҧӾ֍ՙΣ߾ӕ޹ ݥ댄ѹӿמщ㞛֍ ēӆτɷͥҬώԻ ݑ򬾠뷻ߚߑ˖ҳ ־܍߻߻î߷ε 贶ׂς̅ɾȶϋ쳴衒 َٛӽচ䁊񘤈̌ԟ۶󿞖ЀЀ ɿڀ搯߄Лߺڇϼ ˋĵ⁀̰֝۟񯷺ϮܷЛ껇캘Ƹ􋷎 񠲼و׶ïćоȀ 󈔝Ô񀀀搐˼ۿ磌ڎ郞 񹵇ٯ餾ƂءÍ鋿̓ʓ Ձߙۿڇ†ğۙԞ⁀̢ރŀă ʀѼý̫ŵȁäؾݚ ЕמŃćȼϾ᯶詶ϟă⏪ ȚܾȒ羶ɛڱ֞𬞀Ĥˆݓ 󠑆ѓ¯ƽ岐䅽ϼׯȹߟ߳ ăԦó像֑ޚàȼ˼ˆ яГԕ񀀀⁀ă ҂ʉȼЀ񀀀Є⁀ă񀀀 Ð񀀠Ā҄鎀ʁ涸 耀ԀĀҀʉȼ䀀ǂ񀀀ЄԿߡ ʉȼŒLJڙָə順Ѕ򡬨Ф̀ ⓐˈ̀٢ܱןɢޕ梮Вǔާ Ո΄ޒɚЬ˅ӫ̦򄐀ȼްܬыί׏ٙҨ ɓòĹ㯓ŗӻĀ炒Ɂ̀țȉ„񖐠ӑȼ 񯊑ٙҨɓòč㯓ŗӂ琂ɡ܀ˎ厽Ζ 靉ȼ˔ӫİ҄ȼްίٙۀҨɓ òĹïŗӻ炒ɡ̀ȼߚ˔ӫʪ㭭ϝѣ 䕬֐рضȼϤƝӥê ڞδ̚ۃ€ױ⪻ϣѶ᠖ƥϨ̚Ƀ̪֯ դˮՔܹȼ̀砘̤̝ЃNJ刳ҽ 퍡ȂʼްضɃ֯ĐݨΙ҈񎤿牎퍡 Փ݇ĦΚҹ鲢ȚЦև֯ ڈ׺ՕʴڬȼяȚЈ˔وޕ ϣⵄѤٮȼ֕ׄɫ֭ ضȼ棆׷ߐ݄ޒ堰 ڞˉӿڞߓ˚ڒ஋􌺞å򟾕潕鞛 ܼѽꇨڢ؜˽ςސᴄ˄Ŕ ٓԋ޶ٷѦÀѝؕվ 랔ۢӹߢѳעŤ՚ǥȉ꘰ Ş﹑ȔƂԻɂ䒺ҽڦﳂ ݾ‰ȀϥΘվͭɠҸݩࡼߧ ܃ѴʟӘά쉢紒Έ񱧉ěГߍ̙ Ϯɡ٭喃ʾ٧ɻᓝгߩЎͼ қáת⤎ҽ؃̀驘ЏǼǻоμ 鉽Ñޥ쓹㽉לꕕ򖼽픋¦ن ۿߐӤڦ򎀘ݨء똵ѼϚ ȿƵαԨзеՊ˜Ҥ߁ ΨР礉߾ǻޥ僾ӡ ގϸ͉һׇحῘȴ رБځ壵¿Е񂔸鴇ƸݍԦר ͸ѯۑܾƑ塓Ѧ玝׈ēʖ 洝èӡ¿ޙ웅⃔ƨ求ҧᔇ߫ ȶ浑蒖ꈵᄖ͍᯿Ϟɏ󘁰ʽ ҰʮéٷģބЕ鎔쵭Րꦄ‰饞䝭 ២̵ǘ퓔ꡑ򏳗ϮƇ֩ʅք碯ޗ 沭䁤̒ѣʖ޾ť̋ᠥ鬇률݀⦌ Թ̈́筤́沭޾͂މǡߴܣ氮Ʊ؏с ԰ޓÑ®ﵓ흱ꡝ耮ʋհյ ⦔Ϯۊ󪘐ܸ㛭;ūּ؂ӧݦ ؏ھ݇ځо쩤ũꙚɺݯ̀秜וЎ ʝ꟣ƭѳ۶ՂƤȝŻ˅ټŋ ƒԉŜėӏߺ㙁ڥʧ헭Թӛؽó ш̪ρ╫ݍ΢ǩз۝׈յ֍䗲Ɠ 폓ܷύϦ벁ͯǨ矀ڸҾ肫ٍƇ֍Ԯʝ ˅ލ̀򟼗ܕƗюˋ ҷէݫ𥊛ϥŊ󨻁ʇ͘ѩכ Ȁأچյٛ苞ˢֳ֙ כ޾Аҟ˴ĨԱίʺѡ͘ݩ̺ܖŠޔꓯ墧 ¿Ҁ߆ƪdžնƗ􃥂 ӣӅېβ®ʿʥꁔϭ՝ Ԩܵ枍ϫό׻Έ鮸ީőϸ Ե굜޽Ư١΅ۏۭ͋ᄤ ͦșָؙ̭ӵ𭣃Ԩ ߿ϔߊȏݣō䩹߀īҁ™¿Ӗ܉ھ ϝ򄠁ӡПԣᆿ 개ܼ⿪̿݀ޣşɺũ ޑĒԟцĻʶܕ Ɨũ쥍ۭջԒ̹‰ȀޭœΚ⽮Фȷē ӟƇԮɲԔބټբdzกī ܲڏ̛榨̇ՃʮԮɲה ŀÍɼЍϛū̘܎ صۜůʀ깯¶ׄŎڲз əכ۟єﺘՍۨòÂɽ ׵ˀȂؖǏݠճޒəȝֆ͍ ƩԊԏŗӻЅҨȓɝ і쿯ޕ⭩←ƕ㡛ř Ȃؖנ׵ˊ瀂Ȃ؎꧘׵ˀȂ 撻ѷ׵ˊȂ浘ڿ́ꉃ죜Ȼ 㡋Ѥ򦀤́Ƞ񀀀⁀ă 񀀀⁀ă҂ 连󜕌ʕ睷¿ĤƾոӼݬ౮Ī կ荳­Ԭ܅⃤җ݇ƨŮΖ޿ 荳¹н倀ƨΙȣٰ巷 ҏ划۷ߺԞ߭ի׆ʔܱԬЕʬ ˇӈʃړ捨⊀԰† ē뢂Ԭ˷冹ﲬ졭־ Ά֯ߴхݞ䮹ۀؾڡ˵ظЀϝܦ⍄ Ӛ㽄¢ЀѲ܏˅Ϟ잆ʿ͎ єߧӬԪֈޣˉ֮͜܉ʼ욙膆䴿ɽ ӠϩǺɜՎΪɇж񲃗͖Ð ه݂ڙۤğܷԒ׊՚ǡȵߏɵɛ 󂅙ݙߙʣשۺк͔ ˲Ђӭޣи楾ٝ޴ΘոǢȧÀ̭ ̳ڏﰷ܎׸РŏˇΪڛڡສŌ ӕ쒟ʼ춂ǿ֘ˆ⋛㤠魫щԀ ՖЧҏԌ৴笐·Èηת򙊑ѳ ޹ķߨꪬӰ⌚ɽâ ͏ץٔהΉՔ靤ܓ瓉߻ƉƔЫ ôľÜ㧟ܧԇֳ͋ʼ¡ ϋЉñ빠紩翇ΪȖňЂһõЩß ևȾ􉚅LJ͉ѝһõ˩᢫ ۵ƀ畆օؗԶɇͿѳ긵¥ѯ ˤݓαҳںٞ˅䳱ٖɇ͏̄֍ ̃ɼǫױյБҥ֣֙Զ͇譶ת 氟鐐ɣ⍬̓縅ۚ؁˘樘ɖܾǣ ΍󙘔Չɼլֹ񓤴縅Щ֘硲 Ϻ֍ӆ̃ړպϒ˟ч۾߇ڎσӔҖًת԰ Ћ܎瑿ɮԾЭӓۯƺۡƴ❃˧ éᾓӠ̒߈Σ͓ۋ渵 ⍛ҟ骫з֝׌Ǝۿס鶶緘ꢙ΍󙘆 ٿóџ硲ْڐ傴ܾь̃֜ ދ‡ٖ牽ل֦Ҡь̃聘΁ۆ❲ Ӷ۲項ߖь̃ȼר篇Ȟ硲撎 긵Ԛ⍛˟ߚ܌Ӷ۲Ʈ項ܵޜ ޽硕χ㺟픟⚐͙˴Ђ Ѡժ񐎈Աч۾聬՝ўϮ㦧Ӈ 󉟁ʭ򸖪ɂƬҺ翠ȓӨ؁ˤӌԢ񣢔 ˑԷݼՏϤڳ􃅘۫䳱 ٖ·ЎږՎ̃ʽܑƤ ɺʶ՝ݲݢʶ̗·ɛĺ 璿ͥ̽ྥﵙţƹ过ʶ—͠ߖҫר ݚ縈‘콦ٖ̇ȟ󋾍յŁՙ ͥ޻εЕŬ诫ުʫϴڠُԘ ፥΀஥ϔݝʷ ̺ۤ샲׽隠ͯҢὥ”ӿֻ×֌ ׻îЮ˘Ђ䙤݁俘ҁ ׂ„ҁΘۀ􀁊ȼҁ𨂒ߠ愀И ᄀǂ⾗좩زƬꄐ̻ȇƀ ׳óЗҁ넲ȇƀ֭Ή϶ ƟюԂ遉Ң㡁񀀀Ъ⁀ă҂Ȁ ϟ鞍֯ϮͲޢެ馸򎩔ַ㘡 ؉ұ껑֊îğˇӱƱʶťتԲ đ䳴ΖǻƸɀ &] [s0; &] [s3; 4. DrawingDraw&] [s5; [* Drawing] object contains a set of drawing operations and in fact represents a vector image with smooth rescaling. [* DrawingDraw] serves as the target Draw when creating Drawing, Drawing can be painted to any Draw target using the [* DrawDrawing] method:&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|Drawing drawing;&] [s7; -|&] [s7; -|void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), White());&] [s7; -|-|w.[* DrawDrawing](10, 10, 50, 60, drawing);&] [s7; -|-|w.[* DrawDrawing](100, 10, 150, 100, drawing);&] [s7; -|-|w.[* DrawDrawing](10, 110, 300, 300, drawing);&] [s7; -|`}&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|[* DrawingDraw] iw(200, 200);&] [s7; -|-|iw.DrawEllipse(10, 10, 180, 100, Cyan());&] [s7; -|-|iw.DrawImage(100, 100, CtrlImg`::exclamation());&] [s7; -|-|iw.DrawRect(20, 100, 30, 30, Blue);&] [s7; -|-|[* drawing `= iw];&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Sizeable().Run();&] [s7; `}&] [s7; &] [s5;= @@image:1620&1869 āǜ휇ҨɒĐ򙂅劥ʐ䏁ۑߕ 쩥ޣ˥ޯңɯ齚ŔܲӲ̲ߜŢ¥ ގԓڲܖɼ촫ϓł빫Ϧռܒǭ␎ÛșũϦ ٕޱѫ䰾鳈ٮϯܒܫЙơ ׹똹דɥ运¥خ†¶ܒǦ Ɋιϐdž䱉׹ኧۨ⭙Ũбڹ Ⲳ̷ܾݲ۲έ᜕ݡߤބՋݷܪބ ևΧ܍ծӲ侔ÁڞՈו ۸׏ɡծՆټʵ򦯓îʽ͵‰Ȼ ޳×έºרŃȷܰӭ֯ˮߩ Ӆޘܺ֬юпɪՋư毘ř۳薽 羦垿򕤇͝󿡆ز߫Ь襐럼߈ሚ کۢٿͽكεƭ ȽЮ󝙢ޑ䚞ﴆؾ޸ݢϼٔ 񋅺恨ѽʹֿ̗̲ͽ۫ڶƟ ̼媮޻ܯۣҬޙԽ ఎڍؖȕ˶Ӯޙڶѵϛ ãݻѱՖՅöӨخËȶԖ ͅ玧򬙃ݻͲˍܲȑ쾾ܫ 㑶Ʃϝ֗˧Ŀ۞ͷ𞮕Ŏ̵ ێ˭ϲ˽ċ׬ޙỻ۞ݑӮ 칗퇽޹ܴ͇ݖnj򯔵濪Ϲ مՖۖ꽢Ԑ緃擇׮ ұެÝ՝񓻔ؔݵܰ㒶 弸ߡꧬ͙ؽܻțƴ߬쩝 ț٨Ԇϸ̵ܭۖթپΡͷčܒϺ ުڍג̸ꮛɛ߇Ԋ囫 Α۶ذ˖ؕ޻Ǜܫݴծ˷ݕɡ Ž̇Նƹܨٌìϲ̟еұ Юǻ씞Мȁڳ۽ي菾߱霊 ՜义ш…ʮǴοȶ粓񡤯٘ ڞÿ멯ޟ᫁ήЄ봅 ܬُީӭŎީŎٸِ݃敷͊䩥ݳ ɠ˷ٴȵ۶㢹䞓ڌ鳇ǃι ުӦՏҍɘٓږ뷬廮ܛ̧㔚Į ߅ѝԻѐݯ컸ïەƧ۞گۦֽ ޮԃ펰ʖЂУ۟ꇅ ߏˉΰܺ߄꺁º۟؆鯯Ȋ ۈ쵵冭ؾӫ٭Ԟ׀䠾𿲋̫ 򲷂Êۗ•ӋՔ䆶Ϟʉշ 具ƥ⌫ǻ땅𗣓̤߆ɖ廣䔶 类ܑԖʀս낖虀虀 ؙ虀åˀ֩ê܁ڶױ ť̜ɓ⦨ƜĐإƸĒš㸝󾞐 󚤢젻޻ȚزցŅЄˁ鸧ڠ奶é 恙̷ŶŃُв̸ȱ̮ ţ˾вᾙֹ㯞֖ޚ˔Ʇ泙יÓܐ ᾋڜ۲Û邘Üв但ɭ۟܍셰佣㓝 ׿ϽׯǔӖ迹Η쯞ƙÛ׬炘깞۟ ѣѝ󉌌υɎ҅υڹ朗߻ ҅Ľ¦蹯М̡̳ݘ䷗ӊʦߞ فǿͪӑ̧Ń٧±ƪ߃ŗԿ ۝׿귔֣Ҁ̧ ˒̊沞嶰é싖ɑѩˤ˞ُ ҆ˑ٠ޓٵޗ뭲ޣɏ툗ٔÇ ԒČ䖀ɍ툗ԼپĦ₯վ܈ќвȰ ߎم˷߂󦞺눮ʮԗƵ Ǽݑ蹽풮˓󹹏ʃدѠ弟 ٸӰҒ务ŪۦѯӦˢҭ žߴ葇ݐڨژꊚâ Ԝѽе멳붬Ӧ袯јςʃ搚󦏃 ޹֩ݍ쀪Մ͞ݠүօ鞴 ɕؘۚ岁ږ카ӊ袿玭޻ÚҬヹŷ ʼn⯳ƕ΋ʯи̒ݫώ؋ ݲ鏟گ몣ײғ˪ٟ 麯в˗Ͽ뫇܈ܨҎʤ󨉿 ɻ黗ǟߵے⶛ٿѬߩۅߩ 냖虀虀虀ؙˀ֖娀ܛˀȃ ˀȃˀȃˀȃܼв虀׆в򀐭в򀭃 򀭃вԅꊴ˂虀虬虀虀 ΂چچ巁ٜ׍ܣı彙Љឪвޟꖁ ُˢُ˂㻊߮㗁➴롖ྱ փྍ˃󼙋󰟜񘁅ڶډڦ ǠŽ悾Ш噿ґӲ鶰ܡ泅֓ԁ 泄®彺Ȧ옹佩ۀЮ ޲󡻆͸ǖ̇Ӹɇ֑ٙ ŝҲӃŀؐޮ։ȼߗ񸬒ՖٙקٲȦ 粀⭳܈ȩ曟Ǫ§꾒櫇ЙאŤꈝ ƆМچДӖވԹچĹ҈鬦أ֍䅖 ̷ڣĖк̝䧣ːӑղ󍆡 ¦򝖘چ̔ːֱІԙֺә АއƷʺвЁ別ː𕚺әچ ǵȚԆѭːֱʸߐ则ąв¦ڦș ٗچĖ·Džܡ䤃㒷劜샖̔Ǘ˘÷שّש 虢ºƭҧࡔѧŮ劜ܗ̑چж떩ɽ劜 ̑ķʺ޲ř銚ڦșȱۑ˔òȠ̑ԣɖ򆮫 ͳڲιЅًۻș㵑˂Lj˺虢ڦȨ̑ 뵬æ㢭ⷋ嶬ބДσƆ ڦșܺ֓٩棏׍֓˂֔ ـҔӲ󙃥ܭ泈ٲ֍擊ܼ偡̌в ʼֲ뙨ٕꖱˆ꭫̊ݤߛ۰ݟƍ߲ ¼߷۠妭ʬʧʷ۶뺶ʇܤ 렘ǯݫťԚ㳳ۼ߫۴ʺ˧ˈ ҒҲ嶵》˓Ƚۅ܃֘Ǡ乕ɱݨ ۣƣТ繽ެɯ͙㓳鱟쎠枡圗 ҫі򅭷ȿ̃ʧɘԤ˃ِ ϝ藉ɝǟӑƒ͝ꪼդ玻 لԾȟúʋ޵̦ʟ χ¼ۖ﹉κɜҠԕг٢׈ ΃ۦػ劏Ŗ֜܃ÑٜՆځꤍ 둛ِ㶛˳ȊߋѬטˇ´ғ襡 τٶάݮͶ⒢克銼қ۞تظ Գ앆ؔ˴喢榼נϥՆ 𸱾˶鐪ɭ޼Ͽܙۓҟ 餲򥤢¿͞霘Ơ ܘғɡيބ䐯Ć߶ Ơ崯ܘˌ͡ڏՠ遗ʻؐӶ 클̞兪벁ؿƜğŕԝ̩ԥϰü䄿 ѳ܏ɟˌƣ䖠崀޹ 箉ߏʅޓ֤ڤ񡭏 вڶǧө߯ʜɥë奫̉ӝͷК У䠨ѡֶŀ㪯ߺƫ ̞üҔֶ҃Қ惷ɗ˃֬ڲݖף ϙኂդ夤镬Ɉᷯ۫Тϲϸӡ ҋɎԦݤ̊ȏ鑩߹ijǿȤ ̨Жᶙے۷ٳ풎˶Μڝ避 ѭӁéȦۘꖧ욻겉ß٩ ЂÖ˵ךĘ┟ަύτɿإÆ֐ ٶԺۣŲ߸˷زǫ٨ߢɞ ٿӴ˧ˁƆ߾ՠҶժղ ʙɏܠ횫ǂ‡捺ω ֿō״ڹʉ崜ˊݟǠŋˤף 픕ڎ֣חਜ਼ٖۨۤהԐڛ˺銒޳׏ ɣ˝ጢݻǤۃϳ⺲滍ٻᣥ뉙 ͪܳمڙɤꢑֿ˳箰󧿪ײƗ ߗܐѓ̚˥֕Ԑ̫坌̤Թڻɠ ܣ只ߓՆЌϾ̔ӏϱه ܶƔӚ޷ϞίߒΓ̵ɖ ޔ㽢ʪÔȒĥ֛ːέߍ ⋊Ĭޖɵޚ琣ܖ安ޓꮉ 鷶ުᠲנψޛݼնΪ҈׎ 鏻߾‹הĴ焘㏆ݺ׿֥ߚۖ ֧Τي߂ϟϤڊݵ ܦմܻ۾←ݧ󧾂紩՛ ƫ듿ռ䞷ٯ㧫ύĘĎ ӦƜܛǓǧΰ҂隯ݗ縟 njߕ洪њ񅠏նвٶ ھϟ򾦘׳ֿڶӇ뜒 ݍϚˊϼܐٽۮ匞ҳ󬧦ыԝ۟ ҵފޱ殜߿媛ݠƠބ֭ ϖڕќӊˊ”Ϋ۱ꎵ ߎБړǪܕ˖׼ϩΐʋݒۇ̚ڮǀݟ储 㺦κşӵ՗ȡ󱻾Թ䣝˸黗 ܃柜בߙ덡вܞȕΣٜۮ ڻʚ߇ߵꮡޔƐ ٽΊ㝏⦏ٞ񈤞ߓ崣ݞṛ 􍟻ǯÆҫűޘ˜Ξǝנס폿כ ל絛텹۷ݐߴ熿뭡ֲث 򗎝܎өӦΙƽ᳦ϸ԰ܽöɥ嬳 ׸ξ፸ٵɚҵ埭ѫ񋹶в ƷܾչÏɚߩºˀ 虀虀虀ؙРȀ䠁چ傀چ چ䁐چ倁چ؎в򀭃в򀐭в򀭃Є򀭃 в樅洩ž泥ԦʡưқՎ ʭ柚Æދċ߫㌏ݿ૭ϳЖΟ빧 ږֳ۪Ξ뮙 &] [s5;= &] [s3; 5. ImageDraw&] [s5; [* ImageDraw] provides a Draw target that creates an Image object. To define the alpha component, use Draw target returned by [* Alpha] method and [* GrayColor] to define the value (if you never use Alpha, it is considered to be 255 for the whole Image, otherwise it is set to 0 when Alpha is called for the first time).&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; struct MyApp : TopWindow `{&] [s7; -|Image image;&] [s7; -|&] [s7; -|void Paint(Draw`& w) `{&] [s7; -|-|w.DrawRect(GetSize(), Cyan());&] [s7; -|-|w.DrawImage(10, 10, image);&] [s7; -|`}&] [s7; -|&] [s7; -|MyApp() `{&] [s7; -|-|[* ImageDraw] iw(100, 40);&] [s7; -|-|iw.[* Alpha]().DrawRect(0, 0, 100, 40, GrayColor(0));&] [s7; -|-|iw.[* Alpha]().DrawEllipse(0, 0, 100, 40, GrayColor(255));&] [s7; -|-|iw.DrawEllipse(0, 0, 100, 40, Yellow());&] [s7; -|-|iw.DrawText(26, 10, `"Image`", Arial(16).Bold()); &] [s7; -|-|[* image `= iw];&] [s7; -|`}&] [s7; `};&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|MyApp().Sizeable().Run();&] [s7; `}&] [s7; &] [s0; &] [s0;= @@image:806&618  ̔LJ苵Қܰԡɽ ˥؟ؑ˲⽩‰ˌѓ靈ϳͳ Ռϒʔ̶ຠ΅̶⠣ȡ՛ܔ֙܀ 梂¡݋㈅ߓٱǚĚֽߦЂ ТʡբƉ샙茕ѽ Ĕ䮘󁕽ݍ㷃܆č صי̶܄Ѵ򂀿Æ̀¤ ŏ䨬୲ΐԺ‚ԂΏ ŋܥ͑·첚ߓ舄Ԣɜذƻ Ė𞿡ꐅ樥ħߞϣƬʐׄĖыӅԒя 쑳ˈڭۻԱӣݒʏ藵ƴ篸ւ׈Ӟ ҵň赅ճȫ̧߈ƥԝߪۿ ûتŵ럝1±ց̦ ґ˫˵竁ׂيӥ˴龥§ǣ ࣰܼЀ̡݄ׄí魏겋ٚ ݥ댅ڟɐ„٨ƅҟ޷ʲٚ٭ךℨ Ǖּ߭²΄裲ʁnj׺ 嶞Ƽ˔뽡ꈠ佳؊τ֦붩Ԫ Љڨг¯ٗМšŎ܊ ӷԕϡ盳纚цٜ˂ޑەݨُڝڗܺ يڲݳڹۢǀ̝΀ۀ´ٹĮ鑐ꁔ ؋ѐʲϣЗːڛڡڻܗǞЪВՆڈθ̚ ǀސ̙μϡ扥ϭѐӐǾУ 헜ݾȴޫ酀캞ݹҨ ٨פصdz҃ۋڙҷ̸ʬ󖵓 ݂āՎԷޱζ۶֬ ƢҞ证ྜྷ҉̍βҭ ͖݉֝ͼĕ␂񌛩ꗂƘ舢Ƿ…չބŔ ↛ٕջϠ߫ωNj֒۴䲐 ͠ܗȺƒߺ†ۃʮՐ۽ɯֿǛ ۗطيۤݞɂב췄ͶԏߥÅɁ ՋӷܰƨԎś̹֬ӘՔȈ ӓΏ͋ΥʚݥŶɝÌڒ坿 Ƅȝäɩ̏Խыؼ̅οߑ Ņԓ锓ѡ薅ڈ󤐉汾Ȯ ހĈΗ˯猪ӡ©ߒِ ƄҞԹ䍵˔́Ҙ򻍐ݓʫƴò Ҹݭ͹âꈧҚ«߅⋂א͡ Ϩ훢՘ӿ„Бِ ŠǐۦŰ 脎ٯĈԠʥ϶ҹɱĄե 桞쎍ݢ¥ૂ񜾡ݍŁŠʐƷʑ蔈 DŽĵݶݽ؈ᴕ⋞ƾῄԐȡϳƫ ̹ح􊍈쫆톢ߴЪҮёܐ׸â ŵ߭եɓТݮբݰ̉ˬ爰 ×зͺՉƂχ説Ɓڊ簟 񚴦Ŵ̟щ΅;ε焊ѸĢŰ ف⩌㶿ƷߗȆ҇’٭ҧǰآά䆀 ơ̢ư俻ԍ俪ȤꟿԢƪǶ ґ湣恈ԄЃԱ̈գĠ縪ȞؠҝҽŊ Ԩ󍹻䆂ɮ򼬃藽ݭǏӢ Өϐ̸δ׆ȡԽϪ޾Фܕ쿓 ֪ϳ &] [s0; &] [s3; 6. Printing&] [s5; Printing is quite similar to painting on the screen. To acquire Draw target for the printer, you need to use [* PrinterJob] (CtrlLib feature). Each page printed should be started by calling [* StartPage] method and ended with [* EndPage]. Drawing coordinates when printing are in [*/ dots], defined as 1/600 of inch (in fact, a pixel on 600dpi printer).&] [s7; &] [s7; #include &] [s7; &] [s7; using namespace Upp;&] [s7; &] [s7; GUI`_APP`_MAIN&] [s7; `{&] [s7; -|[* PrinterJob] pd(`"My printer job`");&] [s7; -|if(pd.[* Execute]()) `{&] [s7; -|-|Draw`& w `= pd.[* GetDraw]();&] [s7; -|-|w.[* StartPage]();&] [s7; -|-|w.DrawText(200, 1200, `"Helo world!`", Arial(600));&] [s7; -|-|w.[* EndPage]();&] [s7; -|-|w.[* StartPage]();&] [s7; -|-|w.DrawText(200, 1200, `"Second page`", Roman(600));&] [s7; -|-|w.[* EndPage]();&] [s7; -|`}&] [s7; `}&] [s7; &] [s0; ]