{"id":528,"date":"2018-04-07T19:32:35","date_gmt":"2018-04-07T19:32:35","guid":{"rendered":"http:\/\/hayperek.pl\/?p=528"},"modified":"2018-04-07T19:32:35","modified_gmt":"2018-04-07T19:32:35","slug":"rysowac-czy-byc-rysowanym-czyli-kilka-slow-o-widgetach","status":"publish","type":"post","link":"https:\/\/hayperek.pl\/en\/2018\/04\/07\/rysowac-czy-byc-rysowanym-czyli-kilka-slow-o-widgetach\/","title":{"rendered":"Rysowa\u0107 czy by\u0107 rysowanym? Czyli kilka s\u0142\u00f3w o widgetach."},"content":{"rendered":"<p>Ka\u017cdy, kto mia\u0142 styczno\u015b\u0107 z tworzeniem oprogramowania zna zapewne zasad\u0119 DRY (ang. Don&#8217;t Repeat Yourself). W zabawny spos\u00f3b opisuj\u0119 ona pewn\u0105 regu\u0142\u0119, m\u00f3wi\u0105c\u0105, i\u017c powtarzaj\u0105ce si\u0119 fragmenty kodu, nale\u017cy  wyodr\u0119bnia\u0107 jako funkcje. Innymi s\u0142owy &#8211; po\u017c\u0105dane jest tworzenie aplikacji z pewnych elementarnych &#8222;klock\u00f3w&#8221;. Tak jak biblioteka graficzna stanowi odzwierciedlenie tej regu\u0142y w \u015bwiecie grafiki, tak idea widget\u00f3w stanowi jej prze\u0142o\u017cenie na j\u0119zyk graficznego interfejsu u\u017cytkownika (GUI). Widgety s\u0105 wi\u0119c gotowymi &#8222;klockami&#8221; z kt\u00f3rych mo\u017cemy posk\u0142ada\u0107 interfejs, bez konieczno\u015bci operowania z poziomu aplikacji jedynie na prymitywach graficznych. <\/p>\n<p>Alternatyw\u0105 do widget\u00f3w, cz\u0119sto pojawiaj\u0105c\u0105 si\u0119 w \u015bwiecie embedded jest tzw. metoda owner draw. Polega ona na przeniesieniu odpowiedzialno\u015bci za tworzenie zawarto\u015bci na w\u0142a\u015bciciela, czyli dan\u0105 aplikacj\u0119 lub okno. Inaczej m\u00f3wi\u0105c, ka\u017cdy komponent musi we w\u0142asnym zakresie zadba\u0107 o narysowanie swojego interfejsu na wy\u015bwietlaczu. Ka\u017cde okno r\u00f3wnie\u017c b\u0119dzie posiada\u0142o w\u0142asn\u0105 funkcj\u0119 rysuj\u0105c\u0105 &#8211; powitanie, menu, okno ustawie\u0144, itd. <\/p>\n<p>Zadajmy wi\u0119c sobie pytanie: kt\u00f3ra z metod jest bardziej dopasowana do naszych potrzeb?<\/p>\n<hr>\n<h5>Owner-draw:<\/h5>\n<p>Zalety:<\/p>\n<ul class=\"pro_cons_list\">\n<li class=\"pro_item\">dowolno\u015b\u0107 w tworzeniu zawarto\u015bci okna,<\/li>\n<li class=\"pro_item\">szybko\u015b\u0107 dzia\u0142ania,<\/li>\n<li class=\"pro_item\">wymaga jedynie biblioteki graficznej,<\/li>\n<\/ul>\n<p>Wady:<\/p>\n<ul class=\"pro_cons_list\">\n<li class=\"cons_item\">wielokrotne powielanie niezwykle podobnych fragment\u00f3w kody, np. tytu\u0142 okna, ikony, komunikat, menu,<\/li>\n<li class=\"cons_item\">modyfikacja wygl\u0105du czy struktury wymaga zmiany kodu \u017ar\u00f3d\u0142owego,<\/li>\n<li class=\"cons_item\">mieszanie kodu kontrolnego z kodem interfejsu graficznego,<\/li>\n<\/ul>\n<hr>\n<h5>Widget:<\/h5>\n<p>Zalety:<\/p>\n<ul class=\"pro_cons_list\">\n<li class=\"pro_item\">odseparowanie kodu interfejsu graficznego,<\/li>\n<li class=\"pro_item\">mo\u017cliwo\u015b\u0107 delegowania rysowania GUI do innego komponentu,<\/li>\n<li class=\"pro_item\">\u0142atwa modyfikacja wygl\u0105du okna,<\/li>\n<li class=\"pro_item\">sp\u00f3jny wygl\u0105d interfejsu mi\u0119dzy r\u00f3\u017cnymi oknami\/widokami,<\/li>\n<\/ul>\n<p>Wady:<\/p>\n<ul class=\"pro_cons_list\">\n<li class=\"cons_item\">stworzenie biblioteki widget\u00f3w stanowi ogromn\u0105 inwestycj\u0119 czasu,<\/li>\n<li class=\"cons_item\">ograniczona liczba dost\u0119pnych element\u00f3w (pole tekstowe, grafika),<\/li>\n<li class=\"cons_item\">wi\u0119ksze zu\u017cycie CPU,<\/li>\n<\/ul>\n<hr>\n<p>Wnioski: metoda owner-draw jest odpowiednia dla prostszych interfejs\u00f3w GUI, posiadaj\u0105cych dwa-trzy r\u00f3\u017cne widoki i niewymagaj\u0105cych wi\u0119kszej elastyczno\u015bci. Widgety sprawdz\u0105 si\u0119 z kolei w rozbudowanej aplikacji, gdzie \u0142atwo\u015b\u0107 tworzenia ogromnej ilo\u015bci okien zrekompensuje czas po\u015bwi\u0119cony na ich stworzenie. Nie bez znaczenia jest tak\u017ce wydajno\u015b\u0107 zastosowanego procesora &#8211; widgety b\u0119d\u0105 stawia\u0107 tu znacznie wi\u0119ksze wymagania.<\/p>\n<p>W naszym przypadku widgety wydaj\u0105 si\u0119 by\u0107 znacznie bardziej optymalnym rozwi\u0105zaniem, ze wzgl\u0119du na du\u017c\u0105 ilo\u015b\u0107 widok\u00f3w czy okien jaka musi powsta\u0107. Elastyczno\u015b\u0107 i \u0142atwo\u015b\u0107 projektowania interfejsu graficznego jest warta dodatkowej inwestycji czasu oraz nieco wi\u0119kszego zu\u017cycia czasu CPU.<\/p>","protected":false},"excerpt":{"rendered":"<p>Ka\u017cdy, kto mia\u0142 styczno\u015b\u0107 z tworzeniem oprogramowania zna zapewne zasad\u0119 DRY (ang. Don&#8217;t Repeat Yourself). W zabawny spos\u00f3b opisuj\u0119 ona pewn\u0105 regu\u0142\u0119, m\u00f3wi\u0105c\u0105, i\u017c powtarzaj\u0105ce si\u0119 fragmenty kodu, nale\u017cy wyodr\u0119bnia\u0107 jako funkcje. Innymi s\u0142owy &#8211; po\u017c\u0105dane jest tworzenie aplikacji z pewnych elementarnych &#8222;klock\u00f3w&#8221;. Tak jak biblioteka graficzna stanowi odzwierciedlenie tej regu\u0142y w \u015bwiecie grafiki, tak [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":589,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-528","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-stodni","9":"post-with-thumbnail","10":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/comments?post=528"}],"version-history":[{"count":12,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/528\/revisions"}],"predecessor-version":[{"id":592,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/posts\/528\/revisions\/592"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media\/589"}],"wp:attachment":[{"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/media?parent=528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/categories?post=528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hayperek.pl\/en\/wp-json\/wp\/v2\/tags?post=528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}