Development of Fashion CAD System 2. GUI Basics Sungmin Kim SEOUL NATIONAL UNIVERSITY GUI GUI (Graphical User Interface) Definition ํ๋ฉด์์ ๋ฌผ์ฒด, ํ, ์์๊ณผ ๊ฐ์ ๊ทธ๋ํฝ ์์๋ค์ ์ฌ์ฉํ ์ปดํจํฐ ์ธํฐํ์ด์ค 2์ฐจ์์ด๋ 3์ฐจ์ ๊ฐ์ ๊ณต๊ฐ์์ ๊ธฐ๋ฅ์ ์์ ์ /๋ํ์ ์ผ๋ก ๋ํ๋ด๋ ๊ทธ๋ํฝ์ผ๋ก ๊ตฌ์ฑ X์์ ๊ฐ์ ํํ์ ๊ทธ๋ํฝ ์์๋ ์ญ์ ๋ ์ทจ์๋ฅผ ์๋ฏธ ํ์ผ์ ๋ํ๋ด๋ ์์ด์ฝ์ ์ด๋ํ๋ฉด ๋ณต์ฌ CUI (Command line User Interface) ์ ๋นํด ์ง๊ด์ 2
GUI GUI (Graphical User Interface) History 1963 ์ด๋ฐ์๋๋๋์ค์ผ์นํจ๋ CAD ์ํํธ์จ์ด์์กฐ์์ต์ด๋ก์์ ํ GUI ๋ฅผ๊ตฌํ 1973 ์ ๋ก์ค์ํ ์ปดํจํฐ GUI ๋ฅผ์ฌ์ฉํ๋์ต์ด์์ปดํจํฐ ( ๋ง์ฐ์ค, ํค๋ณด๋๋ฅผ์ฌ์ฉ ) 1983 ์ ํ LISA ์ ๋ก์ค์ GUI ๊ธฐ๋ฐ, ์์ ์ ์ผ๋ก์คํจ 1984 ์ ํ๋งคํจํ ์์์ ์ ์ธ์ฑ๊ณต 1984 IBM/MIT/DEC X-Window Unix, Linux ์ฉ GUI 1995 ๋ง์ดํฌ๋ก์ํํธ Windows 95 ๋ณธ๊ฒฉ์ ์ธ๊ทธ๋ํฝ์ฌ์ฉ์์ธํฐํ์ด์ค์๋์คํ 3 GUI Document-View Structure Components Document View Advantages Types ํ๋ก๊ทธ๋จ์์์ฌ์ฉํ๋๋ฐ์ดํฐ๋ฅผ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ๋์์ ์๋ด๋นํ๋๊ฐ์ฒด ํ์ผ์ ์ถ๋ ฅ๋ฐ์๋ฃ์ ์, ์ฒ๋ฆฌ๋ฑ์์ํ Document ์์๋ฃ๋ฅผ์ถ๋ ฅํด์ฌ์ฉ์๊ฐ๋ณผ์์๋๋กํ๋๊ฐ์ฒด ์ฌ์ฉ์๋ก๋ถํฐ์๋ฃ๋๋ช ๋ น์๋ฐ์๋ฌธ์์๋ด์ฉ์ํธ์ง ์๋ฃ์ํํ์๋ถ๋ฆฌ๋ก๋ชจ๋ํ๊ฐ๋ฅ ๊ฐ๋ฐํ๋ก์ธ์ค์๋จ์ํ SDI (Single Document Interface) MDI (Multiple Document Interface) 4
SDI SDI Application Document-View Type C++ Builder Application ์์ ํ์ ์ธ๊ตฌ์กฐ Form Unit Form Unit Project Dialog Unit Dialog Unit Document Unit Document Unit 5 SDI SDI Application SDI Project ๋ง๋ค๊ธฐ C++ Builder 6๋ฅผ์ด๊ณ File-Close All ๋ฉ๋ด๋ก์ด๋ ค์๋ํ๋ก์ ํธ๋ฅผ๋ซ์ File-New-Application ๋ฉ๋ด๋ก์ํ๋ก์ ํธ๋ฅผ์์ File-Save Project As ๋ฉ๋ด๋กํ๋ก์ ํธ๋ฅผ์ ์ฅ ํ์ผ์ ์ฅ์ C++ Builder project ๋ฅผ์ ์ฅํ๋ํด๋๋ฅผ๋ฐ๋ก๋ง๋๋๊ฒ์ด๋ฐ๋์งํจ ๋ชฉํ๋กํ๋์คํํ์ผ (exe) ์ด๋ฆ๊ณผ๋์ผํํด๋๋ฅผ๋ง๋ค๊ธฐ» ์คํํ์ผ์ด SDITest.exe ์ธ๊ฒฝ์ฐ D:\C++ Builder Projects\SDITest ์๊ฐ์ด๋ง๋ฆ ์ฒซ๋ฒ์งธ์ ์ฅ๋ค์ด์ผ๋ก๊ทธ๋ unit ์์ ์ฅ» SDI ์ main form ์ด๋ ์ ๋์ด๋ฏ๋ก TMainForm.cpp ๋ผ๋์ด๋ฆ์ผ๋ก์ ์ฅ ๋๋ฒ์งธ์ ์ฅ๋ค์ด์ผ๋ก๊ทธ๋ project ์์ ์ฅ» ์คํํ์ผ์์ด๋ฆ์ด๋ ๊ฒ์ด๋ฏ๋ก SDITest.bpr ์ด๋ผ๋์ด๋ฆ์ผ๋ก์ ์ฅ F9 ๋ฅผ๋๋ฌ์คํ View-Project Manager 6
SDI SDI Application SDI Project ๋ง๋ค๊ธฐ ์ ์ฒดํ๊ฒฝ์ค์ Tools-Environment options ๋ฉ๋ด๋กํ๊ฒฝ์ค์ ์ฐฝ์์ฐ๋ค Autosave options ์ Editor Files ์ Project desktop ์์ฒดํฌํ๋ค Project ์์ฑ์ค์ Project-Options ๋ฉ๋ด๋ก project option ์ค์ ์ฐฝ์์ฐ๋ค Linker tab ์์ Use Dynamic RTL ์์ฒดํฌ๋ฅผํด์ ํ๋ค Package tab ์์ Build with runtime packages ์์ฒดํฌ๋ฅผํด์ Application tab ์์ title ์ SDI Test ๋ก์ ๋ ฅํ๋ค 7 SDI SDI Application SDI Project ๋ง๋ค๊ธฐ Unit ์์ ํ๊ธฐ Project Manager ์์ TMainForm.cpp ๋ฅผ๋๋ธํด๋ฆญํด์์ฐฝ์๋ถ๋ฌ์ด F12 ํค๋ฅผ๋๋ฌ๋์์ธ๊ณผ์์ค์ฝ๋์ฌ์ด๋ฅผ์ค๊ฐ์์์ ์์ค์ฝ๋์ฐฝ์์๋์ชฝํญ์์์์คํ์ผ๊ณผํค๋ํ์ผ์์ ํํ ์์์ F12 Source Header 8
SDI SDI Application SDI Project ๋ง๋ค๊ธฐ Form ์์์ฑ๋ณ๊ฒฝ F11 ํค๋ฅผ๋๋ฌ form ์์์ฑ (property) ์ค์ ์ฐฝ (object inspector) ์์ฐ๋ค Properties ํญ์์ Name-Value ๋ก์ ์๋๊ฐ์์์ ํ๋ฉด form ์์์ฑ์๋ฐ๊ฟ์์๋ค Caption SDI Application Test Name MainForm WindowState wsmaximized 9 SDI SDI Application SDI Project ๋ง๋ค๊ธฐ ํ๋ก๊ทธ๋จ์ข ๋ฃ์ค์ ํ๋ก๊ทธ๋จ์ข ๋ฃ์ด๋ฒคํธ๋ฅผ๋ฐ์์๋๋์์ค์ Object inspector ์ Event ํญ์์ OnClose ๋ฅผ๋๋ธํด๋ฆญ TChildForm.cpp ์ event handler ์์ค์ฝ๋๊ฐ์๋์์ฑ ๋ค์์ฝ๋๋ฅผ์ถ๊ฐ User Interaction O/S Event Notification App App Event Notification 10
MDI MDI Project ๋ง๋ค๊ธฐ File-Close All ๋ฉ๋ด๋ก์ด๋ ค์๋ํ๋ก์ ํธ๋ฅผ๋ซ์ File-New-Application ๋ฉ๋ด๋ก์ํ๋ก์ ํธ๋ฅผ์์ File-Save Project As ๋ฉ๋ด๋กํ๋ก์ ํธ๋ฅผ์ ์ฅ ํด๋๋ D:\C++ Builder Projects\MDITest ์๊ฐ์ด๋ง๋ฆ MDI ์ main form ์ด๋ ์ ๋์ TMainForm.cpp ๋ผ๋์ด๋ฆ์ผ๋ก์ ์ฅ ํ๋ก์ ํธ๋ MDI Test.bpr ๋ก์ ์ฅ ํ๋ก์ ํธ์์ฑ์ค์ SDI ์๋์ผํ๊ฒ linker, packages ํญ๋ฑ์์์ฑ์์ค์ Application tab ์ title ์ MDI Test๋ก 11 MDI MDI Project ๋ง๋ค๊ธฐ TMainForm ์์์ฑ์ค์ Caption Test Color clappworkspace FormStyle fsmdiform Name MainForm WindowState wsmaximized TChildForm ์์ถ๊ฐ File-New-Form ๋ฉ๋ด๋ก์๋ก์ดํผ์์์ฑ TChildForm์์์ฑ์ค์ » Caption ( ๊ณต๋ฐฑ )» FormStyle fsmdichild» Name ChildForm TChildForm.cpp ๋ก์ ์ฅ 12
MDI Child Form ์ค์ Project-Options ๋ฉ๋ด๋ก์ค์ ์ฐฝ์๋ถ๋ฌ์ด Forms ํญ์์ Auto-create forms์ ChildForm ์์ค๋ฅธ์ชฝ Available forms ๋ก์ด๋ TChildForm.cpp ์ TChildForm.h ์์๊ฐ๊ฐ๋ค์๋ผ์ธ์์ญ์ OnClose ์ด๋ฒคํธํธ๋ค๋ฌ์์ฑ (SDI ์๋์ผ ) 13 MDI Main Form ์์ TMainForm.h ์๋ค์ํ์์ถ๊ฐ Standard component ์์๋ฉ๋ด component ๋ฅผ MainForm ์์์ฌ๋ ค๋๊ณ ๋๋ธํด๋ฆญํด์ํธ์ง 14
MDI Child Form ์ถ๊ฐ๋ฉ๋ด์ค์ New Window ๋ฅผ๋๋ธํด๋ฆญ TMainForm.cpp ์๋ฉ๋ดํด๋ฆญ์ด๋ฒคํธํธ๋ค๋ฌ์์ค๊ฐ์์ฑ๋จ ๋ค์๊ณผ๊ฐ์ด child form ์์ฌ๋์ฝ๋๋ฅผ์ถ๊ฐ 15 MDI MainForm ์ OnClose Event ์์ฑ SDI ์๋์ผํ๊ฒ์์ฑ FormClose ์ด๋ฒคํธํธ๋ค๋ฌ์ Action=caFree; ์์ฑ 16
MDI Window ๊ด๋ฆฌ๋ฉ๋ด์ถ๊ฐ MainForm ์๋ฉ๋ด๋ฅผ๋๋ธํด๋ฆญํด์์ด๊ณ ์ฐ์ธก๊ณผ๊ฐ์ด์์ ์ด๋๊ฐ๋ฉ๋ด์์ดํ ์ GroupIndex ๋ฅผ 10 ์ ๋๋ก์ค์ ๊ฐ๊ฐ์๋ฉ๋ด์์ดํ ์์ ํํ๊ณ ๋ค์์ฝ๋๋ฅผ์ถ๊ฐ 17 MDI Window ๊ด๋ฆฌ๋ฉ๋ด์ถ๊ฐ MainForm ์ object inspector ์์ WindowMenu ๋ฅผ Window1๋ก์ค์ ChildForm ์๋ฉ๋ด์ค์ ChildForm ์ standard component ์ Menu component๋ฅผ์ฌ๋ ค๋๊ณ ๋ค์๊ณผ๊ฐ์ด์์ ์ด๋ Edit ๋ฉ๋ด์ GroupIndex ๋ 1๋ก์ค์ 18
MDI 19 Project Group Project Group Management ์ฌ๋ฌ๊ฐ์ํ๋ก์ ํธ๋ฅผ๊ทธ๋ฃน์ผ๋ก๋ฌถ์ด์๊ด๋ฆฌ๊ฐ๋ฅ Project Manager ์ฐฝ์์ Project Group ์์ค๋ฅธ์ชฝํด๋ฆญ Add Existing Project ๋ฉ๋ด๋ฅผ์ ํํ๋ค์ SDITest.bpr ์์ถ๊ฐ File-Save All ๋ฉ๋ด๋ก Group ์์ ์ฅ (TestApps ๋ฑ์์ด๋ฆ์ผ๋ก ) 20
VCL VCL (Visual Component Library) ๊ฐ์ Borland ( ํ Embarcadero) ์์ Delphi์ C++ Builder ๋ฅผ์ํด๊ฐ๋ฐ RAD (Rapid Application Development) ๋๊ตฌ Property ์ Event Handler ๋ก๊ตฌ์ฑ Component ์์กฐํฉ๋ง์ผ๋ก๋ณต์กํ GUI ๊ตฌ์ฑ์ด๊ฐ๋ฅ ๊ตฌ์ฑ์์ ์๋์ฐ์ฐฝ (TForm class) ํ์ค์ปจํธ๋กค (TButton, TCheckBox, TLabel, TComboBox ๋ฑ ) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ก์ธ์ค (ADO, Active Database Object) ์ธํฐ๋ท์ฐ๊ฒฐ (Indy) ๊ธฐํ๋ฌด์ํ third-party components JEDI, TMS, TurboPower, IOComp, SDL, DA-SOFT... 21 VCL VCL ์๊ธฐ๋ณธ์ ์ธ์ฌ์ฉ๋ฒ SDI Test ํ๋ก์ ํธ๋ฅผํ์ฉ MainForm ์ WindowState property ๋ฅผ wsnormal ๋ก์ค์ MainForm ์์ TLable, TEdit, TButton, TListBox ์ปจํธ๋กค์์ฌ๋ ค๋๊ณ property ๋ฅผ์์ TLabel Caption=Text TButton Caption=Add TEdit Name=TEXT Text=empty TListBox Name=LIST TButton Caption=Clear 22
VCL VCL ์๊ธฐ๋ณธ์ ์ธ์ฌ์ฉ๋ฒ ๊ตฌํ๋ชฉํ Edit box ์๋ด์ฉ์์ ๋ ฅํ๊ณ Add ๋ฒํผ์๋๋ฅด๋ฉด List box ์์ถ๊ฐ๋จ Clear ๋ฒํผ์๋๋ฅด๋ฉด List box ์๋ด์ฉ์ด์ง์์ง ๊ตฌํ๋ฐฉ๋ฒ 'Add' ๋ฒํผ์์ ํํ๊ณ object inspector ์ event ์์ OnClick ์๋๋ธํด๋ฆญ» ์ฌ์ฉ์๊ฐ๋ฒํผ์ํด๋ฆญํ์๋๋ฐ์ํ๋ event ์ handler ๊ฐ์๋์ผ๋ก์์ฑ๋จ» Event handler ๋ด๋ถ์๋ค์์ฝ๋๋ฅผ์ถ๊ฐ void fastcall TMainForm::Button1Click(TObject *Sender) { LIST->Items->Add(TEXT->Text);» '->' ์ฐ์ฐ์๋๊ฐ์ฒด์ property ๋ method ๋ฅผ์ฐธ์กฐ (refer) ํ๊ธฐ์ํด์ฌ์ฉ» Items ๋ TListBox ๊ฐ์ฒด์ property ์คํ๋ (List ์ํ์ํ ๋ฌธ์์ด๋ค์๋ชจ์ )» Add ๋ TListBox ๊ฐ์ฒด์ method ์คํ๋ ( ๋ฆฌ์คํธ๋ฐ์ค์์ฃผ์ด์ง๋ฌธ์์ด์๋ํ๋ method)» Text ๋ TEdit ๊ฐ์ฒด์ property ์คํ๋ (Edit ์นธ์์ ๋ ฅํ๋ฌธ์์ด์๋ด์ฉ ) 23 VCL VCL ์๊ธฐ๋ณธ์ ์ธ์ฌ์ฉ๋ฒ ๊ตฌํ๋ฐฉ๋ฒ 'Clear' ๋ฒํผ์์ ํํ๊ณ object inspector ์ event ์์ OnClick ์๋๋ธํด๋ฆญ Event handler ๋ด๋ถ์๋ค์์ฝ๋๋ฅผ์ถ๊ฐ void fastcall TMainForm::Button2Click(TObject *Sender) { LIST->Items->Clear();» Clear ๋ List Box ์ Items property ์ method» Items ๋ List Box ์ Property ์ด๋ฉด์๊ฐ์ฒด์ด๋ฏ๋ก๋๋ค์ property ์ method ๋ฅผ๊ฐ์ง์์์ 24
VCL VCL ์๊ธฐ๋ณธ์ ์ธ์ฌ์ฉ๋ฒ TCheckBox, TRadioButton Checked property ๊ฐ์ด true/false ๋ก๋ณํ TRadioGroup Radio button ์ผ๋ก์ค์ ํ ์ต์ ์ด์ฌ๋ฌ์ข ๋ฅ์ธ๊ฒฝ์ฐ์ฌ์ฉ TComboBox Edit ์ ListBox ๋ฅผ๊ฒฐํฉํํํ (Drop down list box) ์ผ๊ด๋์ฌ์ฉ๋ฐฉ๋ฒ์๋ฐ๋ฆ VCL Object ๋ Property ์ Method ๋ฅผ๊ฐ์ง Event Handler ๋ฅผ๊ฐ์ง๋ VCL ์ด์์ ๋ฒํผํด๋ฆญ ๋ด์ฉ๋ณ๊ฒฝ ํ์ด๋จธ์ค์ 25 VCL Custom Dialog Box ๋ง๋ค๊ธฐ ๋ชฉํ Edit, Check Box, Radio Group ์๊ฐ์ง๋ dialog box ๋ฅผ๋ง๋ค๊ธฐ ์ฌ์ฉ์์ ๋ ฅ์๋ฐ์์ํ๋ฉด์ํ์ ๊ตฌํ๋ฐฉ๋ฒ File-New-Form ์ผ๋ก Form ์์ถ๊ฐ ๋ค์๊ณผ๊ฐ์ด property ๋ฅผ๋ณ๊ฒฝ» BorderIcons bisystemmenu, biminimize, bimaximize, bihelp ๋ชจ๋ false» BorderStyle bsdialog» Caption User Input» Name UserInputDialog» Position poscreencenter 26
VCL Custom Dialog Box ๋ง๋ค๊ธฐ ๋ค์๊ณผ๊ฐ์ด control ์๋ฐฐ์นํ๊ณ property ๋ฅผ์์ Name=NAME Name=MEMBER Name=Interest Items=Music, History, Science, Literature ItemIndex=0 27 VCL Custom Dialog Box ๋ง๋ค๊ธฐ 'Ok' ์ 'Cancel' ๋ฒํผ์๋๋ธํด๋ฆญํด์๊ฐ๊ฐ event handler ๋ฅผ๋ง๋ค๊ณ ๋ค์์ฝ๋๋ฅผ์ ๋ ฅ void fastcall TUserInputDialog::Button1Click(TObject *Sender) { Result=1; Close(); void fastcall TUserInputDialog::Button2Click(TObject *Sender) { Result=0; Close(); TUserInputDialog.h ํ์ผ์๋ค์์ฝ๋๋ฅผ์ถ๊ฐ public: // User declarations fastcall TUserInputDialog(TComponent* Owner); ; int Result; 28
VCL Custom Dialog Box ๋ง๋ค๊ธฐ TMainForm.cpp ํ์ผ์ header ํ์ผ์์ถ๊ฐ Main Form ์ 'Open' ๋ฒํผ์ํ๋์ถ๊ฐ Open ๋ฒํผ์ OnClik event handler ๋ฅผ์์ฑ #pragma hdrstop #include "TMainForm.h" #include "TUserInputDialog.h" void fastcall TMainForm::Button3Click(TObject *Sender) { UserInputDialog->ShowModal(); if (UserInputDialog->Result==1){ LIST->Items->Add(UserInputDialog->NAME->Text); if (UserInputDialog->MEMBER->Checked==true){ LIST->Items->Add("Member"); else{ LIST->Items->Add("None Member"); int n=userinputdialog->interest->itemindex; LIST->Items->Add(UserInputDialog->INTEREST->Items->Strings[n]); LIST->Items->Add("-----"); 29 VCL Custom Dialog Box ๋ง๋ค๊ธฐ Open ์๋๋ฌ์ dialog ๋ฅผ์ด๊ณ ์ ๋ ฅํ ์คํธ 30