Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Lajme
  • Krijimi i aplikacioneve me një ndërfaqe grafike. Krijimi i një ndërfaqe grafike duke përdorur Qt C clr duke krijuar një ndërfaqe grafike

Krijimi i aplikacioneve me një ndërfaqe grafike. Krijimi i një ndërfaqe grafike duke përdorur Qt C clr duke krijuar një ndërfaqe grafike

5

Unë kam bërë shumë seksione të ndryshme të sistemit Nintendo DS GUI si butona, kuti teksti dhe kuti kontrolli, por më duhet një mënyrë për t'i fshehur këto klasa në një klasë Gui në mënyrë që të mund të vizatoj gjithçka në ekran menjëherë dhe të kontrolloj të gjithë butonat menjëherë për të kontrolluar nëse ndonjë buton është shtypur. Pyetja ime është se cila është mënyra më e mirë për të organizuar të gjitha klasat (si butonat dhe kutitë e tekstit) në një klasë të vetme GUI?

Ja një mënyrë që mendova, por nuk më duket e drejtë:

Redakto: Unë jam duke përdorur C++.

Klasa Gui ( publike: void update_all(); void draw_all() const; int add_button(Button *button); // Kthim id-në e butonit void remove_button(int button_id); private: Button *buttons; int num_buttons; )

Ky kod ka disa probleme, por thjesht doja t'ju jepja një ide se çfarë dua.

  • 5 përgjigje
  • Renditja:

    Aktiviteti

2

Kjo pyetje është shumë e ngjashme me atë që do të postoja, vetëm e imja është për programimin Sony PSP.

Unë kam kërkuar diçka për një kohë, kam konsultuar disa libra dhe VTM, dhe deri më tani kjo është një ide e përafërt e sistemeve të thjeshta UI.

Klasa uiElement() ( ... Përditësimi i zbrazët virtuale() = 0; Vizatimi i zbrazët virtuale() = 0; ... ) klasa uiButton() publike: uiElement ( ... Përditësimi i zbrazët virtuale (); Vizatimi i zbrazët virtuale () . (); void Draw(); void AddElement(uiElement *Element); void RemoveElement(uiElement *Element); std::list elementet; ... ) void uiWindow::Update() ( ... për (listë ::iterator it = Elementet.begin(); it != Elementet.fund(); it++) it->Përditëso(); ... ) void uiWindow::Draw() ( ... për (listë ::iterator it = Elementet.begin(); it != Elementet.fund(); it++) it->Draw(); ...)

Parimi është krijimi i një dritareje dhe bashkëngjitja e elementeve të ndërfaqes së përdoruesit dhe thirrja e metodave të tërheqjes dhe përditësimit nga funksionet e tyre kryesore përkatëse.

Asgjë nuk funksionon ende për mua, pasi kam probleme me kodin e vizatimit. Me API të ndryshme në PC dhe PSP, po shikoj kodin e mbështjellësit për OpenGL dhe psp gu.

Shpresoj se kjo ndihmon.

0

Një strategji e dobishme për t'u mbajtur në mend mund të jetë modeli i përbërë. Në një nivel të ulët, mund t'ju lejojë të trajtoni më lehtë të gjitha objektet GUI (dhe koleksionet e objekteve) pasi ato të jenë krijuar. Por unë nuk di asgjë në lidhje me dizajnin GUI, kështu që një vend për të gjetur frymëzim të përgjithshëm është në kodin burimor të një projekti ekzistues. WxWidgets është një GUI ndër-platformë me kod burimor të disponueshëm. Fat të mirë me projektin tuaj!

0

3

Për ata që janë të interesuar, këtu është paketa ime GUI me burim të hapur, të licencuar nga BSD për DS:

Përgjigja e Subject2k është mjaft e mirë, por unë do të rekomandoja seriozisht të keni një kod që përmban elementë të ndërfaqes së fëmijëve në klasën bazë uiElement. Ky është shembulli që ndoqa në Woopsie.

nëse ti jo mbështeteni këtë në klasën bazë, do të hasni në probleme serioze kur përpiqeni të zbatoni diçka më komplekse se një kuti teksti dhe një buton. Për shembull:

  • Shiritat e tabelave mund të modelohen si butona të shumtë të grupuar nën një element të vetëm UI prind që ofron ekskluzivitet reciprok të përzgjedhjes;
  • Grupet e radiove (me kalimin e kohës);
  • Shiritat e lëvizjes mund të përfaqësohen si një element rrëshqitës/ullues dhe një buton lart/poshtë;
  • Listat e lëvizjes mund të përfaqësohen si një kontejner dhe disa elementë të ndërfaqes së përdoruesit.

Gjithashtu, vlen të kujtohet se DS ka një procesor 66 MHz dhe 4 MB RAM, i cili përdoret si për të ruajtur programin tuaj ashtu edhe për ta ekzekutuar atë (disqet DS ngarkohen në RAM përpara se të ekzekutohen). Ju me të vërtetë duhet ta konsideroni atë si një sistem të integruar, që do të thotë se nuk ka STL. E hoqa STL-në nga Woopsi dhe arrita të kursej 0,5 MB. Jo shumë sipas standardeve të desktopit, por është 1/8 e memories totale të disponueshme DS të konsumuar nga mbeturinat STL.

Unë detajoj të gjithë procesin e shkrimit të një ndërfaqeje përdoruesi në blogun tim:

Ai përfshin një përshkrim të dy algoritmeve që kam gjetur për rivizatimin e ekranit, që është pjesa e ndërlikuar e krijimit të një GUI (njëri thjesht thyen drejtkëndëshat dhe kujton zonat e dukshme, dhe tjetri përdor pemët BSP, që është shumë më efikase dhe më e lehtë për t'u kuptoj), këshilla për optimizimin, etj. d.

Shënim: Ne studiojmë miniaplikacionet - elementet vizuale që përbëjnë ndërfaqen grafike të përdoruesit, paraqitjen e tyre, politikën e madhësisë, lidhjet e slotave të sinjalit, elementët e ndërfaqes grafike dhe përdorimin e tyre.

13.1 Widgets

Widget-et janë elementet vizuale që përbëjnë ndërfaqen grafike të përdoruesit.

Shembuj të miniaplikacioneve:

  • Butoni (klasa QPushButton );
  • Label (klasa QLabel);
  • Fusha e hyrjes (klasa QLineEdit);
  • Fusha numerike e numëruesit (klasa QSpinBox);
  • Shiriti i lëvizjes (klasa QScrollBar).

Qt ka rreth 50 klasa të gatshme të elementeve grafike të disponueshme për përdorim. Klasa mëmë për të gjitha miniaplikacionet është klasa QWidget. Të gjitha vetitë kryesore të elementeve vizuale janë trashëguar prej saj, të cilat do t'i shqyrtojmë me kujdes. Le të fillojmë të eksplorojmë mënyra për të zhvilluar programe me një ndërfaqe grafike me një shembull.

Le të krijojmë një skedar bosh projekti. Drejtoni magjistarin e projektit dhe zgjidhni artikullin në seksionin Projektet (Projektet). Projekt tjetër. Tjetra, zgjidhni një lloj projekti. Projekti Empty Qt. Shtoni përmbajtjen e mëposhtme në skedarin e projektit:

TEMPLATE = modulet e aplikacionit #Qt ne do të përdorim QT += miniaplikacionet #Shto modulin e miniaplikacioneve për të punuar me miniaplikacionet (kërkohet për Qt5). TARGET = widget#Emri i BURIMEVE të ekzekutueshme += \ main.cpp

Tani le të krijojmë një program të thjeshtë me një dritare në të cilën do të shfaqim një mbishkrim. Vendosni madhësinë e dritares dhe tekstin e titullit të saj, si dhe vendosni fontin për titullin. Për ta bërë këtë, le të krijojmë një skedar main.cpp me përmbajtjen e mëposhtme:

#përfshi #përfshi int main (int lArgc, char * lArgv ) ( // Krijo një objekt QApplication që inicializon dhe konfiguron programin e dritares, // kontrollon ekzekutimin e tij duke përdorur qarkun e ngjarjes QApplication lApplication (lArgc, lArgv); QLabel lLabel; // Krijo një QLabel widget - label lLabel.setText (" Unë jam widget!"); //Cakto tekstin për etiketën lLabel.setGeometry(200, 200, 300, 150); //Cakto dimensionet - pozicionin (x, y) gjerësia dhe lartësia . Vendosni tekstin e shtrirjes lLabel.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //Klasa QFont përdoret për të vendosur parametrat e fontit. //Zgjidhni familjen e shkronjave Arial Black dhe madhësinë 12. QFont lBlackFont(" Arial "E zezë , 12); lLabel. setFont(lBlackFont); //Vendosni fontin për etiketën lLabel.show(); //Thirrni metodën show() për të shfaqur etiketën në ekran ktheni lApplication.exec(); //Start programi për të ekzekutuar exec() ekzekuton trajtimin e ngjarjeve //loop - Programi pret për veprimet e përdoruesit dhe kryen përpunimin e tyre. )

Siç mund ta shihni, elementët që përbëjnë ndërfaqet në Qt kanë pozicionin dhe madhësinë e tyre - të ashtuquajturën "gjeometri" - dhe kështu zënë zonën përkatëse drejtkëndore në ekran (shih Fig. 13.1). Gjithashtu, secili prej elementeve ka cilësime që përcaktojnë sjelljen dhe pamjen e tij.


Oriz. 13.1.

Për të krijuar një strukturë, miniaplikacionet organizohen në një hierarki sipas parimit "pjesë - e tërë". Secili prej miniaplikacioneve mund të përmbajë miniaplikacione të tjera. Një element i tillë vizual bëhet "prindi" (vidget prind) i elementeve që përmban. Vini re se marrëdhënie të tilla nuk duhet të ngatërrohen me trashëgiminë në C++, marrëdhëniet midis klasave në një program. Marrëdhëniet ndërmjet miniaplikacioneve janë marrëdhënie ndërmjet objekteve. Kjo marrëdhënie ka disa implikime:

  • elementi prind do të jetë përgjegjës për fshirjen e elementit fëmijë: nëse miniaplikacioni prind fshihet, ai automatikisht do të fshijë të gjithë elementët fëmijë;
  • miniaplikacioni i prindit vendos miniaplikacionet e fëmijëve brenda vetes, pjesët e miniaplikacioneve të fëmijëve që shkojnë jashtë prindit do të jenë të padukshme;
  • një pjesë e gjendjes së miniaplikacionit prind u kalohet atyre të fëmijëve - kjo ka të bëjë me disa veti (dukshmëri, aktivitet) dhe stile që aplikohen në elementin vizual.

Miniaplikacionet që nuk kanë prind (miniaplikacionet e nivelit të lartë) shfaqen si dritare të veçanta në program. Konsideroni një shembull. Le ta emërtojmë projektin e ri ParentExample. Skedari i projektit do të përmbajë cilësimet e zakonshme për një projekt GUI:

TEMPLATE = aplikacioni TARGET = ParentExample QT += miniaplikacionet

Për widget-in që do të përdorim si dritare kryesore, do të krijojmë një klasë të re. Për këtë kategori Skedarët dhe klasat (Skedarët dhe klasat) zgjidhni seksionin C++ dhe zgjidhni klasën C++ (shih Figurën 13.2).

Hapi tjetër është krijimi i disa elementeve në dritare. Për ta bërë këtë, hapni skedarin parentwidget.cpp dhe ndryshoni kodin e konstruktorit të klasës. Për të shfaqur elementë, mjafton t'i krijoni ato në konstruktorin e klasës dhe të vendosni ParentWidget si babain e tyre. Kodi parentwidget.cpp duket si ky:

#include "parentwidget.h" #include #përfshi #përfshi ParentWidget::ParentWidget (QWidget * prind) : QWidget (prind) ( //Krijo një etiketë, duke specifikuar miniaplikacionin prind - kjo, domethënë një shembull i klasës ParentWidget. QLabel * lLabel=QLabel i ri (kjo); // Pozicioni në lidhje me këndin e sipërm të majtë të miniaplikacionit prind lLabel ->setGeometry(50, 0, 100, 30); lLabel ->setText("TextLabel"); //Tekst në etiketë. //Krijo një buton, vendos prindin , gjeometria dhe teksti QPushButton * lPushButton = QPushButton i ri (kjo); lPushButton->setGeometria (50, 50, 100, 30); lPushButton->setText (" PushButton "); // Krijo një "fushë hyrëse", , gjeometria dhe teksti QLineEdit * lLineEdit = QLineEdit i ri (kjo); lLineEdit ->setGeometry(50, 100, 100, 30); lLineEdit ->setText("LineEdit"); lLineEdit ->selectAll(/); në fushën e hyrjes (vetëm për shembull) //Ndrysho përfundimisht madhësinë e miniaplikacionit prind setGeometry (x (), y (), 300, 150); //dhe vendos tekstin e titullit të dritares setWindowTitle (" miniaplikacioni prindShembull "); )

Për shkak se elementi prind është ParentWidget, etiketa (QLabel), butoni (QPushButton) dhe fusha e tekstit (QLineEdit) janë brenda tij. Pozicioni i miniaplikacioneve të fëmijëve vendoset në lidhje me këndin e sipërm të majtë të prindit. Kjo mund të verifikohet lehtësisht duke ndryshuar madhësinë dhe pozicionin e dritares së programit tonë. Vini re se si krijuam elementët e ndërfaqes së përdoruesit në memorien e grumbullit duke përdorur operatorin e ri. Kjo siguron që elementët të mos hiqen pasi të përfundojë konstruktori ParentWidget.

Unë do të bëj një rezervë menjëherë se C ++ është gjuha ime e preferuar, kam shkruar në të praktikisht "që nga fëmijëria" dhe nuk do ta mohoj rëndësinë e saj si një nga gjuhët më të mira për të shkruar. programe për çdo qëllim. Për më tepër, nuk shoh asnjë arsye për të filluar një tjetër holivar apo për të matur "treguesit". Ky artikull është vetëm një përshkrim i një përvoje të keqe me gjuhën, duke shpjeguar disa nga aspektet e saj, njohja e të cilave do të ndihmojë programuesit e tjerë në të ardhmen.

Një ditë hasa në një bibliotekë të klasës GUI në zhvillim. Nga pikëpamja e C++, dhe më konkretisht klasat, instancat dhe hierarkitë e saj, kjo gjuhë duket tepër e afërt me konceptin e kontrollit të GUI, në veçanti me elementë të tillë si miniaplikacionet, dritaret e klasave dhe nëndritaret. Megjithatë, modelet OO të C++ dhe sistemit të dritareve janë të ndryshme. C++ kishte për qëllim të ishte një gjuhë "statike" me shtrirje token, kontrollim statik të tipit dhe hierarki të përcaktuara në kohën e përpilimit. Dritaret dhe objektet e tyre, nga ana tjetër, kanë natyrë dinamike, ato zakonisht jetojnë jashtë procedurës ose bllokut të vetëm me të cilin janë krijuar; Hierarkitë e miniaplikacioneve përcaktohen kryesisht nga faqosja, dukshmëria dhe transmetimet e ngjarjeve. Bazat e ndërfaqes grafike të përdoruesit, të tilla si hierarkitë dinamike dhe gjeometrike të dritareve dhe kontrollit, dhe rrjedha e ngjarjeve, nuk mbështeten drejtpërdrejt nga sintaksa C++ ose semantika e saj. Kështu, këto funksione duhet të përsëriten në kodin GUI të C++. Kjo çon në dyfishim të paketës së veglave grafike, ose funksionalitetit të menaxherit të dritareve, kodi është "i fryrë", ne jemi të detyruar të braktisim shumë nga veçoritë "të forta" të C ++ (për shembull, kontrollimi i tipit në kohën e përpilimit). Artikulli ofron disa shembuj të thjeshtë të "mospërputhjeve" të C++/GUI.

Mos krijoni konstruktorë (ose të paktën mos i përdorni)

Kur klasa rezultuese anashkalon një metodë virtuale të klasës mëmë, mbani në mend se mbivendosja nuk hyn në fuqi gjatë ekzekutimit të konstruktorit të klasës bazë. Kjo është veçanërisht e bezdisshme kur objektet kërkojnë miniaplikacione që u përgjigjen ngjarjeve GUI. Supozoni klasën Dritarja_Bazë kishte për qëllim të krijonte një dritare bardhë e zi vanilje në ekran:

ClassBasic_Window(
publike:
Dritarja_Bazë(Rect rect) (gt_create_window(rect,visible,this);)
virtual void handle_create_event() (set_background(WHITE); )
};

Këtu gt_create_window()është përgjegjës për thirrjen e nivelit të ulët të veglave kryesore grafike (për shembull, xvt_win_create()). Ky funksion ndan hapësirë ​​për të dhënat e instrumenteve, njofton menaxherin e dritares, e regjistron atë objekt si dëgjues të ngjarjeve dhe në shembullin e mësipërm, inicializon daljen grafike në dritaren në ekran.
Supozoni se duam të instantojmë Dritarja_Bazë, por me sfond të kuq. Zakonisht, për të ndryshuar sjelljen e një klase, duhet të nxirrni prej saj dhe të anashkaloni metodat virtuale përkatëse. Ne po shkruajmë:

Klasa RedWindow: publike Basic_Window(
virtual void handle_create_event() (set_background(RED); )
publike:
RedWindow (Rect rect) : Basic_Window (Rect rect) ()
};
redWindow drita_dritare e kuqe (default_rect);

Por dritare e kuqe do të shfaqet e bardhë, jo e kuqe! Te krijosh Dritare e kuqe, fillimisht duhet të krijohet objekti prind. Pas përfundimit Dritarja_Bazë::Dritarja_Bazë(), tavolina virtuale Dritare e kuqe hyn në fuqi, metodë handle_create_event() bëhet i pavlefshëm dhe konstruktori RedWindow () kryer. Konstruktor Dritarja_Bazë () regjistron një objekt të veglës grafike që fillon menjëherë të dërgojë ngjarje në objekt (p.sh., një ngjarje CREATE). Konstruktor Dritarja_Bazë () nuk ka përfunduar ende (jo e garantuar), kështu që metoda virtuale e anashkaluar nuk është vendosur ende. Kështu që ngjarja CREATE do të trajtohet Dritarja_bazike::handle_create_event(). Tabelat virtuale Dritare e kuqe klasat do të krijohen vetëm kur klasa bazë të jetë plotësisht e ndërtuar, domethënë kur dritarja është tashmë në ekran. Ndryshimi i ngjyrës së dritares në këtë fazë do të çojë në një gabim të bezdisshëm.

Ekziston një zgjidhje e thjeshtë: parandaloni çdo konstruktor të regjistrojë një objekt të paketës së veglave GUI. Trajtimi i ngjarjeve do të strukturohet për të mbajtur prapa përfundimin e inicializimit në klasat e derivuara. Është shumë joshëse të mendosh miniaplikacionet në ekran si "fytyra" e objektit GUI të një aplikacioni në memorie. Siç tregon shembulli i mësipërm, kjo lidhje midis ekranit dhe objektit C++ nuk është aq e lehtë për t'u zbatuar: ato lindin veçmas.

Asnjë mjet sintaksor për ndërrimin e ngjarjeve

Supozoni se biblioteka e klasës përfshin një GUI të klasës PictWindow e cila shfaq një foto në një dritare:

Klasa PictWindow(
foto foto;
publike:
repaint virtuale void() ( gt_draw_pict(picture); )
...
};

Ne dëshirojmë të mbulojmë një drejtkëndësh të vogël në një zonë të caktuar të imazhit. Për këtë qëllim, ne mund të përpiqemi të bëjmë nënklasë PictWindow:


Rectect;
repaint virtuale void() (gt_draw_rect(rect);)
};

Fatkeqësisht, kur ne instantojmë OvWindow, do të shohim vetëm një drejtkëndësh në një dritare të zbrazët dhe asnjë imazh. Nga momenti që OvWindow::repaint() ripërcakton PictWindow::repaint(), funksioni i fundit nuk do të thirret kur dritarja do të vizatohet. Ne duhej të zbatonim OvWindow Kështu që:

Klasa OvWindow: publike PictWindow(
Rectect;
virtuale void repaint() ( PictWindow::repaint(); gt_draw_rect(rect); )
publike:
OvWindow(void): PictWindow()()
};

Konstruktor OvWindow vendosi të theksojë se metoda OvWindow::repaint() duhet të shtyhet në superklasë, siç bëjnë konstruktorët. Në të vërtetë, konstruktori i objektit të prejardhur thërret nga fillimi konstruktorin e objektit përkatës. repaint() duhet t'i shtyhet metodës mëmë: në klasën bazë që e kapërcen atë.

Përfundimi: Përputhshmëri e dobët C++ / GUI

C++ u krijua për të qenë një gjuhë "statike":

  • me gjurmim token
  • kontrollimi i tipit statik
  • me hierarki statike të klasave
  • nuk ka grumbullim mbeturinash
  • me një sistem mesazhesh pa hierarki të përcaktuara në kohë përpilimi

Objektet GUI:

  • karakterizohet nga objekte dinamike, dhe shpesh të vetmet në llojin e tyre
  • priren të jetojnë shumë përtej kufijve në të cilët janë krijuar
  • hierarkitë përcaktohen në një masë të madhe nga rrjedha e ngjarjeve dhe vendndodhja e tyre, jo nga trashëgimia klasore
  • hierarkitë ndërtohen dhe shkatërrohen në kohën e ekzekutimit, shpesh në përgjigje të veprimeve të paparashikueshme të përdoruesit

C++ nuk është krijuar për të mbështetur sigurinë dinamike për mesazhet dhe transferimet (me përjashtim të përjashtimeve). E gjithë kjo çon në dyfishimin e veglave grafike dhe funksionalitetin e menaxherit të dritareve, përhapjen e kodit, përdorimin e funksioneve të pasigurta dhe braktisjen e shumë prej pikave të forta të C++.

konkluzionet

Natyrisht, të gjitha këto “ngatërresa” nuk janë fatale. C++ është një gjuhë e gjithanshme dhe e fuqishme dhe për këtë arsye e aftë për të shprehur të gjitha algoritmet e mundshme të llogaritjes. Prandaj, nëse një aplikacion kërkon veçori dinamike si ato që gjenden në tcl/tk, Skema/Tk, passhkrim dhe të ngjashme; duke përdorur C++, gjithmonë mund të bëni diçka të tillë. Nga ana tjetër, pse të mos përdorni një gjuhë ku të gjitha këto veçori janë të pranishme?

C++ është një nga gjuhët më të fuqishme dhe më të kërkuara të programimit. Qindra aplikacione shkruhen në të çdo ditë, shpesh duke përdorur një GUI. Sidoqoftë, puna me grafikë nuk është gjithmonë e përshtatshme për një programues - në këtë rast, përdoren bibliotekat grafike të gatshme. Ato do ta bëjnë sa më të shpejtë dhe të përshtatshëm zhvillimin e pjesës grafike të aplikacioneve.

SFML

Qt

Biblioteka ndër-platformë Cocos2D-X është krijuar për të thjeshtuar zhvillimin e lojërave celulare. Mbështet të gjitha të njëjtat platforma si Qt. Ndër avantazhet, vlen të përmendet disponueshmëria, lehtësia e përdorimit dhe krijimi i një projektuesi të veçantë të lojës bazuar në bibliotekën Cocos Creator. Lista e lojërave të bazuara në motor përfshin BADLAND me famë botërore, i cili funksionon në të gjitha platformat e disponueshme.

Diçka tjetër

Nëse keni nevojë të punoni me grafikë dhe animacion në vëllime të mëdha kur krijoni një lojë, atëherë është më mirë të përdorni Unity në vend të Cocos2D-X. Unity ka aftësinë për t'u integruar pa probleme me mjete si Photoshop, Maya ose Blender. Në Cocos2D-X, të gjitha grafikat shtohen nga jashtë dhe referohen nga kodi.

Nuk ka mësime për këtë bibliotekë në Runet, por ka një kurs të shkëlqyer në anglisht nga zhvilluesit.

Lëng

Ndoshta një nga bibliotekat më të famshme grafike. GTK+ është një kornizë grafike e përdorur gjerësisht në shumë sisteme. Fillimisht u konceptua si një komponent i GIMP, por në 20 vjet që nga lëshimi i versionit të parë të qëndrueshëm, ai ka gjetur përdorim në qindra aplikacione të tjera.

Tani GTK + është një kornizë grafike e plotë që nuk është inferiore ndaj të njëjtit QT. Ai mbështet gjuhë të ndryshme programimi dhe vazhdon të zhvillohet.

Diçka tjetër

Në një kohë, biblioteka u krijua si një alternativë ndaj Qt, e cila paguhej. GTK+ është një nga kornizat e pakta që mbështet gjuhën C. Biblioteka është ndër-platformë, por ekziston një mendim se programet në Linux duken më origjinale sesa në Windows ose Mac (GTK+ mbështetet mirë edhe në KDE). Interesante, për shkak të disa çështjeve ndër-platformë, Wireshark kaloi në Qt.

Një shembull i programit të parë mund të shihet në Wikipedia.

Artikuj të tjerë interesantë mbi C++ mund të gjenden këtu.

konkluzioni

Më lart janë teknologjitë më të njohura për të punuar me GUI, jo vetëm në C++, por ndonjëherë edhe në gjuhë të tjera (për shembull, Qt dhe GTK+). Sidoqoftë, gjithmonë duhet të merrni parasysh veçoritë e një teknologjie të caktuar. Shkruani një listë të veçorive të aplikacionit tuaj, lexoni përsëri përshkrimet e të gjitha bibliotekave dhe kornizave dhe vetëm atëherë zgjidhni atë që i përshtatet më shumë projektit.

Ministria e Arsimit dhe Shkencës e Federatës Ruse

Institucioni Arsimor Buxhetor Federal i Shtetit

arsimin e lartë profesional

“VAJI SHTETËROR UFA

UNIVERSITETI TEKNIK"

Departamenti i Shkencave Kompjuterike dhe Inxhinierisë Kibernetike

Krijimi i një aplikacioni GUI në Microsoft Visual Studio 2010

Mjete mësimore

për klasa laboratorike dhe praktike

me nxënësit e drejtimit

230100 (09.03.01) "Informatikë dhe Inxhinieri Kompjuterike"

Mjeti mësimor jep informacion teorik, detyra për punë praktike dhe laboratorike të lëndës “Programim”.

Manuali u drejtohet mësuesve të disiplinës, si dhe studentëve të drejtimit: 230100 “Informatikë dhe Inxhinieri Kompjuterike”.

Përpiluar nga: Gabdullina A.A., Art. pedagog në departament VTIK

Druzhinskaya E.V., Art. pedagog në departament VTIK

Recensent: Filippov V.N., Ph.D., Profesor i Asociuar i Departamentit. VTIK.

1. Informacion teorik 4

1.1. Konceptet bazë 4

1.2. Hyrje në aplikacionin Windows Form në Microsoft Visual Studio 2010 4

1.3. Kontrolli i formularit 7

1.5. Funksioni MessageBox 9

1.6. Kontrolli i kutisë së tekstit 10

2.Detyrë praktike. Hyrje në aplikacionin Windows Form në Microsoft Visual Studio 2010 12

2.1. Struktura e vlerësimit për punën e përfunduar 12

2.2. Procedura e kryerjes së punës praktike 12

3. Puna laboratorike. Zhvillimi i aplikacionit në Microsoft Visual Studio 2010 16

3.1. Urdhri i laboratorit 16

3.2. Detyra 1. Tabela e një funksioni dhe llogaritja e vlerave të tij në intervalin e specifikuar me një hap të caktuar 16

3.3. Detyra individuale 19

3.4. Detyra 2. Përpunimi i vargjeve dydimensionale 21

3.5. Detyra individuale 27

  1. Informacion teorik

  1. 1.1. Konceptet bazë

Automatizimi i proceseve të informacionit aktualisht përfaqësohet, para së gjithash, nga zhvillimi i një aplikacioni softuerik me një ndërfaqe grafike të përdoruesit (GUI) që menaxhon rrjedhat e të dhënave.

Ndërfaqja grafike e përdoruesit (GUI) është një sistem mjetesh për ndërveprimin e përdoruesit me një pajisje të bazuar në prezantimin e të gjitha objekteve dhe funksioneve të sistemit në dispozicion të përdoruesit në formën e komponentëve grafikë të ekranit (dritare, butona, shirita lëvizës, etj.).

Më shpesh, elementët e ndërfaqes në GUI zbatohen në bazë të metaforave dhe shfaqin qëllimin dhe vetitë e tyre, gjë që e bën më të lehtë për përdoruesit e papërgatitur të kuptojnë dhe zotërojnë programet. Kështu, puna e përdoruesit kryhet me format e ekranit që përmbajnë objekte kontrolli dhe shirita veglash me butona veprimi për përpunim.

Një ndërfaqe standarde grafike e përdoruesit duhet të plotësojë një sërë kërkesash:

Ruajtja e teknologjisë së informacionit të punës së përdoruesit me produktin softuer;

Përqendrohuni te përdoruesi përfundimtar që komunikon me programin në nivelin e jashtëm të ndërveprimit;

Përmbushni parimin "gjashtë", kur jo më shumë se 6 koncepte përfshihen në një shirit menuje, secila prej të cilave përmban jo më shumë se 6 opsione;

    të mbajë një qëllim të standardizuar të objekteve grafike dhe, nëse është e mundur, vendndodhjen e tyre në ekran.

Në programimin e orientuar nga objekti, ne merremi me klasa dhe objekte. Objektet janë lloje të të dhënave të përbëra: ato kombinojnë vlera të shumta në një njësi të vetme dhe na lejojnë t'i shkruajmë dhe ruajmë ato vlera me emër. Me fjalë të tjera, një objekt është një koleksion i parregulluar i pronave, secila me një emër dhe një vlerë. Vlerat e emërtuara të përfshira në një objekt mund të jenë ose lloje primitive, të tilla si numra ose vargje, ose objekte të tjera.

Kur zhvilloni aplikacione jo të konsolës, koncepti kryesor është Forma.

Një formular është një enë për pritjen e kontrolleve të mjedisit të projektimit.

Karakteristikat - aftësia për të hyrë në informacionin e ruajtur në këtë element.

Metodat janë një grup veprimesh që një objekt mund të kryejë.

Një ngjarje është një veprim i njohur nga një objekt (për shembull, një klikim i mausit, një shtypje tasti), për të cilin mund të programohet një përgjigje, d.m.th. reagimi i objektit ndaj ngjarjes.

Artikujt kryesorë të lidhur