SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 1 
Visual C++) Lecture №1-2
Виндоуз орчинд Визуаль С++ хэл ашиглан программ бичих
Microsoft Visual C++
Microsoft Visual C++ нь С болон С++ хэл дээр төрөл бүрийн программ бичихэд зориулагдсан.
Өөрөөр хэлбэл Windows орчны программыг С++ хэлийг ашиглан бичихэд зориулагдсан. Мөн
MFC (Microsoft Founded Classes) –г ашиглан өөрийн программын хүчин чадлыг нэмэгдүүлэх
боломж олгодог Визуаль Программчлалын Орчин юм. Визуаль С++ нь таны программ бичих бүх
алхмуудыг (бичиглэл нэмэх, хөрвүүлэх, ажиллуулах, ажиллагааг шалгах, программыг оновчтой
болгох) хянаж чиглүүлж өгнө.
Visual C++ -г ажиллуулахдаа дараах алхмуудыг гүйцэтгэнэ.
1. Windows –н Start цэсний Programs дэд цэсийг сонгоно.
2. Microsoft Visual C++ 6.0 –г сонго. (хэрэв та Visual C++-н зөвхөн дангаараа байдаг
хэлбэрийг суулгасан бол Microsoft Visual C++ 6.0 -г, Microsoft Visual Studio -н нэгэн
хэсэг болдог хэлбэрийг суулгасан бол Microsoft Visual Studio 6.0 -г сонгож доторхи
жагсаалтаас Visual C++-г сонгоно)
3. Дээрхи цонх нь танд Visual C++-г ашиглах бяцхан заавруудыг өгнө. Next Tip товчийг
даран дараагийн зааврууд руу орж болно. Close товчийг дарж ажилдаа орно.
Visual C++ хэл дээр бичигдэж байгаа программын зүрхэн хэсгийг Ажлын зайд (WorkSpace)
агуулагдах прожект (project) гэж хэлж болно. Нэг ажлын зайд хэд хэдэн прожект байж болно.
Жишээ нь хэрэв та DLL (Dynamic Link Library) файл бичиж байгаа бол түүний ажиллагааг шалгах
программыг тухайн ажлын зайд үүсгэж болно.
Прожект файл нь .dsp (developer studio project) өргөтгөлтэй байх ба үүнд программд
хамаарах файлууд тухай мэдээллийг агуулахаад гадна Visual C++ программыг хэрхэн
ажиллуулах, хөрвүүлэх талын тохируулгуудыг мөн агуулна.
Прожект файл үүсгэх болгонд ажлын зай үүсэх ба .dsw (developer studio workspace)
өргөтгөлтэй байна. Үүнд Visual C++ -н аль цонх харагдаж аль нь харагдахгүй байгаа зэрэг
мэдээллүүдийг агуулна. WorkSpace нь программын кодыг 3 хэлбэрээр харуулна.
1. Class View программын кодыг С++ хэлний обьект (class) –н түвшингээр харуулна.
Мод хэлбэрээр харуулах ба обьектуудыг гишүүн өгөгдөл, гишүүн функцийг харуулна.
2. Resource View программын төрөл бүрийн санг (цонх, цэс, зураг) харуулах ба засвар
хийх боломжийг олгоно.
3. File View программын бүх файлуудыг харуулна.
• Прожектийн тохируулгыг Project цэсний Settings командыг
• WorkSpace –ийн тохируулгыг Tools цэсний Options болон Customize командуудыг
сонгосноор хийж болно.
Шинээр прожект үүсгэх Анхны программ
Энэ программ нь 2 товчтой цонх ба эхний товчийг дарахад Hello гэсэн мэдээлэл гарч ирдэг,
удаах товчийг дарахад программаас гардаг. Шинээр прожект үүсгэхийн тулд дараах алхмуудыг
гүйцэтгэнэ.
1. Шинээр прожектийн ажлын зай үүсгэнэ.
2. Application Wizard-г ашиглан программын код болон санг үүсгэнэ.
3. Үүссэн санд буй цонхны харагдах байдлыг өөрийн үзэмжээр өөрчлөнө.
4. Кодод Hello мэдээлэл гаргах үйлдлийг нэмнэ.
5. Программын зургийг (icon) солино.
Шинээр прожектийн ажлын зай үүсгэх.
1. File цэсээс New командыг сонгоно.
Визу
Бол
уал програ
о
Прог
Прог
амчлал СИ
овсруулсан
2. P
3. P
4. L
5. O
A
AppWiza
гүйцэтгэн
1
2
3
4
5
6
7
8
9
1
граммын цо
раммын хар
1. Reso
2. Dialo
хара
3. TODO
4. Canc
хэмж
5. Хулга
Prope
6. Гарч
цонх
И++ хичээл
н багш: Т.
Projects хэсгэ
Project Name
Location хэсэ
Ok товчийг
AppWizard-г
ard-г ашигл
нэ.
. Алхам 1-
2. Алхам 2-
3. Програм
Applicatio
4. Алхам 3
алхамд ш
5. Finish то
6. Ok товчи
7. Програм
Хөрвүүлэ
8. Хөрвүүлэ
анхааруу
9. Build цэс
0. Таны пр
гэсэн 2 т
онхны хара
рагдах байдл
ource View хэ
og –г дэлгэхэ
гдах байдал
O мэдээлли
cel товчийг з
жээгээр өөрч
аны баруун
erties коман
ирэх цонхн
ыг хаа. Энэ
лийн лекц
.Уламбаяр
ээс MFC Ap
e хэсэгт прож
эгт прожекти
дар. Ингэхэ
эхлүүлнэ.
лан програ
-д Dialog Ba
-д ActiveX C
мын нэр би
on гэж бичээ
3-д өөрчлөл
шилжинэ.
вчийг дарах
ийг дарж про
м үүссэний
элт хийж ба
элт хийж
улгын тоог х
сээс Execute
рограмм нэг
товч байна. А
агдах байдл
лыг дараах
эсгийг сонго
эд гарч ирэх
л гарч ирнэ.
ийг тэмдэглэ
зөөж цонхны
чил.
товчийг Can
дыг сонго.
ы Caption хэ
гарч ирэх ц
ийн хураа
р
ppWizard (ex
жектийн нэр
ийн байрлах
эд 2 үйлдэл
ммын код
sed Applicat
Controls тэмд
чих хэсэгт б
эд Next товч
т хийлгүй х
хад үүсэх пр
ограммын ко
й дараа Bui
айх явцыг Ou
дууссаны
харуулна.
e Hello.exe ко
г цонхтой б
Аль нэг товч
лыг өөрчлө
байдлаар ө
о
х IDD_HELLO
ээд устга. (de
ы дээр авчир
ncel товчин
эсэгт буй ут
цонхон дээр
ангуй
xe)-г сонго.
рийг (Hello) б
х замыг зааж
л хийгдэнэ:
болон са
tion-г сонго.
дэглэгээг ари
байгаа Hello
ч дар.
хэвээр үлдэ
рограммын т
од болон са
ild цэсээс B
utput цонхно
дараа про
омандыг сон
а түүн дээр
чийг даран п
өх
өөрчилье. Үү
O_DIALOG н
el товч)
рах ба өргөн
дээр даран
гыг &Close б
тухайн товч
бич.
ж өгнө.
: прожектий
нг үүсгэхдэ
Next товчий
илга.
o үгийг арил
ээгээд Next
талаар мэдэ
нг үүсгэнэ.
Build Hello.e
оос харж бол
ограммд ба
нгон програ
р TODO мэ
программыг
үний тулд
нэрэн дээр 2
нийг нь цонх
гарч ирэх ц
болгон өөрч
ч буюу контр
йн директоррыг үүсгэнэ..
ээ дараах алхмуудыгг
йг дар.
лган My Firstt Visual C+++
товч дарж төгсгөлийнн
ээлэл гарч ирнэ.
exe команды
лно.
ыг сонгоно..
айгаа алдаа болонн
ммаа ажилл
эдээлэл ба
г дуусгана.
луулна.
OK, Cancell
2 товшиход цонхны
хны өргөний
цэсээс (Popuup menu)
члөөд Ok тов
ролын шинж
Page 2
вчийг дарж
ж чанарууд
2 
Визу
Бол
уал програ
о
Прог
байн
Прог
Прог
Прог
үүний
Даал
 
 
амчлал СИ
овсруулсан
гарч
ID хэ
боло
7. Ok то
&Hel
8. Прог
раммын тов
а.
граммд үйл
раммд үйлд
1. Hello
Class
2. Дара
нэмэ
3. Mess
нэмэ
4. Нэмс
5. Өөрч
// TO
гэсэн
6. Mess
гэсэн
7. Прог
раммын зур
йг солих ша
1. Reso
2. Дэлгэ
3. Прог
хийсн
хэлбэ
лгавар:
1. Abou
2. Үндс
3. Hello
болго
4. Mess
И++ хичээл
н багш: Т.
ирэх ба тэд
эсэгт контрол
охгүй.
овчийг зураг
lo болгон өө
раммаа хөр
вчуудыг дара
лдэл нэмэх
длийг нэмэхд
o товчинд үй
s Wizard ком
аах цонх гар
эх обьектийн
sages хэсгээ
эх эсэхийг ас
сний дараа E
члөлт хийхдэ
DO: Add you
н үйдлийн да
sageBox("He
н мөрийг нэм
раммын ажи
ргийг солих.
ардлагатай
ource View ->
эцэнд гарч и
раммаа ажи
нээр програ
эрийг харж
ut цонхон дээ
эн цонхны M
o ба Bye хэм
он өөрчил.
sageBox фун
лийн лекц
.Уламбаяр
дгээрийг про
лын нэрийг
гт харагдах
өрчил.
рвүүлэн ажил
ахад Close т
дээ Visual C
йлдэл нэмэхд
мандыг сонго
ч ирэх ба үү
н ID (IDHELL
эс BN_CLICK
суух ба Ok т
Edit Code то
ээ
ur control not
араа өөрийн
ello. This is m
м.
иллагааг ша
AppWizard н
. Үүний тулд
> Icon -> IDR
ирэх зураг з
иллуулахад
аммын тухай
болно.
эр Bye хэмэ
Minimize бол
мээн мэдээлэ
нкцийг судла
ийн хураа
р
граммист өө
бичих ба эн
байдлаар ө
ллагааг нь ш
товч програ
C++ Class Wi
дээ товчин д
оно.
үнд дээр обь
LO)–г сонгон
KED –г сонго
товчийг дара
овчийг даран
tification han
н үйлдлүүди
my first Visua
алга.
нь программ
д
R_MAINFRA
урах хэрэгсл
өөрчилсөн з
й мэдээллий
ээн мэдээлэ
лон Maximize
эл гаргадаг
ан гарч ирэх
ангуй
өрийн сонир
нэ нэр нь өөр
өрчлөөд ID
шалга.
ммыг хааж H
izard-г ашигл
дээр баруун
ьектуудын ID
но.
оод Add Fun
ан функцийг
н тухайн фу
ndler code he
ийг нэмнэ.
al C++ Applic
мын зургийг
ME-р дээр 2
лүүдийн аш
зураг харагд
йг гаргах цон
л гаргадаг т
e товчнууды
цонхны HEL
х товч болон
рхлын дагуу
р контролын
утгыг IDHEL
Hello товч п
лана.
н товчийг да
D (Object ID
nction товчий
г нэмнэ.
ункцэд өөрчл
ere
cation!");
автоматаар
2 товшилт хи
шиглан зурги
дах ба Abou
нхон дээрээ
товч нэм.
ыг гарга.
LLO нэрийг
н зургийг өө
у өөрчилж бо
н нэртэй дав
олно. Үүний
вхцаж
LLO, captionn утгыг
рограммыг ххаахгүй
аран гарч иррэх цэсээс
s)-с өөрийн үйлдэл
йг дарна. Эннэ функц
лөлт хийнэ.
р (MFC) үүсггэдэг ба
ий.
йг өөрчил.
ut Hello сонго
с зургийн то
олтыг
ом
My First Appplication
өрчил.
Page 33 
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 4 
Lecture № 3-4
Өөрийн программд стандарт контролуудыг ашиглах
Виндовс орчны бүх программуудад (buttons, check boxes, text fields, and drop-down list boxes)
зэрэг контролуудыг ашигласан байдаг. Эдгээрийн системээс авч ашигладаг ба бэлэн үүссэн
байдаг. Үүнийг Визуаль С хэл дээр авч ашиглах нь маш хялбар байдаг.
Бидний өнөөдөр сурах зүйлс:
• Хувьсагчуудыг хэрхэн зарлах ба тэдгээрийг хэрхэн контролуудад хавсаргах
• Контрол ба хувьсагчуудын утгыг хэрхэн хооронд нь зохицуулах
• Контролуудын ажиллагаанд хэрхэн үйлдэл оруулах
• Программын ажиллагааны явцад контролуудын төлөв байдлыг хэрхэн программчлах
Үндсэн контролууд
Виндоузын стандарт контролуудад олон төрлийн контролууд байдаг боловч өнөөдөр бид
дараах контролуудыг үзнэ:
• Static text
• Edit box
• Command button
• Check box
• Radio button
• Drop-down list box (combo box)
Эдгээр нь визуаль С++-д бэлэн байдаг бөгөөд шууд авч ашиглах боломжтой. Тэдгээрийг
визуаль С –н Dialog Painter-с авч болно. Зураг 1.
Static Text Control
Үүнийг хэрэглэгчид контролын нэр болон элдэв тайлбарыг текст байдлаар харуулахад
ашиглана. Хэрэглэгч ажиллагааны явцад текстийг нь өөрчлөх боломжгүй. Гэвч үүний
текстийг программист программын аргаар өөрчилж болно.
Edit Box Control
Энэ нь хэрэглэгч текст бичих ба текстийг өөрчлөх зориулалттай. Өөрөөр хэлбэл энэ нь
программд хэрэгтэй өгөгдлийг хэрэглэгчээс оруулахад ашиглагддаг үндсэн контрол.
Гэхдээ энэ нь зөвхөн ердийн текстийг өруулахыг зөвшөөрдөг.
Command Button Control
Энэ нь хэрэглэгч ямар нэгэн үйлдлийг хийх команд өгөхөд ашиглагддаг. Командын товч контрол
нь нэртэй байх ба зарим тохиолдолд зураг байж болно.
Check Box Control
Энэ нь ямар нэгэн утга үнэн, худал (сонгогдсон эсвэл сонгогдоогүй) гэсэн утга илэрхийлэх үед
ашиглагддаг.
Radio Button Control
Энэ нь Vheck Box-той адил боловч бүлэг байдлаар хэрэглэгддэг буюу олон элементээс аль нэг
нь сонгогдсон гэсэн утга илэрхийлдэг.
Drop-Down List Box Control
Drop-down list box эсвэл combo control нь олон мөр төрлийн жагсаалтаас аль нэгийг нь эсвэл хэд
хэдийг сонгосон гэсэн утга илэрхийлдэг.
Одоо дээрх контролуудыг программд хэрхэн ашиглах талаар жишээ авч үзье. Доорхи жишээ нь
контролуудын утгыг хэрхэн программд ашиглах, контролуудын төлөв байдлыг хэрхэн өөрчлөх,
мөн нэг программаас өөр программыг хэрхэн дуудаж ажиллуулах зэрэг талаар ойлголт өгнө.
Үүний тулд
1. Dialog Based, MFC EXE Application шинээр үүсгэнэ. Өмнөх лабораторид үзсэн шиг.
Прожектийн нэрийг Day2 гэж өгнө.
2. Контролуудыг цонхон дээр байрлуулна.
Object Property Setting
Static Text ID IDC_STATIC
Caption
This is an example of a Visual C++ Application using a
number of controls.
Static Text ID IDC_STATICMSG
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан   Page 5 
Caption Enter a &Message:
Static Text ID IDC_STATICPGM
Caption Run a &Program:
Edit Box ID IDC_MSG
Button ID IDC_SHWMSG
Caption &Show Message
Button ID IDC_DFLTMSG
Caption &Default Message
Button ID IDC_CLRMSG
Caption &Clear Message
Button ID IDC_RUNPGM
Caption &Run Program
Button ID IDC_EXIT
Caption E&xit
Combo Box ID IDC_PROGTORUN
Group Box ID IDC_STATIC
Caption Enable Actions
Group Box ID IDC_STATIC
Caption Show Actions
Check Box ID IDC_CKENBLMSG
Caption &Enable Message Action
Check Box ID IDC_CKENBLPGM
Caption E&nable Program Action
Check Box ID IDC_CKSHWMSG
Caption S&how Message Action
Check Box ID IDC_CKSHWPGM
Caption Sh&ow Program Action
Мөн Tab товчоор шилжих дарааллыг тодорхойлно. (Layout цэсний Tab Order команд)
Combo Box-н төрийн жагсаалтанд утгыг дараах байдлаар нэмнэ. Шинэ мөр нэмэхдээ
багш: Т.Уламбаяр
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 6 
ctrl+Enter товчнуудыг хамт дарна.
3. Контролуудад хувьсагч хавсаргана. Визуаль С++ д контролуудыг хувьсагчтай
хамтруулж ашигладаг өөрөөр хэлбэл контрол дахь утгыг хавсаргасан хувьсагчаар
дамжуулан программд ашиглах мөн контролын текстийг хувьсагчаар дамжуулан
өөрчлөх зэрэг үйлдлийг хийхэд ашиглана. Үүний тулд UpdateData(boolean arg)
функцыг ашигладаг. Энэ функцын arg аргументад TRUE утга өгвөл контролоос утга
авах, FALSE утга өгвөл контолын утгыг хавсаргасан хувьсагчийн нь утгаар өөрчлөх
үйлдлийн гүйцэтгэнэ. Контролуудад хувьсагч хавсаргахын тулд дараах алхмуудыг
гүйцэтгэнэ.
1. Class Wizard-г нээ.
2. Member Variables хавтсыг сонго.
3. Хувьсагч хавсаргах контролынхоо ID –г сонго. (IDC_MSG)
4. Add Variable товчийг дар.
5. Дээрх байдлаар хувьсагчаа өгнө.
6. Бусад контролуудад хувьсагч хавсаргахын тулд 3-5 алхмуудыг давтан хийнэ.
4. Бидний программд дараах хувьсагчуудыг хавсаргах шаардлагатай.
Control Variable Name Category Type
IDC_MSG m_strMessage Value CString
IDC_PROGTORUN m_strProgToRun Value CString
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 7 
IDC_CKENBLMSG m_bEnableMsg Value BOOL
IDC_CKENBLPGM m_bEnablePgm Value BOOL
IDC_CKSHWMSG m_bShowMsg Value BOOL
IDC_CKSHWPGM m_bShowPgm Value BOOL
5. Хувьсагчидаа хавсаргаж дууссан бол Class Wizard2-г хаа.
6. Контролуудад хийгдэх үйлдлийг программчилна. Бидний программын хувьд эхлэ
цонх үүсэхэд контролууды
эд
н анхны утгыг хавсаргасан хувьсагчидаар дамжуулан
essage Maps хавтасны member functions хэсгээс OnInitDialog
3. TOD кодыг нэмнэ.
хаар утга олгож байна.
ролууд руу, эсрэг тохиодолд контролуудаас
үүргийг
өмнөх
2. Edit Cod гдсэн функц дээр үйлдэл нэмнэ.
id CDay
control notification handler code here
3. Show M аах үйлдлийг нэм.
id CDay
тодорхойлно. Үүний тулд
1. Class Wizard-н M
функцыг сонго.
2. Edit Code товчийг дар.
O тэмдэглэгээний дараа өөрийн программын
TODO: Add extra initialization here
//message цонхон дээр олгох анхны текст
re";m_strMessage = "Place a message he
гогдсон бай//бүх checkbox-уудыг сон
m_bShowMsg = TRUE;
m_bShowPgm = TRUE;
m_bEnableMsg = TRUE;
m_bEnablePgm = TRUE;
// дээрх утгуудаар контролуудыг идэвхжүүлж байна.
UpdateData(FALSE);
4. UpdateData функц нь контрол болон хувьсагчдын хоорондох тулхүүр болдог.
Өөрөөр хэлбэл хувьсагчдаас контролууд руу эсвэл контролуудаас хувьсагчууд
руу утгыг дамжуулах үүргийг гүйцэтгэдэг. Үүнийг аргументын утгаас хамаарч
хийнэ. Худал бол хуьсагчдаас кон
хувьсагчид руу утгыг дамжуулна.
5.
7. Товчнуудын хийх үйлдлийг хийж өгье. Эхлээд программаас гарах Exit товчны
хийе. Үүний тулд
Class Wizard-с IDC_EXIT обьектын BN_CLI1. CKED message дээр
лаборатори дээрх шиг функц нэм.
e
o
товчийг дарж нэмэ
v 2Dlg::OnExit()
{
// TODO: Add your
OnOK();
}
e
o
ssage товчин дээр дар
v 2Dlg::OnShwmsg()
{
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 8 
dler code here
UpdateData(TRUE);
а хөрвүүлж шалгахад Show Message товчийг дарахад дараах цонх
рч ирнэ.
5. Clear M ge товчин дээр дараах кодыг хий.
ation handler code here
m_strMessage="";
6. уд дээр үүргийг нь нэмэх шаардлагатай. Дараах
//IDC_CKENBLMSG –д
oid CDay
nable Message Action check box тэмдэглэгдсэн байна уу?
tDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);
tDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
tDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);
TATICMSG)->EnableWindow(FALSE);
//IDC_CKSHWMSG –д
our control notification handler code here
// Get the current values from the screen
tDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);
tDlgItem(IDC_STATICMSG)->ShowWindow(TRUE);
// TODO: Add your control notification han
MessageBox(m_strMessage);
}
4. рограммаП
га
essa
v 2Dlg::OnClrmsg()oid CDay
{
// TODO: Add your control notific
UpdateData(FALSE);
}
Мөн CheckBox контролу
кодуудыг нэмж өг.
v 2Dlg::OnCkenblmsg()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
// E
if (m_bEnableMsg == TRUE)
{
// тэмдэглэгдсэн байвал
GetDlgItem(IDC_MSG)->EnableWindow(TRUE);
GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);
GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);
Ge
Ge
}
else
{
// тэмдэглэгдээгүй байвал
GetDlgItem(IDC_MSG)->EnableWindow(FALSE);
GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);
GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);
Ge
GetDlgItem(IDC_S
}
}
v y2Dlg::OnCkshwmsg()oid CDa
{
// TODO: Add y
UpdateData(TRUE);
// Is the Show Message Action check box checked?
if (m_bShowMsg == TRUE)
{
// Yes, so show all controls that have anything
// to do with showing the user message
GetDlgItem(IDC_MSG)->ShowWindow(TRUE);
GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);
GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);
Ge
Ge
}
else
{
// No, so hide all controls that have anything
// to do with showing the user message
GetDlgItem(IDC_MSG)->ShowWindow(FALSE);
GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);
GetDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 9 
_CLRMSG)->ShowWindow(FALSE);
GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);
функц бөгөөд харин GetDlgItem(IDC_DFLTMSG) функц нь
ектын эцэг класс болох CWnd классын
лж ажиллагааг нь шалга.
Программаас өөр программ ажиллуулах үйлдлийг ComboBox-н сонголтоос хамааруулан Run Program товчинд нэмнэ.
(IDC_RUNPG
()
n handler code here
gmName
rPgmNa
_SHOW);
rPgmNa
WinExec("sol.exe",SW_SHOW);
);
10.
Даалгавар:
nter a message here” мөрийг EditBox-д хийх үйлдлийг
2. Program Action-ы үйлдлүүдийг нэм.
3. OnRunpgm функцийг хэрэглэгч өөрөө программ зааж ажиллуулдаг болгон өөрчил.
 
 
GetDlgItem(IDC
}
}
8. Өмнө бичсэн программын кодыг тайлбарлавал
1. Контролуудаас хувьсагчид утгыг нь авна. (UpdateData(TRUE);)
2. CheckBox тэмдэглэгдсэн эсэхийг шалгана.
3. Хэрэв утга ҮНЭН бол контролуудыг идэвхжүүлэх эсвэл харагдуулах
(EnableWindow(TRUE), ShowWindow(TRUE);) үйлдлийг хийнэ.
4. Эсрэг тохиолдолд контролуудыг идэвхгүй болгох эсвэл нууцлах
(EnableWindow(FALSE), ShowWindow(FALSE);) үйлдлийг хийнэ. Энэ функц нь CWnd
хэмээх классын гишүүн
IDC_DFLTMSG идентификатортой обь
заагч утгыг буцаадаг.
9. Программаа хөрвүү
M)
void CDay2Dlg::OnRunpgm
{
// TODO: Add your control notificatio
UpdateData(TRUE);
CString strPgmName;
strP =m_strProgToRun;
strPgmName.MakeUpper();
if (st me=="PAINT")
WinExec("pbrush.exe",SW
if (st me=="SOLITAIRE")
if (strPgmName=="NOTEPAD")
WinExec("NotePad.exe",SW_SHOW
}
Программыг хөрвүүлж ажиллагааг шалга.
1. Default Message товчийг дарахад “E
нэм.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 10 
Lecture №5-6
цонхтой программ бичих дадлага эзэмшинэ. Дараах
рааллаар хийнэ үү!
cation үүсгэ.
2.
ролууд болон ад хавсаргах хувьсаг
чанар
Сэдэв: Программд шинээр диалог нэмэх
Өнөөдөр бид хэд хэдэн
да
1. My Documents директорт Dialogs нэртэй Dialog Based Appli
Үндсэн цонхны харагдах байдлыг дараах байдлаар өөрчил.
3. Конт контролууд чид.
Төрөл Шинж Утга
Command Button ID IDC_BSHWFONTDLG
Caption Show Font Dialog
Command Button ID IDC_BSHWPICDLG
Caption ShowPicture Dialog
Command Button ID IDC_BSHWCSTMDLG
Caption Show Custom Dialog
Command Button ID IDC_BSHWFOPENDLG
Caption pen DialogShow File O
Command Button ID IDC_BEXIT
Caption Exit
Group Box ID IDC_GBTOOL
Caption Drawing Tool
Disabled Checked
Group Box ID IDC_GBSHAPE
Caption Drawing Shape
Disabled Checked
Group Box COLORID IDC_GB
Caption Color
Disabled Checked
Radio Button NID IDC_RTPE
Caption Pen
Group Checked
Disabled Checked
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 11 
dio Button BRUSHRa ID IDC_RT
Caption Brush
Disabled Checked
Radio Button TMAPID IDC_RTBI
Caption Bitmap
Disabled Checked
Radio Button SLINEID IDC_R
Caption Line
Group Checked
Disabled Checked
Radio Button RCLEID IDC_RSCI
Caption Circle
Disabled Checked
Radio Button UAREID IDC_RSSQ
Caption Square
Disabled Checked
Radio Button BLACKID IDC_RC
Caption Black
Group Checked
Disabled Checked
Radio Button CBLUEID IDC_R
Caption Blue
Disabled Checked
Radio Button GREENID IDC_RC
Caption Green
Disabled Checked
Radio Button CCYANID IDC_R
Caption Cyan
Disabled Checked
Radio Button RCREDID IDC_
Caption Red
Disabled Checked
Radio Button ENTAID IDC_RCMAG
Caption Magenta
Disabled Checked
Radio Button LLOWID IDC_RCYE
Caption Yellow
Disabled Checked
Radio Button WHITEID IDC_RC
Caption White
Disabled Checked
Command Button ID IDC_BOPENBMP
Caption Choose Bitmap File
Disabled Checked
Static Text ID IDC_OPTION
Caption ng><Null Stri
Static Text ID IDC_TEXT
Caption ><Null String
Static Text ID IDC_STATIC
Caption File Name:
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 12 
Edit Box ID IDC_EFILEPATH
Контролуудад хавсаргасан хувьсагчид.
4. Exit товчийг дарахад цонхыг хаах үйдлийг нэм.
5. Show File Open Dialog товчийг дарахад гүйцэтгэх үйлдэл
void CDialogsDlg::OnBshwfopendlg()
{
// TODO: Add your control notification handler code here
CFileDialog m_ldFile(TRUE);
if (m_ldFile.DoModal()==IDOK)
{
//Хэрэв ямар нэг файл сонгогдсон бол нэрийг нь авах
m_strResults=m_ldFile.GetFileName();
UpdateData(FALSE);
}
}
6. Программаа хөрвүүлээд ажиллагааг нь шалга.
7. Show Custom Dialog товчийг дарахад хийгдэх үйлдлийг нэмнэ. Энэ нь
программистийн нэмсэн цонхыг modal хэлбэрээр харагдуулах ба хэрэглэгчээр
нэг сонголт хийлгэх ба мөн текстийг гараас оруулах ба оруулсан текстийг
IDC_TEXT контролд, сонголтыг IDC_OPTION контрол текст хэлбэрээр
дамжуулах үйлдлүүд байна. Эдгээр үйлдлүүдийг дараах алхмаар хийнэ.
7.1. Шинээр диалог нэмнэ. Resource View->Dialogs(right click)-
>Insert Dialog.
7.2. Нэмэгдсэн диалогийн ID-г IDD_MSG_DIALOG болгон өөрчил.
7.3. Харагдах байдлыг доорхиор өөрчил.
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 13 
7.4. Контролууд
Төрөл Шинж чанар Утга
Command Button ID IDOK
Caption Ok
Command Button ID IDCANCEL
Caption Cancel
Group Box ID IDC_STATIC
Caption Select an Option
Radio Button ID IDC_RADIO1
Caption Option1
Group Checked
Radio Button ID IDC_RADIO2
Caption Option2
Radio Button ID IDC_RADIO3
Caption Option3
Radio Button ID IDC_RADIO4
Caption Option4
Static Text ID IDC_STATIC
Caption Enter a Message
Edit Box ID IDC_EDIT1
7.5. Диалог үүсгээд харагдах байдлыг өөрчлөхөөс гадна программд
дамжуулан ашиглах обьектыг үүсгэх хэрэгтэй. Үүний тулд тухайн
диалогийн Class Wizard цонхыг нээхэд шинэ класс үүсгэх эсэхийг
асууна. Шинэ класс үүсгэх цонхонд нэрийг нь CdlgMsg гэж өгөөд
Dialog ID-д үүсгэсэн цонхны ID болох IDD_MSG_DIALOG –г
тодорхойлоод Base Class-д CDialog классыг өгөөд Ok товчийг
даран үүсгэнэ.
7.6. Контролуудад хавсаргах хувьсагчид
IDC_EDIT1 CString m_strText
IDC_RADIO1 Int m_iOption
7.7. Цонхыг ачаалахад хувьсагчдын анхны утгыг тодорхойлно.
m_iOption=0;
m_strText="";
UpdateData(false);
Дээрхи мөрүүдийг OnInitDialog функцэд нэм.
8. Show Custom Dialog товчийг дарахад үүсгэсэн цонхоо дуудахын тулд тухайн
класс төрлийн хувьсагчийг дуудах цонхны обьект болох CDialogsDlg класст
зарлах хэрэгтэй. (Class View->(Right click on CDialogsDlg) Add Member
Variable)
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 14 
Variable Type: CdlgMsg Variable Name: m_dlgMsg
9. Show Custom Dialog товчийг дарахад хийгдэх үйлдлүүд
void CDialogsDlg::OnBshwcstmdlg()
{
// TODO: Add your control notification handler code here
if (m_dlgMsg.DoModal()==IDOK) {
m_strOption="Option";
m_strOption+=" Was Selected.";
m_strText=m_dlgMsg.m_strText;
UpdateData(false);
} else {
m_strText="Canceled";
UpdateData(false);
}
}
10. Show Font Dialog товчийг дарахад хийгдэх үйлдлийг нэм. Энэ товчийг
дарахад дараах цонх modal хэлбэрээр харагдах ба Sample Text дотор
бичигдсэн текстийг Font Sample хэсэгт Select a Font –с сонгогдсон
бичгийн хэлбэрээр харагдуулна. Close товчийг дарахад цонхыг хаана.
11. Дээрх үйлдлийг хийхийн тулд дараах алхмуудыг гүйцэтгэнэ.
11.1. Шинээр IDD_FONT_DIALOG нэртэй диалог нэмнэ.
11.2. Ашиглагдах контролуудыг байрлуулна.
Төрөл Шинж чанар Утга
Command Button ID IDCLOSE
Caption Close
Төрөл Шинж чанар Утга
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 15 
atic TextSt ID IDC_STATIC
Caption Sample Text
Static Text ID IDC_STATIC
Caption Select a Font
Edit Box ID IDC_ESAMPTEXT
List Box ID IDC_LFONTS
Group Box ID IDC_STATIC
Caption Sample Font
Static Text ID IDC_DISPLAYTEXT
Caption <null string>
Maximized in a group box
11.3. Программд ашиглах классыг үүсгэнэ. (CFontDlg)
тролуудад хавсаргах хувьсагчид11.4. Кон
IDC_ESAMPTEXT CString m_strSampText
IDC_DISPLAYTEXT CString m_strDisplayText
IDC_DISPLAYTEXT tCStatic m_ctlDisplayTex
IDC_LFONTS CString m_strFontName
IDC_LFONTS CListBox m_ctlFontList
11.5. Close товчийг дарахад цонхыг хаах үйлдлийн кодыг нэм.
11.6. Цонх үүсэхэд ListBox-д үйлдлийн системд суулгасан бүх бичгийн
шрифтийн авах үйлдлийг хийнэ. Үүнийг тусад нь функц хэлбэрээр
. (Class view->(Right click on CFontDlg)Add
n->FillFontList
11.9. х үйлдэл
List()
рөл
t(); //ListBox-г цэвэрлэж
дэхь фонтуудын
.
> 0; iCurCount--)
хийе.
11.7. Шинээр функц нэмье
Member Function)
11.8. Function Type-> void, Function Declaratio
Шинээр нэмэгдсэн функцэд хийгдэ
void CFontDlg::FillFont
{
int iCount;
int iCurCount;
CString strCurFont;
CString strPrevFont="";
LOGFONT lf; //Font бүтэц тө
lf.lfCharSet = DEFAULT_CHARSET;
strcpy(lf.lfFaceName, "");
m_ctlFontList.ResetConten
байна.
CClientDC dc (this);
::EnumFontFamiliesEx((HDC) dc, &lf,(FONTENUMPROC)
EnumFontFamProc, (LPARAM) this, 0); //систем
нэ авах функцрийг
iCount = m_ctlFontList.GetCount();
// ListBox дахь элементүүдийн сүүлчийнхээс эхнийх хүртэл
давтаад
// давхацсан элементүүдийг хайж давхцлыг арилгаж байна
for (iCurCount = iCount; iCurCount
{
// Идэвхтэй фонтын нэрийг авах
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 16 
strCurFont);
уу?
байна
}
Proc(LPENUMLOGFONT lpelf,
ontList функцийг цонх эхэлж ачаалагдахад дуудах
// Set big icon
дэх текст
will not
()
handler code here
_s SampText;
ox
m_ctlFontList.GetText((iCurCount - 1),
// Өмнөхтэйгээ адил нэртэй байна
(strCurFont == strPrevFont)if
{
// тийм бол устга
m_ctlFontList.DeleteString((iCurCount - 1));
}
// өмнөх фонтыг идэвхжүүлж
strPrevFont = strCurFont;
}
11.10. Үүнд байгаа EnumFontFamProc нь функцийн нэр бөгөөд
EnumFontFamiliesEx функц нь фонтыг олоод дуудах функц юм.Иймээс
энэ функцийг global хэлбэрээр зарлах хэрэгтэй Үүний тулд
классы тодорхойлж өгөх шаардлагатай.н header файлд (FontDlg.h)
#endif // _MSC_VER > 1000
int CALLBACK EnumFontFam
NEWT TMET p m,LP EX RIC l nt
DWORD nFontType, long lParam);
// FontDlg.h : header file
Харин g.cpp) бичиж өгнө.хийгдэх үйлдлийг source файлд (FontDl
static char THIS_FILE[] = __FILE__;
#endif
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,
lParam)LPNEWTEXTMETRIC lpntm, DWORD nFontType, long
{
ow// Create a pointer to the dialog wind
CFontDlg* pWnd = (CFontDlg*) lParam;
// Add the font name to the list box
pWnd->m_ctlFont
>elfLo
List.AddString(lpelf-
gFont.lfFaceName);
1 to continue font enumeration// Return
return 1;
}
//////////////// //////////////////////////////////////
//////
///
//////////////
// CFontDlg dialog
11.11. FillF
хэрэгтэй.
BOOL CFontDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
;SetIcon(m_hIcon, FALSE)
// TODO: Add extra initialization here
FillFontList();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
11.12. Sample Text дэхь текст өөрчлөгдөхөд Font Sample
мөн дагаж өөрчлөгдөх естой.
idvo CFontDlg::OnChangeEsamptext()
{
// TODO: If this is a RICHEDIT control, the control
// send this notification unless you override the
CDialog::OnInitDialog()
ion and call CRichEditCtrl().SetEventMask// funct
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification
UpdateData(TRUE);
m_strDisplayText = m tr
UpdateData(FALSE);
}
11.13. ListBox-с фонтын нэрийг сонгоход өөрөөр хэлбэл ListB
дахь сонголт өөрчлөгдөхөд Font Sample дахь текстийн фонт
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 17 
йг хийхийн тулд мөн нэмэлт SetMyFont
эгш өнцгийн хэмжээг авах
ах хувьсагч
?
);
bottom;
sitive
CHARACTER_PRECIS,
, DEFAULT_PITCH |
// Set the font for the sample display area
11.14. сонголт өөрчлөгдөхөд
даж
ol notification handler code here
(TRUE);
w Font Dialog товчийг дарахад гарч ирэх цонхны хувьсагчийг
, товчийг дарахад хийгдэх үйлдлийг
нэм
r code here
, сонголтууд
илтгэх
ийн хувьсагч
нэмнэ. уудыг CPaintDlg
обьектын кон .
)
lg)
nitialization
ck
өөрчлөгдөх ёстой. Үүни
функцийг CfontDlg класст нэмнэ.
void CFontDlg::SetMyFont()
{
CRect rRect; // Font Sample –н т
хувьсагч
йг авint iHeight; // өндөри
// Фонт сонгогдсон байна уу
if (m_strFontName != "")
{
// Font Sample гарах
m_ctlDisplayText.GetWindowRect(&rRect
area height// Calculate the
iHeight = rRect.top - rRect.
// Make sure the height is po
if (iHeight < 0)
iHeight = 0 - iHeight;
// Release the current font
m_fSampFont.Detach();
// Create the font to be used
, 0, 0, 0, FW_NORMAL,m_fSampFont.CreateFont((iHeight - 5)
0, 0, 0, DEFAULT_CHARSET, OUT_
CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY
FF_DONTCARE, m_strFontName);
m_ctlDisplayText.SetFont(&m_fSampFont);
}
}
Нэмсэн дээрх функцээ ListBox-д
дуу ажиллуулах хэрэгтэй.
void CFontDlg::OnSelchangeLfonts()
{
// TODO:
UpdateData
Add your contr
// Set the font for the sample
SetMyFont();
}
12. Sho
(m_FontDlg) CdialogsDlg класст зарлан
.
void CDialogsDlg::OnBshwfontdlg()
{
// TODO: Add your control notification handle
m_FontDlg.DoModal();
}
13. Программаа хөрвүүлж ажиллагааг нь шалга.
14. Show Picture Dialog товчийг дарахад цонхон дээр зураг зурах, зургийн
файл дуудаж үзүүлэх зэрэг үйлдэл хийх бөгөөд цонх нь ердийн хэлбэрээр
гарч ирнэ. Мөн цонхон дээрх зургийн шинж чанарыг тодорхойлох сонголтууд
идэвхтэй болно. Товчийг дахин дарахад дээрхи цонх хаагдана
идэвхгүй болно. Үүний тулд зургийн цонх харагдаж байгаа эсэхийг
булийн төрлийн хувьсагч авч ашиглая. (BOOL m_bPaintVis;)
Зураг зурах цонх шинээр нэм (IDD_PAINT_DIALOG)14.1.
14.2. Бүх контролуудыг нь устгаад, Maximize, Minimize товчнуудыг
идэвхжүүл, хэмжээг нь өөрчлөх боломжтой болго.
14.3. Тухайн цонхны классыг шинээр үүсгэ. (CPaintDlg)
14.4. Зурагдах өнгийг зохицуулахын тулд COLORREF төрл
(COLORREF mr_Colors[8]). Өнгөний утг
структор функцэд тодорхойлж өгнө
CPaintDlg::CPaintDlg(CWnd* pParent /*=NULL*/
: CDialog(CPaintDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPaintD
// NOTE: the ClassWizard will add member i
here
//}}AFX_DATA_INIT
am_crColors[0] = RGB( 0, 0, 0); // Bl
m_crColors[1] = RGB( 0, 0, 255); // Blue
m_crColors[2] = RGB( 0, 255, 0); // Green
m_crColors[3] = RGB( 0, 255, 255); // Cyan
m_crColors[4] = RGB( 255, 0, 0); // Red
m_crColors[5] = RGB( 255, 0, 255); // Magenta
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 18 
х
void DrawLine(CPaintDC *pDg, int iColor); // зурах функц
id CP int iColor)
;
EFRAME, 1, m_crColors[iColor]);
a
een each of the lines
points
t pens
on?
SelectObject(&lSolidPen);
Pen);
&lNullPen);
lectObject(&lInsidePen);
next position
liDist;
iShape
int iTool, int
m_crColors[6] = RGB( 255, 255, 0); // Yellow
m_crColors[7] = RGB( 255, 255, 255); // White
}
14.5. Энэ цонхон дээр туршилтын хэлбэрээр зураг зурах бөгөөд зурагда
төрлийг үндсэн цонхноос удирдана. Зурагдах хэлбэр нь Drawing
Tool –д заагдсан байгаа. Үүнд 3 төрлийн хэлбэр байгаа бөгөөд
эдгээр класст нэмнэ.ийг тус бүрд нь зурах 3 функцыг CPaintDlg
шулуун
vo aintDlg::DrawLine(CPaintDC *pdc,
{
// Declare and create the pens
CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]);
CPen lDotPen (PS_DOT, 1, m_crColors[iColor]);
CPen lDashPen (PS_DASH, 1, m_crColors[iColor]);
CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]);
CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor])
m_crColors[iColor]);CPen lNullPen (PS_NULL, 1,
SIDCPen lInsidePen (PS_IN
// Get the drawing are
CRect lRect;
GetClientRect(lRect);
ect();lRect.NormalizeR
// Calculate the distance betw
CPoint pStart;
CPoint pEnd;
int liDist = lRect.Height() / 8;
CPen *lOldPen;
// Specify the starting
pStart.y = lRect.top;
pStart.x = lRect.left;
pEnd.y = pStart.y;
pEnd.x = lRect.right;
int i;
// Loop through the differen
for (i = 0; i < 7; i++)
{
// Which pen are we
switch (i)
{
/ Solidcase 0: /
lOldPen = pdc->
break;
/ Dotcase 1: /
pdc->SelectObject(&lDotPen);
break;
case 2: // Dash
pdc->SelectObject(&lDashPen);
break;
case 3: // Dash Dot
pdc->SelectObject(&lDashDotPen);
break;
Dot Dotcase 4: // Dash
pdc->SelectObject(&lDashDotDot
break;
case 5: // Null
pdc->SelectObject(
break;
/ Insidecase 6: /
pdc->Se
break;
}
// Move down to the
pStart.y = pStart.y +
pEnd.y = pStart.y;
// Draw the line
pdc->MoveTo(pStart);
pdc->LineTo(pEnd);
}
// Select the original pen
pdc->SelectObject(lOldPen);
}
void DrawRegion(CPaintDC *pDC, int iColor, int iTool, int
); //дүрс зурах
void CPaintDlg::DrawRegion(CPaintDC *pdc, int iColor,
iShape)
{
CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]);
CPen lDotPen (PS_DOT, 1, m_crColors[iColor]);
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 19 
;
olor]);
);
;
);
or]);
f the drawing regions
.Width() / 4;
z - 10;
he brushes and pens
; i++)
is figure.
ht;
;
th;
brush
);
th;
brush
th;
h
l
.
th;
ush
);
CPen lDashPen (PS_DASH, 1, m_crColors[iColor]);
CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]);
CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor])
CPen lNullPen (PS_NULL, 1, m_crColors[iC
CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColors[iColor]
// Declare and create the brushes
CBrush lSolidBrush(m_crColors[iColor]);
CBrush lBDiagBrush(HS_BDIAGONAL, m_crColors[iColor]);
CBrush lCrossBrush(HS_CROSS, m_crColors[iColor]);
CBrush lDiagCrossBrush(HS_DIAGCROSS, m_crColors[iColor])
CBrush lFDiagBrush(HS_FDIAGONAL, m_crColors[iColor]);
iColor]CBrush lHorizBrush(HS_HORIZONTAL, m_crColors[
CBrush lVertBrush(HS_VERTICAL, m_crColors[iCol
sh(RGB(192, 192, 192));CBrush lNullBru
// Calculate the size o
CRect lRect;
GetClientRect(lRect);
lRect.NormalizeRect();
int liVert = lRect.Height() / 2;
int liHeight = liVert - 10;
int liHorz = lRect
int liWidth = liHor
CRect lDrawRect;
CPen *lOldPen;
CBrush *lOldBrush;
int i;
all of t// Loop through
for (i = 0; i < 7
{
switch (i)
{
case 0: // Solid
// Determine the location for th
// Start the first row
lDrawRect.top = lRect.top + 5;
lDrawRect.left = lRect.left + 5;
lDrawRect.bottom = lDrawRect.top + liHeig
lDrawRect.right = lDrawRect.left + liWidth;
// Select the appropriate pen and brush
SolidPen);lOldPen = pdc->SelectObject(&l
lOldBrush = pdc->SelectObject(&lSolidBrush)
break;
case 1: // Dot - Back Diagonal
// Determine the location for this figure.
lDrawRect.left = lDrawRect.left + liHorz;
ft + liWidlDrawRect.right = lDrawRect.le
// Select the appropriate pen and
ctObject(&lDotPen);pdc->Sele
pdc->SelectObject(&lBDiagBrush
break;
case 2: // Dash - Cross Brush
// Determine the location for this figure.
lDrawRect.left = lDrawRect.left + liHorz;
+ liWidlDrawRect.right = lDrawRect.left
// Select the appropriate pen and
pdc->SelectObject(&lDashPen);
pdc->SelectObject(&lCrossBrush);
break;
case 3: // Dash Dot - Diagonal Cross
// Determine the location for this figure.
lDrawRect.left = lDrawRect.left + liHorz;
liWidlDrawRect.right = lDrawRect.left +
// Select the appropriate pen and brus
ectObject(&lDashDotPen);pdc->Sel
pdc->SelectObject(&lDiagCrossBrush);
break;
case 4: // Dash Dot Dot - Forward Diagona
// Determine the location for this figure
// Start the second row
lDrawRect.top = lDrawRect.top + liVert;
lDrawRect.left = lRect.left + 5;
ht;lDrawRect.bottom = lDrawRect.top + liHeig
WidlDrawRect.right = lDrawRect.left + li
br// Select the appropriate pen and
otPenpdc->SelectObject(&lDashDotD
pdc->SelectObject(&lFDiagBrush);
break;
case 5: // Null - Horizontal
// Determine the location for this figure.
lDrawRect.left = lDrawRect.left + liHorz;
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 20 
t + liWidth;
brush
;
th;
brush
Brush);
n);
d pen
void ShowBitmap(CPaintDC *pDC, CWnd *pWnd); // гаргах
Wnd)
g*)pWnd;
itmap = (CBitmap*)dcMem.SelectObject(lpWnd-
available
ndow
,
14.6. функцэд дараах үйдлийг нэмнэ.
ting
ndler code here
sDlg *pWnd = (CDialogsDlg*)GetParent();
?
shape
drawing a ellipse or rectangle
DrawRegion(&dc, pWnd->m_iColor, pWnd->m_iTool,
lDrawRect.right = lDrawRect.lef
// Select the appropriate pen and
pdc->SelectObject(&lNullPen)
pdc->SelectObject(&lHorizBrush);
break;
case 6: // Inside - Vertical
// Determine the location for this figure.
lDrawRect.left = lDrawRect.left + liHorz;
+ liWidlDrawRect.right = lDrawRect.left
// Select the appropriate pen and
ectObject(&lInsidePen);pdc->Sel
pdc->SelectObject(&lVert
break;
}
// Which tool are we using?
ool == 0)if (iT
pdc->SelectObject(lNullBrush);
else
pdc->SelectObject(lNullPe
// Which shape are we drawing?
if (iShape == 1)
pdc->Ellipse(lDrawRect);
else
pdc->Rectangle(lDrawRect);
}
n// Reset the original brush a
pdc->SelectObject(lOldBrush);
pdc->SelectObject(lOldPen);
}
зураг
vo aintDlg::ShowBitmap(CPaintDC *pdc, CWnd *pid CP
{
CDialogsDlg *lpWnd = (CDialogsDl
BITMAP bm;
// Get the loaded bitmap
lpWnd->m_bmpBitmap.GetBitmap(&bm);
CDC dcMem;
// Create a device context to load the bitmap into
dcMem.CreateCompatibleDC(pdc);
// Select th bitmap into the compatible device contexte
CBitmap* pOldB
>m_bmpBitmap);
CRect lRect;
// Get the display area
GetClientRect(lRect);
lRect.NormalizeRect();
// Copy and resize the bitmap to the dialog wi
pdc->StretchBlt(10, 10, (lRect.Width() - 20)
(lRect.Height() - 20), &dcMem, 0, 0,
bm.bmWidth, bm.bmHeight, SRCCOPY);
}
int Dialog-н OnPaintPa
void CPaintDlg::OnPaint()
{
CPaintDC dc(this); // device context for pain
// TODO: Add your message ha
CDialog
// Do we have a valid pointer
if (pWnd)
{
// Is the tool a bitmap?
if (pWnd->m_iTool == 2)
{
if (pWnd->m_sBitmap!="")
ShowBitmap(&dc,pWnd);
}
else // No, we're drawing a
{
// Are we drawing a line?
if (pWnd->m_iShape == 0)
DrawLine(&dc, pWnd->m_iColor);
else // We're
pWnd->m_iShape);
}
}
// Do not call CDialog::OnPaint() for painting messages
}
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 21 
нь
. Өөрөөр
д хэсэг нь ил гарч ирсэн зэрэг тохиолдолд
ialog цонхыг үндсэн цонхноос дуудахын тулд
logsDlg
14.9. Show P ture
id CD
нээр
цонхоо
on нь
дээр OnRtpen функцийн нэрийг OnRSelection болгон солино.
Ингэж йг хийж функцийг тодорхойлж
өгнө
cation handler code here
p
төрлий агчийг нэм.
14.13.
tification handler code here
Files
14.7. Дээрх ОnPaint функц нь WM_PAINT message-н функц бөгөөд энэ
тухайн цонх дахин зурагдах шаардлагатай үед дуудагддаг
хэлбэл тухайн цонхны хэмжээг өөрчилсөн, идэвхтэй болсон,
зөөсөн, дал
дуудагдана. Программын аргаар дуудахдаа Invalidate() функцийг
ашиглана.
14.8. Шинээр үүссэн Paint D
CPaintDlg төрлийн m_dlgPaint нэртэй хувьсагчийг CDia
класст тодорхойлно.
i Dialog товчийг дарахад хийгдэх үйлдэл
lg()
c
vo ialogsDlg::OnBshwpicd
{
// TODO: Add your control notification handler code here
if (!m_bPaintVis) {
m_dlgPaint.Create(IDD_PAINT_DIALOG, this);//цонх ши
үүсгэх
m_dlgPaint.ShowWindow(SW_SHOW);// үүсгэсэн
дэлгэцэнд харуулах
bPaintVis=true;m_
m_strShowPic="Hide Picture Dialog"
UpdateData(false);
} else {
;m_dlgPaint.DestroyWindow()
_bPaintVis=false;m
m_strShowPic="Show Picture Dialog"
UpdateData(false);
}
GetDlgItem(IDC_GBTOOL)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_GBSHAPE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_GBCOLOR)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RTPEN)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RTBRUSH)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RTBITMAP)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RSCIRCLE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RSSQUARE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RSLINE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCBLACK)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCBLUE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCRED)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCGREEN)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCCYAN)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCYELLOW)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCWHITE)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_RCMAGENTA)->EnableWindow(m_bPaintVis);
GetDlgItem(IDC_BOPENBMP)->EnableWindow(m_bPaintVis);
}
14.10. Drawing Tool, Drawing Shape, Color дэхь сонголтууд
өөрчлөгдөхөд Paint цонхон дахь зураг өөрчлөгдөх өөрөөр хэлбэл
Paint цонхыг дахин сэргээх шаардлагатай. Бүх Radio Butt
адил үйлдэл хийх учир нэг функцийг зааж өгнө. Үүний тулд шинээр
функц нэмье. (CDialogsDlg класст (void OnRSelection))
14.11. Харин Radio Button-доо энэ функцийг хэрхэн зааж өгөх вэ?
Үүний тулд жишээ нь: Pen Radio Button дээр 2 товшиход гарч ирэх
цонхон
бүх Radio Button дээр үйлдли
void CDialogsDlg::OnRSelection()
{
// TODO: Add your control notifi
UpdateData(TRUE);
m_dlgPaint.Invalidate();
}.
14.12. Choose Bitmap File товчийг дарахад зургын файлыг олж,
зургыг нь хувьсагчид авч Paint цонхонд дамжуулах үйлдэл
хийгдэнэ. Иймээс CDialogsDlg класст зураг дамжуулах CBitma
н m_bmpBitmap нэртэй хувьс
Choose Bitmap File товчийг дарахад хийгдэх үйлдэл.
void CDialogsDlg::OnBopenbmp()
{
// TODO: Add your control no
static char BASED_CODE szFilter[] = "Bitmap
(*.bmp)|*.bmp||";
// Create the File Open dialog
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 22 
, m_sBitmap,
ITEPROMPT, szFilter);
the result
ceHandle(),
BSECTION);
loaded image?
detach it
p to the bitmap object
tmap);
хын тулд PaintDlg.cpp
logsDlg.h файлын
Paint цонхыг Close товчоор нь хаахад үндсэн цонхонд Hide Paint Dialog
овчийг дарсантай адил үйлдлийг хийх функцийг нэм.
 
CFileDialog m_ldFile(TRUE, ".bmp"
OFN_HIDEREADONLY | OFN_OVERWR
// Show the File Open dialog and capture
if (m_ldFile.DoModal() == IDOK)
{
// Get the filename selected
m_sBitmap = m_ldFile.GetPathName();
// Load the selected bitmap file
HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstan
IMAGE_BITMAP, 0, 0,m_sBitmap,
LR_LOADFROMFILE | LR_CREATEDI
// Do we have a valid handle for the
if (hBitmap)
{
p// Delete the current bitma
if (m_bmpBitmap.DeleteObject())
// If there was a bitmap,
m_bmpBitmap.Detach();
// Attach the currently loaded bitma
m_bmpBitmap.Attach(hBi
}
// Invalidate the second dialog window
m_dlgPaint.Invalidate();
}
}
14.14. Ингэж Paint цонхонд утга дамжуула
файлын header файл зарлалтын хэсэгт Dia
зарлалтыг нэмэх хэрэгтэй.
15. Программаа хөрвүүлж ажиллуулан үр дүнг шалга.
Даалгавар:
т
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Визу
Боло
 
зөвхө
үүсд
Клас
CEdi
CFor
CHtm
CLis
CRic
CScr
CTre
Өнөө
SDI
уал програ
овсруулсан
SDI прог
өн нэг барим
SDI про
дэг. About
1. CWin
хэрэ
CVie
2. CFra
энэ
зохи
3. CDoc
бари
боло
ба ү
4. CVie
обье
клас
сс
itView
rmView.
mlView
stView
chEditView
rollView
eeView
өдрийн лаб
программ
1. Шинэ
2. AppW
тодо
3. 3 да
гэсэ
4. 4 да
5. Гарч
өргө
6. Next
амчлал СИ
н багш: Т.
Сэдэв
рамм гэдэг
мт боловсру
ограмм үүс
t цонхны к
nApp –с уд
эглэгдэх б
ew обьекту
ameView -с
нь тухайн
ион байгуу
cument –с
имтын обье
овсруулах
үүнээс дэл
ew–с удамш
ект. Энэ к
ссаас удам
Тайлбар
EditBox
боловср
Харагда
хэлбэри
Web bro
мэдээлэ
List ко
w Тэмдэгт
боловср
CView к
Мод хэл
бораториор
үүсгэх:
ээр Lab4 н
Wizard эхн
орхойл.
ахь алхамы
эн тэмдэгл
ахь алхмыг
ч ирэх цон
өтгөлийг з
t товчийг
И++ хичээл
.Уламбаяр
в: Single
нь баримт б
уулдаг. Жиш
сгэхэд диа
классыг эс
дамшсан кл
бусад обье
уудын mess
с удамшсан
н цонхон д
улах үүрэг
удамшсан
ект. Үүнд
ба энэ кл
лгэцэнд га
шсан класс
класс нь д
мшиж болно
р
x контрол
руулахад а
ах байдлын
ийн мэдээл
owser –н ү
эл боловср
онтрол дах
т болон хэ
руулахад х
класст scr
лбэрийн мэ
р бид SDI
нэртэй про
ний алхамд
ыг байгааг
лэгээг ари
г хэвээр н
нхон дээрэ
зааж өгнө.
даран дар
лийн лекц
р
Lecture
e Document
боловсруула
шээ нь Notep
алог прогр
с тооцвол
ласс. Энэ
ектыг тодо
sage-уудыг
н класс нь
дахь обьек
гтэй.
класс нь
баримтанд
ласст бари
аргах мэдэ
с нь барим
дэлгэцэнд
о. Жнь:
дахь үйлд
ашиглагдда
н обьект н
лэл боловс
үйлдлүүдий
руулахад х
хь үйдлийг
элбэржүүлс
хэрэглэгдэ
roll хийх
эдээлэл бо
хэлбэрийн
ожект үүсг
д программ
гаар нь өн
илга
нь үлдээгэ
ээс програ
.(lb4) Clo
раагийн ал
ийн хураа
№7-8
t Applicat
ах программ
pad, Paint, So
рамм үүсгэ
дараах кл
класс нь
орхойлж өг
г илгээх д
ь программ
ктуудыг (t
тухайн пр
д шаардлаг
имтад оруу
ээллийг CV
мтын дэлгэ
харагдах
длийг хийд
аг.
нь контрол
сруулахад
йг хийдэг.
хэрэглэдэг
г хийдэг.
сэн текст
энэ.
шинж чана
оловсруула
н, зураг з
гэ.
мын төрлий
нгөрөөгөөд
ээд Advanc
аммын боло
ose товчий
лхамд шилж
ангуй
tion үүсгэ
мын ерэнхий
olitaire гэх м
эснээс хам
лассууд үү
тухайн пр
гөх үүрэгт
дамжуулах
мын цонхны
toolbar, s
рограммын
гатай өгөг
улах мэдээ
View руу и
эцэнд хара
байдлын х
дэг. Ердий
луудыг агу
хэрэглэгд
.Үүнийг UR
г.
хэлбэрийн
арыг нэмж
ахад ашигл
зурдаг про
йн Single
д 4 дэхь а
ced товчий
овсруулах
йг даран ц
ж.
эх
й хэлбэр бөг
мэт.
маагүй оло
үснэ.
рограммд
тэй ба CFr
үүрэгтэй.
ы обьект б
scrollbar,
боловсруу
гдлийн төр
элэл CView
илгээгддэг
агдах байд
хэд хэдэн
йн текст м
уулж болно
дэнэ.
RL, Html х
н мэдээлэл
өгнө.
лагдана.
ограммыг б
Document
алхмын Act
йг
ба
дар
римтын
цонхоо хаа
Page 23
өөд тухайн
он класс
rameView,
.
бөгөөд
,menu,…)
улах
рлийг
w-с ирэх
г.
длын
төрлийн
мэдээлэл
о. Form
хэлбэрийн
л
бичнэ.
гэж
tiveX
а.
3 
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 24 
ыг
.
1.
Үүнийг
->m_ptFrom гэж өгөөд Ok
CLine)-
бичээд Ok товчийг дар.
7. Нэм
n om, CPoint ptTo)
{
;
. Үүний тулд
кц нэм.
2. Нэм длийг нэм.
d CL C)
{
г
7. 5 дахь алхам дахь утгуудыг хэвээр үлдээ.
8. 6 дахь алхамд баримтын харагдах байдлын обьекитын удамших класс
CView гэж хэвээр нь үлдээгээд Finish товчийг дарвал AppWizard
программыг үүсгэнэ.
Line класс үүсгэх. Энэ программд зураг зурах үйлдэл хийх учир зурагдах дүрс
болгонд обьектыг үүсгэх хэрэгтэй. Жишээ нь шулуун зурах класс үүсгэе. Ингэж
класс үүсгэснээр шулууны шинж чанаруудыг тодорхойлох боломжтой болно
Class View-> (right click on Lab4 Classes)->New Class
2. Дээрхи байдлаар утгуудыг тодорхойл.
3. OK товчийг дарахад CLine класс шинээр үүснэ.
CLine классын гишүүн өгөгдөл, гишүүн функц, байгуулагч болон устгагч
функцүүдийг тодорхойлох.
CLine кл1. асс 2 гишүүн өгөгдөлтэй. (эхлэх цэг, төгсөх цэг)
нэмнэ.
2. Class View->(right click on CLine)->Add Member Variable
Variable type-3. > CPoint, variable name
товчийг дар.
4. Дээрх байдлаар m_ptTo өгөгдлийг нэм.
Байгуулагч функц нэмэхийн тулд Class5. View->(right click on
>Add Member Function командыг сонго
Function type –г хоосон үлдээгээд function declaration –д6.
CLine(CPoint ptFrom, CPoint ptTo) гэж
сэ
CLi
н функцдээ дараах үйлдлийг хий.
e::CLine(CPoint ptFr
m_ptFrom = ptFrom
m_ptTo = ptTo;
}
Зөв обьект хандалтат программд обьект нь өөрөө үйлдлээ хийдэг байх
хэрэгтэй. Иймээс CLine класс нь шулуунаа зурдаг байх хэрэгтэй
шулуун зурдаг функцыг нэмж өгнө.
1. void төрлийн Draw(CDC *pDc) нэртэй фун
сэ
voi
н функцдээ дараах үйл
ine::Draw(CDC * pD
// Draw the line
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
}
Дээрхи нэмсэн классаа баримт боловсруулах CDocument класстайгаа холбож
өгөх хэрэгтэй. Өөрөөр хэлбэл шинээр зурагдсан шулууныг баримтад хадгалах
хэрэгтэй. Үүний тулд хадгалах динамик массивыг тодорхойлох шаардлагатай.
Массив нь CobArray төрлийн хувьсагч байх шаардлагатай. MFC-д CStringArray,
CByteArray, CWordArray, CDWordArray,CPtrArray гэсэн массив төрлүүд байда
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 25 
атай үйлдэл бол шулуун нэмэх үйлдэл
юм.
Доорхий функцыг CL
CLine * CLab4Doc::AddLine(CPoint ptFrom, CPoint ptTo)
{
eate a new CLine object
ne *
try
{
ct array
;
he
x("Out of memory", MB_ICONSTOP | MB_OK);
Did ne object?
if (pLi
{
e exception object
();
Дараагийн зайлшгүй йт хэдэн шулуун зурагдсаныг тоолох.
int CLa
эцэст нь зай өн дугаарын шулууны обьектыг
тодорхойлох.
CLine *
{
ct
жтайгаар гүйцэтгэнэ. Үүний тулд хулганы товч дарагдахад
UTTONDOWN, WM_LBUTTONUP, ба WM_MOUSEMOVE
3. Дээ
4. Нэмэгдсэн
message handler code here and/or call default
id CL
or call default
s)
can
ReleaseCapture();
бөгөөд тус бүр өөр өөрийн тодорхой төрлүүдийн хадгалдаг. Харин CobArray
төрөл нь ямарч төрлийн хувьсагчдыг хадгалах чадвартай байдаг.
CLab4Doc клөасст CobArray төрлийн m_oaLines нэртэй хувьсагч нэм.
Документ класст хийгдэх анхны шаардлаг
ab4Doc класст нэм.
//
CLi
Cr
pLine = new CLine(ptFrom, ptTo);
// Add the new line
m_oaLines.Add(pLine)
to the obje
// Mark the document as dirty
SetModifiedFlag();
}
// Did we run into a memory exception?
ryException* perr)catch (CMemo
{
, giving him or her t// Display a message for the user
// bad news
xMessageBoAf
// we create a li
ne)
// Delete it
delete pLine;
LL;pLine = NU
}
// Delete th
perr->Delete
}
return pLine;
}
хийгдэх үйлдэл бол ни
b4Doc::GetLineCount()
{
// Return the array count
return m_oaLines.GetSize();
}
лшгүй хийгдэх үйлдэл бол өгөгдс
CLab4Doc::GetLine(int nIndex)
// Return a pointer to the line obje
// at the specified point in the object array
return (CLine*)m_oaLines[nIndex];
}
Дараагийн шаардлага бол хэрэглэгч хулганы заагчийн тусламжтайгаар шулуун
зурдаг байх. Өөрөөр хэлбэл хулганы зүүн товчийг дараад хулганы заагчийг
гүйлгэхэд заагчийн гйүсний дагуу шулуун зурагддаг байх явдал юм. Үүнийг
CView классын туслам
илгээгддэг message-үүд болох WM_LB
–үүдийг ашиглана.
1. Class Wizard цонхыг нээ
2. CLab4View классыг сонго
рхи 3 message тус бүрд функц нэм.
функцүүдэд дараах үйлдлийг хий.
n(UINT nFlags, CPoint point)void CLab4View::OnLButtonDow
{
// TODO: Add your
SetCapture();
// Save the point
m_ptPrevPos = point;
CView::OnLButtonDown(nFlags, point);
}
, CPoint point)vo ab4View::OnLButtonUp(UINT nFlags
{
// TODO: Add your message handler code here and/
aptured the mouse?// Have we c
if (GetCapture() == thi
// If so, release it so other applications
// have it
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 26 
tton is down
TTON)
ocument()->AddLine(m_ptPrevPos, point);
ious point
ж
ин
зурах шаардл ардлагатай гэсэн утга WM_PAINT
message-р ирснээр ункцийг нэмж өгөх хэрэгтэй.
ument
lines in the document?
s++)
o point for each line
ine(liPos);
// Draw the line
рлах шаардлагатай.
ab4View.cpp файлуудад Line.h файлыг зарлах хэрэгтэй.
удын
Харин DeleteContents
функцэд цэвэ . Ийм функц байхгүй байвал
ClassWizard- нэмэ
CView::OnLButtonUp(nFlags, point);
}
void CLab4View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// Check to see if the left mouse bu
_LBUif ((nFlags & MK_LBUTTON) == MK
{
// Have we captured the mouse?
if (GetCapture() == this)
{
// Get the Device Context
CClientDC dc(this);
// Add the line to the document
CLine *pLine = GetD
// Draw the current stretch of line
pLine->Draw(&dc);
// Save the current point as the prev
m_ptPrevPos = point;
}
}
CView::OnMouseMove(nFlags, point);
}
Дээр дуудагдсан SetCapture функц нь хулганы товч дарагдахад хийгдэх ба энэ
нь хулганы заагчийг зөвхөн өөрийн программд ажиллах боломжтой болгодог.
Шалтгаан нь жишээ нь хулганы заагчийг чирж байгаад зураг зурах цонхноос
хэтрээд гарч яваад буцаж орж ирэх тохиолдолд шулуун зурсан хэвээр байна гэ
зааж өгч байна. Өөрөөр хэлбэл бусад программд хулганы талаархи message-
үүдийг илгээхгүй болгож байна. Харин ReleaseCapture функц нь үүний эсрэг
юм. Хулганыг зөөж байх агшинд баримтад шулуун нэмж байна.
View класс дахь шаардлагатай үйлдэл бол CView обьект дахин сэргээгдэх
(зурагдах) ш лд баримт дахь шулуун болгоныг дахаардлагатай болсон тохиолдо
атай. Дахин сэргээгдэх шааг
мэдэгддэг. Иймээс доорхи ф
void CLab4View::OnDraw(CDC* pDC)
{
CLab4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// Get the number of lines in the doc
pDoc->GetLineCount();int liCount =
// Are there any
if (liCount)
{
int liPos;
CLine *lptLine;
// Loop through the lines in the document
for (liPos = 0; liPos < liCount; liPo
{
// Get the from and t
lptLine = pDoc->GetL
lptLine->Draw(pDC);
}
}
}
аас өмнө CLine классынПрограммаа хөрвүүлж ажиллагааг нь шалгах
одорхойлолтыг шаардлагатай обьектуудад зат
Lab4Doc.cpp ба L
Программаа хөрвүүлж ажиллагааг нь шалга.
Шинээр баримт үүсгэх.
Программын документ класст байгаа OnNewDocument функц нь дэлгэцэнд байгаа
зургийг устгахгүй харин New командыг (цэсний) сонгоход бусад классу
эхний утгууд үдийг хийдэг.ыг тодорхойлох зэрэг үйлдлү
эх үйлдлийг хийх хэрэгтэйрл
р х боломжтой. Дараах үйлдлийг хий.
void CLab4Doc::DeleteContents()
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 27 
Add your specialized code here and/or call the base class
leting each object
liCount; liPos++)
х
элемент (шул чид хадгалж байгаа учир зөвхөн
энэ хувьсагч цийг дуудахад хангалттай.
ж байгаа
рөөр хэлбэл CLine классын
Serialize фу e класст дээрх функцийг
тодорхойлох
rchive &ar)
}
Программаа хөрвүүлж ажиллагааг гарна.
дарт функц бөгөөд энэ нь DECLARE_SERIAL,
IMPLEM дорхойлолтуудыг зарласнаар алдаагүй
ажиллана
AL (CLine)
Харин Line.c
ntation of the CLine class.
///////////////////////////////////////////////////
fx.h"
{
// TODO:
// Get the number of lines in the object array
int liCount = m_oaLines.GetSize();
int liPos;
// Are there any objects in the array?
if (liCount)
{
ay, de// Loop through the arr
for (liPos = 0; liPos <
delete m_oaLines[liPos];
// Reset the array
m_oaLines.RemoveAll();
}
eleteContents();CDocument::D
}
Дээрх функц нь шинээр баримт нээхэд гарч болох алдаануудыг багасгана.
Баримтаа хадгалах ба нээх.
AppWizard нь хэдийгээр Save, Open, Save as цэснүүдийгүүсгэдэг боловч
хийгдэх үйлдлийг нь өөрсдөө хийх шаардлагатай. Эдгээр үйлдлүүдийг Serialize
гэж нэрлэдэг бөгөөд файлд хадгалах, файлаас унших үйлдлийг CLab4Doc классын
Serialize хэ хувьд баримтын бүмээх функцэд хийж өгнө. Бидний программын
н) нь m_aoLines хэмээх хувьсагуу
ийн файлд хадгалах стандарт функ
void CLab4Doc::Serialize(CArchive& ar)
{
m_oaLines.Serialize(ar);
}
Харин m_aoLines хувьсагчийн Serialize функц нь дотор нь хадгалагда
хувьсагчдын Serialize функцыг дууддаг. Өө
цыг дуудна. Иймээс бид CLinнк
шаардлагатай.
void CLine::Serialize(CA
{
CObject::Serialize(ar);
if (ar.IsStoring())
ar << m_ptFrom << m_ptTo;
else
ar >> m_ptFrom >> m_ptTo;
шалгахад дараах алдаа
Учир нь Serialize гэдэг нь стан
_SERIAL гэсэн макро тоENT
. Ий
class CLin
мээс Line.h файлд
e : public CObject
{
DECLARE_SERI
public:
e(CPoint ptFrom, CPoint ptTo);CLin
pp файлд
// Line.cpp: impleme
//
///////////////////
#include "stda
#include "Lab4.h"
#include "Line.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 28 
///////////////////////////////////////////////////////
Destruction
///////////////////////////////////////////////////////////////////
лагатай. Одоо программаа хөрвүүлж ажиллагааг
ber Varialble
тодорхойлон
Ok
3. CLi кцийг өөрчил.
int ptTo, COLORREF crColor)
4. Мөн функцүүд өөрчлөгдөнө.
e drawing object
>SelectObject(&lpen);
pDC->LineTo(m_ptTo);
л
UINT m_nColor, static const COLORREF m_crColors[8]
2. M_crColor файлд тодорхойл.
= {
ta
///////////////////////////////////////////
3. Мөн доошл функцүүдэд өөрчлөлт
хийгдээд
IMPLEMENT_SERIAL (CLine, CObject, 1)
///////////////
// Construction/
///
CLine::CLine()
{
}
гэж тус тус өөрчлөлт хийх шаард
нь шалгахад алдаа гарахгүй ба зурсан зургаа хадгалдаг, хадгалсан зургаа
нээдэг болсон байна.
Цэстэй ажиллах, өнгө оруулах.
Одоо программаа хэрэглэгчийн сонгосон өнгөөр зурдаг болгон үйлдэл нэмье.
Үүний тулд CLine класстаа шинээр өнгө тодорхойлсон хувьсагч нэмнэ.
1. Class View->(right click on Cline)->Add Mem
2. Variable type->COLORREF, Variable name->m_crColor гэж
вчийг дар.то
ne классын байгуулагч фун
CPoCLine::CLine(CPoint ptFrom,
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
m_crColor=crColor;
}
Draw, Serialize
void CLine::Draw(CDC *pDC)
{
// Create a pen
D, 1, m_crColor);CPen lpen (PS_SOLI
// Set the new pen as th
C-CPen* pOldPen = pD
// Draw the line
pDC->MoveTo(m_ptFrom);
// Reset the previous pen
pDC->SelectObject(pOldPen);
}
rchive &ar)void CLine::Serialize(CA
{
CObject::Serialize(ar);
if (ar.IsStoring())
ar << m_ptFrom << m_ptTo<<(DWORD) m_crColor;
else
ar >> m_ptFrom >> m_ptTo>> (DWORD) m_crColor;
}
Ингэж CLine класст үйлдэл нэмэхээс гадна документ класст мөн үйлдэ
нэмэх хэрэгтэй. Учир нь хэрэглэгч өнгийг тодорхойлохдоо цэсийг
ашиглана. Иймээс цэс, тухайн үеийн өнгийг хадгалах хувьсагч, мөн
өнгөнүүдийн тогтмол утгыг хадгалах массив хэлбэрийн хувьсагч
шаардлагатай болно. Эдгээрийг нэмэхийн тулд
1. Class Vie асст дараах 2 хувьсагчийг нэм.w-v CLab4Doc кл
s хувьсагчийн утгуудыг Lab4Doc.cpp
END_MESSAGE_MAP()
const COLORREF CLab4Doc::m_crColor[8]
RGB( 0, 0, 0), // Black
RGB( 0, 0, 255), // Blue
RGB( 0, 255, 0), // Green
RGB( 0, 255, 255), // Cyan
RGB( 255, 0, 0), // Red
RGB( 255, 0, 255), // Magen
RGB( 255, 255, 0), // Yellow
RGB( 255, 255, 255) // White
};
/////////////////////
/////////////
// CLab4Doc construction/destruction
CLab4Doc::CLab4Doc()
{
д OnNewDocumet, AddLineоо
доорхи байдалтай болно.
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 29 
lor[m_nColor]);
to the object array
the
t of memory", MB_ICONSTOP | MB_OK);
line object?
he exception object
4. CLa
ийг
Ca болгон өөрчил.
цэс цэсийг нэм.(дарааллаар нь)
BOOL CLab4Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
alization code here// TODO: add reiniti
// (SDI documents will reuse this document)
m_nColor=ID_COLOR_BLACK-ID_COLOR_BLACK;
return TRUE;
}
CLine * CLab4Doc::AddLine(CPoint ptFrom, CPoint ptTo)
{
// Create a new CLine object
CLine *pLine = new CLine(ptFrom, ptTo, m_crCo
try
{
// Add the new line
m_oaLines.Add(pLine);
// Mark the document as dirty
SetModifiedFlag();
}
// Did we run into a memory exception?
catch (CMemoryException* perr)
{
, giving him or her// Display a message for the user
// bad news
AfxMessageBox("Ou
// Did we create a
if (pLine)
{
// Delete it
delete pLine;
pLine = NULL;
}
// Delete t
perr->Delete();
}
return pLine;
}
b4Doc класст доорхи функцийг нэм.
UINT CLab4Doc::GetColor()
{
return ID_COLOR_BLACK+m_nColor;
}
Дээрхи ID_COLOR_BLACK хувьсагч нь шинээр нэмэх цэсний нэр юм.
5. Хэрэглэгч өнгөө тодорхойлох цэс болон түүн дээр хийгдэх
үйлдлүүдийг нэмье.
1. Resource View->Menu(Double Click)->IDR_MAINFRAME(Double
Click)
2. Гарч ирэх цэсний зохион байгуулалт дээрхи хоосон цэс
View ард байрлуул.зөөн
. Түүний
цэсний
3 ption-г &Color
раах дэд4. Color
Property
энд да
SettinObjec t g
Menu Entry ID ID_COLOR_BLACK
Caption &Black
Menu Entry ID ID_COLOR_BLACK
Caption B&lue
Menu Entry ID ID_COLOR_BLACK
Caption &Green
Menu Entry ID ID_COLOR_BLACK
Caption &Cyan
Menu Entry ID ID_COLOR_BLACK
Caption &Red
Menu Entry ID ID_COLOR_BLACK
Caption &Magenta
Menu Entry ID ID_COLOR_BLACK
Caption &Yellow
Menu Entry ID ID_COLOR_BLACK
Caption &White
5. Class Wizard цонхыг нээ. CLab4Doc классыг сонго.
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 30 
6. Нэмэгд UPDATE_COMMAND_UI event-
үүд дээр фун
7. Нэмэгдсэн фу
d CL
d CL
nd update UI handler code here
or() == ID_COLOR_BLACK ? 1 : 0);
d CL
;
гэх мэтчилэн
8.
ний
гө сонгогдсон
. Энэ функц нь
хөрвүүлж ажиллагааг нь шалга.
Даалга
ммд шулууны өргөн, нарийнийг лж байгаа шиг
г болго.
өргөнийг тодорхойлох тогтмол утгууд
ry th Settin
сэн цэснүүдийн COMMAND ба
кц нэм.
нкцүүдэд хийгдэх үйлдэл.
ab4Doc::OnColorBlack()voi
{
// TODO: Add your command handler code here
m_nColor = ID_COLOR_BLACK - ID_COLOR_BLACK;
}
ab4Doc::OnUpdateColorBlack(CCmdUI* pCmdUI)voi
{
// TODO: Add your comma
pCmdUI->SetCheck(GetCol
}
id CLab4Doc::OnColorBlue()vo
{
// TODO: Add your command handler code here
m_nColor=ID_COLOR_BLUE-ID_COLOR_BLACK;
}
ab4Doc::OnUpdateColorBlue(CCmdUI* pCmdUI)voi
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(GetColor() == ID_COLOR_BLUE ? 1 : 0)
}
бүх өнгөний цэсний функцүүдэд нэм.
Command функц нь тухайн цэсний өнгийг тодорхойлж өгөх
үүрэгтэй. Үүнд хийгдэж байгаа
m_nColor=ID_COLOR_BLUE-ID_COLOR_BLACK;
үйлдэл нь m_nColor хувьсагчид тухайн сонгогдсон өнгө
m_crColors массив дахь индексийг олгож байна.
Харин UPDATE_COMMAND_UI функцэд тухайн өн
цэсийг тэмдэглэх үйлдлийг хийж байна
ихэвчлэн цэсийг тэмдэглэх, идэвхтэй болгох, идэвхгүй
болгох зэрэг үйлдэл хийхэд ашиглагддаг.
Программаа
вар:
Програ өнгө тодорхой
тодорхойлдо
Шулууны
Menu Ent Wid g
Very Thin 1
Thin 8
Medium 16
Thick 24
Very Thick 32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Визу
Бол
уал програ
о
MDI
ерэн
Өөрө
цонх
(chi
Ийм
CMai
шинж
чана
Өнөө
зохи
хэлб
ялга
Шинэ
Прог
тодо
Stat
болг
Дэд
Прог
прог
mess
бид
овсруулсан
Сэдэв:
программ
нхий хэлбэ
өөр хэлбэл
хтой байна
ild) цонх
программы
inFrame –с
ж чанарыг
арыг тодор
өдөр бид ө
ион байгуу
бэрийн про
аатай.
ээр MDI пр
1. Шинэ
Docu
2. 4-р
3. Мөн
тодо
4. Прог
граммдаа н
орхойлдог,
tusBar дээ
гоно. Үүни
цэс нэмэх
граммд бол
граммын цо
sage илгээ
дэд цэс г
1. Reso
2. Шинэ
3. Нэмэ
амчлал СИИ++ хичээл
н багш: Т.
MDI прогр
гэдэг нь
эр бөгөөд
л нэг ерөн
а. Ерөнхий
гэж нэрлэ
ыг AppWiza
с удамшдаг
агуулсан
рхойлох кл
өмнөх лабо
улна. AppW
ограмм үүс
рограмм үү
э AppWizar
ument-г со
лаборатор
өмнөх лаб
орхойлдог
граммаа хө
нэмээд бид
мөн tool
эр одоогий
ий тулд да
х.
лон програ
онхон дээр
эгддэг. Эн
гаргахын т
ource View
ээр нэмэгд
эгдсэн цэс
.Уламбаяр
Le
рамм үүсгэ
SDI прогр
тухайн хэ
нхий цонхт
й цонхыг э
эдэг.
ard-р үүсг
г классын
класс мөн
ласс тус т
оратори дэ
Wizard-р M
сгэхтэй ад
үсгэх
rd прожект
онго.
ри шиг про
бораторийн
шулуун зу
өрвүүлж аж
д PopupMen
lbar-н тус
йн идэвхтэ
араах алхм
аммын цонх
р хулганы
нэ message
тулд эхлээ
w->(right
дсэн цэсни
сний зохио
лийн лекцийн хураа
р
ecture
эх, програ
раммтай ад
эд хэдэн б
той ба хар
эцэг цонх
гэхэд SDI
оронд CMD
н CMDIChil
тус үүсдэг
ээрхи шиг
MDI програ
дил ба зөв
т (Lab5) ү
ограммаа ү
н ажлын да
урдаг, фай
жиллагааг
nu-н тусла
сламжтайга
эй байгаа
муудыг гүй
хон дээр д
баруун то
e нь WM_CO
эд дэд цэс
click on
ий ID-г ID
он байгуул
ангуй
№9-10
аммд toolb
дил баримт
баримтыг з
рин баримт
гэх ба ба
шиг олон
DIMainWnd-
ldWnd –с у
г.
үйлдэл хи
амм үүсгэх
вхөн эхний
үүсгээд эх
үүсгэ.
арааллаар
йлд хадгал
нь шалга.
амжтайгаар
аар өнгө,
өнгө боло
йцэтгэнэ.
дэд цэс га
овч дарагд
ONTEXTMENU
сээ лдэбэ н
Menu)-> I
DR_CONTEXT
лалт
bar, statu
т боловсру
зэрэг бол
т болгон н
аримтын цо
класс үүс
-с удамшса
удамшсан х
ийдэг MDI
х алхмууд
й алхам да
хний алхам
өнгө, өрг
лдаг, файл
.
р өнгө, өр
өргөнийг
он, өргөни
аргах өөрө
длаа гэдги
U юм. Энэ
нэ. Үүний
Insert Men
TMENU болг
usbar ашиг
уулах прог
ловсруулда
нь тус тус
онхыг хүүх
глах
граммын
аг.
сдаа
хэд
сдэг. Хари
ан эцэг цо
хүүхэд цон
applicati
ин
онхны
нь үндсэн
нхны шинж
ion
ахь сонгол
ндээ SDI
лтоороо
мд Multiplle
гөнийг
лаас уншда
ргөнийг
аг болго.
тодорхойл
ийг хардаг
өөр хэлбэл
лдог,
ийг илтгэс
г
л
мэдээллий
тулд:
сэн
йг ирэхэд
nu
гон өөрчилл.
Page 311 
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 32 
olor,
элтэй адил байна.
лно.
6. Class Wizard->CLab5View->WM_CONTEXTMENU(add function)
7. Нэмэгдс
:OnContextMenu(CWnd* pWnd, CPoint point)
handler code here
pContextMenu->TrackPopupMenu(TPM_LEFTALIGN |
үлж ажиллагааг нь шалга.
лдэл нэмэх.
гүйцэтгэх
дээр
айн товчин дээрх зургийг гарч ирэх зургийн
2.2. гарган
өнгийн
товчны
Member
3.1.2. tected)
3.2. л
STRUCT lpCreateStruct)
4. Энэ цэсний командуудын хийгдэх үйлдэл нь үндсэн цэсний C
Width цэсний коамндуудын хийх үйлд
5. WM_CONTEXTMENU мэдээлэл ирэхэд хийх үйлдлийг тодорхой
эн функцэд хийгдэх үйлдэл
void CDay11View:
{
// TODO: Add your message
CMenu menu;
// Load the context menu
menu.LoadMenu(IDR_CONTEXTMENU);
// Get the first sub menu (the real menu)
0);CMenu *pContextMenu = menu.GetSubMenu(
// Display the context menu for the user
TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
d());point.x, point.y, AfxGetMainWn
}
8. Программаа хөрвү
ToolBar болон StatusBar ашиглах үй
Программын цонхонд (эцэг) Toolbar нэмэхийн тулд дараах алхмуудыг
шаардлагатай.
1. Шинээр ToolBar үүсгэнэ.
1.1. Resource View->(right click on Toolbar)->Insert Toolbar
1.2. үүссэн ToolBar-н ID-г IDR_TBCOLOR болгон өөрчил.
2. Үүссэн ToolBar –н харагдах байдлыг өөрчилнө.
2.1. ToolBar-д зураг байхгүй хоосон товч байх ба товчин
дарснаар тух
хэрэгслийн самбар дээрх хэрэгслүүдийг ашиглан өөрчлөх
боломжтой. Зургийг өөрчлөх агшинд ToolBar-д шинээр товч
нэмэгдэнэ.
Зургийг нь өөрчилсөн товчны Properties цонхыг
(Alt+Enter) ID -г нь ID_COLOR_BLACK болгон сонго. (хар
хувьд).
2.3. Үүссэн ToolBar-н харагдах байдал
2.4. Өнгөнүүдийн товчны ID-г тус бүрд нь өөрчилнө.
3. Программын цонхонд үүсгэсэн Toolbar-г хавсаргах программын кодыг
нэмнэ. Үүнийг цонх үүсэх агшинд хийж өгнө. Цонх үүсэхэд дуудагддаг
OnCreate функцфункц нь юм.
. Цонхонд ToolBar үүсгэхэд ашиглах хувьсагчаа зарлана.3.1
3.1.1. Class view->(right click on CmainFrame)->Add
Variable
Type: CToolBar, Name: m_wndColorBar, (pro
айдалтай болгон өөрчиOnCreate функцийг дараах б
OnCreate(LPCREATEint CMainFrame::
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 33 
LYBY |
_wndToolBar.LoadToolBar(IDR_MAINFRAME))
return -1; // fail to create
T, WS_CHILD |
CBRS_TOOLTIPS |
OR))
// Loop through the buttons, setting them to act as radio
uttons
r.SetButtonStyle(i, TBBS_CHECKGROUP);
the toolbar
ANY);
BRS_ALIGN_ANY);
;
_wndToolBar);
бар бий
тодорхойл
5.1. ew ц .
5.2. үйлдэл
) != 0);
5.3. ааран цэсний
тэмдэг гдсэ кцийг
нэмнэ.
UI handler code here
etStyle() & WS_VISIBLE) != 0 ?
1 : 0);
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_F
CBRS_SIZE_DYNAMIC) ||
!m
{
TRACE0("Failed to create toolbarn");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
ators,!m_wndStatusBar.SetIndicators(indic
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status barn");
}
int iTBCtlID;
int i;
// Create the Color Toolbar
FLAif (!m_wndColorBar.CreateEx(this, TBSTYLE_
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndColorBar.LoadToolBar(IDR_TBCOL
{
TRACE0("Failed to create toolbarn");
// fail to createreturn -1;
}
// Find the Black button on the toolbar
iTBCtlID = m_wndColorBar.CommandToIndex(ID_COLOR_BLACK);
if (iTBCtlID >= 0)
{
Ab
for (i= iTBCtlID; i < (iTBCtlID + 8); i++)
m_wndColorBa
}
// TODO: Delete these three lines if you don't want
to
// be dockable
RS_ALIGN_m_wndToolBar.EnableDocking(CB
m_wndColorBar.EnableDocking(C
EnableDocking(CBRS_ALIGN_ANY)
DockControlBar(&m
// Dock the Color Toolbar
DockControlBar(&m_wndColorBar);
return 0;
}
снээр4. Ингэ таны программд өнгөний сонголттой хэрэгслийн сам
болно.
5. Цэсэнд нэмэгдсэн хэрэгслийн самбарын харагдах, харагдахгүйг
до
i
г үйлдэлтэй цэс нэмье.
V эсэнд Colorbar нэртэй шинэ дэд цэс нэмнэ
андыг сонгоход хийгдэхЭнэ нэмэгдсэн цэсийн ком
void CMainFrame::OnViewColorbar()
{
// TODO: Add your command handler code here
BOOL bVisible;
// Check the state of the color toolbar
tyle() & WS_VISIBLEbVisible = ((m_wndColorBar.GetS
// Toggle the color bar
ShowControlBar(&m_wndColorBar, !bVisible, FALSE);
// Reshuffle the frame layout
RecalcLayout();
}
н ColorBar –н харагдах, харагдахгүйгээс хамМө
эл н эсэхийг тодорхойлно. Үүний тулд дараах фун
v d CMainFrame::OnUpdateViewColorbar(CCmdUI* pCmdUI)oi
{
// TODO: Add your command update
pCmdUI->SetCheck((m_wndColorBar.G
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 34 
}
д
өгнө. Өөрөөр
7.4
а гэсэн мөрийг 2 удаа нэмнэ.
IDR_TBCOLOR TOOLBAR DISCARDABLE 16, 15
BEGIN
LOR_YELLOW
LOR_WHITE
7.6.
гарч ирнэ.
команды д шинэ мөр нэмнэ. Дараах
мө
6. Программаа хөрвүүлж ажиллагааг нь шалга.
Хэрэгслийн самбарт comboBox нэмэх
7. Цэс хэлбэрээр хийсэн шулууны өргөнийг тодорхойлох үйлдлийг
слийхэрэг н самбар дээр combobox контрол ашиглан хийе. Үүний тул
дараах үйдлүүдийг хийнэ.
7.1. Visual C++ -н едитор ашиглан Toolbar-т Combobox нэмэх
ломж бид үүнийг өөрсдөө хйижбо гүй байдаг. Иймээс
хэлбэл программынхаа resource файлыг өөрчилнө.
7.2. Visual C++-с гар.
7.3. Notepad-г ажиллуулан Lab5.rc файлыг нээ.(өөрийн
программын директор дотроос)
Bar хэмээх toolbar-н бичлэг. Үүнд саяын нэмэгдсэн Color
байга . Түүний ард Separator
BUTTON ID_COLOR_BLACK
BUTTON ID_COLOR_BLUE
BUTTON ID_COLOR_GREEN
BUTTON ID_COLOR_CYAN
BUTTON ID_COLOR_RED
OLOR_MAGENTABUTTON ID_C
BUTTON ID_CO
BUTTON ID_CO
SEPARATOR
SEPARATOR
END
7.5. Үүний эхнийх нь обьектын хоорондох зураас, 2 дахь нь ямар
нэгэн обьек тавих зай гэж ойлгодог.
ComboBox-д сонгогдох мөрүүдийг String Table-д нэмнэ.
(double click on String Table) дараах хэлбэрээр
7.7. Үүн дээр хулганы баруун товчийг товшиход гарч ирэх
цэснээс Insert String г сонгоо
рүүдийг нэм.
ID Caption
ID_WIDTH_VTHIN Very Thin
ID_WIDTH_THIN Thin
ID_WIDTH_MEDIUM Meduim
ID_WIDTH_THICK Thick
ID_WIDTH_VTHICK Very Thick
7.8. Одоо программын аргаар ComboBox-г нэмэх хэрэгтэй. Үүнийг
үүсгэнэ.
хийхийн тулд дараахалхмуудыг гүйцэтгэнэ.
7.8.1. Combobox-д ашиглах ID-г үүсгэнэ.
лдэнэ.7.8.2. ComboBox2-г toolbar дээр үүсгэх зайг бэ
8.3.7. Combobox-г Toolbar-н хүүхэд цонх байдлаар
7.8.4. ComboBox-д сонгогдох мөрүүдийг нэмнэ.
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 35 
тусад нь функц үүсгэе. (BOOL
7.11. лдэл
ar()
iTBCtlID;
Y |
)
rBar.CommandToIndex(ID_COLOR_BLACK);
Bar.SetButtonStyle(i, TBBS_CHECKGROUP);
9, IDC_CBWIDTH, TBBS_SEPARATOR,nWidth);
;
nHeight;
t, &m_wndColorBar, IDC_CBWIDTH);
.AddString((LPCTSTR)szStyle);
ource View->Right click on Lab4 Resources->Resource
х хэсгийг тусад нь авсан учраас OnCreate функц нь
(lpCreateStruct) == -1)
D |
))
);
turn -1; // fail to create
7.9. Дээрх үйлдлийг хийсэн программын кодыг нэмье.
7.10. Хялбарчилахын тулд
CMainFrame::CreateColorBar())
Нэмэгдсэн функцэд хийгдэх үй
BOOL CMainFrame::CreateColorB
{
int
int i;
if (!m_wndColorBar.CreateEx(this, TBSTYLE_FLAT,
WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYB
IZE_DYNAMIC) ||CBRS_S
!m_wndColorBar.LoadToolBar(IDR_TBCOLOR)
{
TRACE0("Failed to create toolbarn");
return FALSE; // fail to create
}
BCtlID = m_wndColoiT
if (iTBCtlID >= 0)
{
for (i= iTBCtlID; i < (iTBCtlID + 8); i++)
m_wndColor
}
// Add the Combo
int nWidth = 100;
int nHeight = 125;
// Configure the combo place holder
m_wndColorBar.SetButtonInfo(
// Get the colorbar height
CRect rect;
m_wndColorBar.GetItemRect(9, &rect)
rect.bottom = rect.top +
// Create the combo box
m_ctlWidth.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL |
CBS_DROPDOWNLIST, rec
// Fill the combo box
CString szStyle;
if (szStyle.LoadString(IDS_WIDTH_VTHIN))
m_ctlWidth.AddString((LPCTSTR)szStyle);
if (szStyle.LoadString(IDS_WIDTH_THIN))
m_ctlWidth.AddString((LPCTSTR)szStyle);
if (szStyle.LoadString(IDS_WIDTH_MEDIUM))
m_ctlWidth.AddString((LPCTSTR)szStyle);
if (szStyle.LoadString(IDS_WIDTH_THICK))
m_ctlWidth.AddString((LPCTSTR)szStyle);
if (szStyle.LoadString(IDS_WIDTH_VTHICK))
m_ctlWidth
return TRUE;
}
7.12. Үүнд ашиглагдаж байгаа IDC_CBWIDTH нь combobox-н ID юм.
Үүнийг дараах байдлааг нэмнэ.
7.13. Res
bolSym s
7.14. New-> Name: IDC_CBWIDTH
8. ColorBar үүсгэ
өөрчлөгдөнө.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
FrameWnd::OnCreateif (CMDI
return -1;
f (!m_wi ndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHIL
WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |
C) ||CBRS_SIZE_DYNAMI
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME
{
RACE0("Failed to create toolbarn"T
re
Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй
Боловсруулсан багш: Т.Уламбаяр  Page 36 
}
_ANY);
dth
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
n");TRACE0("Failed to create status bar
l to createreturn -1; // fai
}
if (!CreateColorBar())
{
barn");TRACE0("Failed to create color tool
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar
to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndColorBar.EnableDocking(CBRS_ALIGN
EnableDocking(CBRS_ALIGN_ANY);
;DockControlBar(&m_wndToolBar)
// Dock the Color Toolbar
dColorBar);DockControlBar(&m_wn
return 0;
}
ахад ComboBox нэмэгдсэн нь харагдана.9. Программа ажиллуул
ComboB үox-н йлдлийг нэмэх.
10. ComboBox-н сонголт өөрчлөгдсөн хэмээх event нь ON_CBN_SELCHANGE
эм хэд дуудагдах функцийг нэмнэ.х ээх утга байдаг. Энэ Event-г илрэ
11. дэлНэмэгдсэн функцэд хийгдэх үйл
d CMavoi inFrame::OnSelChangeWidth()
{
// Get the new combo selection
.GetCurSel();int nIndex = m_ctlWidth
CB_ERR)if (nIndex ==
return;
// Get the active document
)GetActiveDocument();CToolbarDoc* pDoc = (CToolbarDoc*
ve a valid document?// Do we ha
if (pDoc)
// Set the new drawing wi
pDoc->SetWidth(nIndex);
}
12. Харин нэмсэн функцээ Event-тэй холбохдоо CMainFrame классын
messagemap-д дараах өөрчлөлтийг хийнэ.
///////////////////////////////////////////////////////////////////////
//////
CMainFrame//
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_VIEW_COLORBAR, OnViewColorbar)
ON_UPDATE_COMMAND_UI(ID_VIEW_COLORBAR, OnUpdateViewColorbar)
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_CBWIDTH, OnSelChangeWidth)
END_MESSAGE_MAP()
13. Нэмэгдсэн функц дэх SetWidth функц нь баримтын шулууны өргөнийг
өр .ө члөх функц юм. Иймээс дээрхи функцийг нэм
14. Программаа хөрвүүлж ажиллагааг шалга.
Status Bar ашиглах
15. StatusBar нь индикаторууд хэмээх текст мэдээлэл илэрхийлэх
хэсгүүдээс тогтдог. Программист мэдээллийн самбар дээр өөрийн
мэдээллийн гаргах индикатор хэсгийн нэмэх боломжтой. Үүнийг
роп граммд зарласан байдаг.
16. ям мье.Бид ар өнгө сонгогдсоныг илтгэдэг индикатор шинээр нэ
16.1. String Table-д индикаторын ID-г Caption-г өгнө.
_IN(ID DICATOR_COLOR)
16.2. Индикаторуудын зарлалтанд нэмсэн индикаторыг нэмнэ.
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts
Vizual programchilal cu lekts

Contenu connexe

Tendances

Lecture12
Lecture12Lecture12
Lecture12orgil
 
Lecture 6 microsoft office excel 2007
Lecture 6 microsoft office excel 2007Lecture 6 microsoft office excel 2007
Lecture 6 microsoft office excel 2007soyoltsetsegs
 
Excel програмын тухай ойлголт 1
Excel програмын тухай ойлголт 1Excel програмын тухай ойлголт 1
Excel програмын тухай ойлголт 1altanaa
 

Tendances (7)

Lecture12
Lecture12Lecture12
Lecture12
 
Delphi
DelphiDelphi
Delphi
 
Excel Lesson
Excel  LessonExcel  Lesson
Excel Lesson
 
Lecture 6 microsoft office excel 2007
Lecture 6 microsoft office excel 2007Lecture 6 microsoft office excel 2007
Lecture 6 microsoft office excel 2007
 
Excel програмын тухай ойлголт 1
Excel програмын тухай ойлголт 1Excel програмын тухай ойлголт 1
Excel програмын тухай ойлголт 1
 
S5
S5S5
S5
 
Pdf
PdfPdf
Pdf
 

En vedette (7)

C# hicheelin lekts
C# hicheelin lektsC# hicheelin lekts
C# hicheelin lekts
 
анги тайлан
анги тайлананги тайлан
анги тайлан
 
си хэл 10
си хэл 10си хэл 10
си хэл 10
 
Lecture vcp413
Lecture vcp413Lecture vcp413
Lecture vcp413
 
Gariin avlaga
Gariin avlagaGariin avlaga
Gariin avlaga
 
бодлого C++
бодлого C++бодлого C++
бодлого C++
 
U.cs101 алгоритм программчлал-2
U.cs101   алгоритм программчлал-2U.cs101   алгоритм программчлал-2
U.cs101 алгоритм программчлал-2
 

Similaire à Vizual programchilal cu lekts

Similaire à Vizual programchilal cu lekts (20)

C++ суулгах
C++ суулгахC++ суулгах
C++ суулгах
 
лекц-2
лекц-2лекц-2
лекц-2
 
Sedev 1
Sedev 1Sedev 1
Sedev 1
 
001 vba
001 vba001 vba
001 vba
 
Sw206 lec
Sw206 lecSw206 lec
Sw206 lec
 
Auto cad программын монгол ном
Auto cad программын монгол номAuto cad программын монгол ном
Auto cad программын монгол ном
 
Autocad 140430000617-phpapp02
Autocad 140430000617-phpapp02Autocad 140430000617-phpapp02
Autocad 140430000617-phpapp02
 
Auto cad программын монгол ном
Auto cad программын монгол номAuto cad программын монгол ном
Auto cad программын монгол ном
 
3
33
3
 
Lekts 3
Lekts 3Lekts 3
Lekts 3
 
Adobe Flash hicheel Mongol Флаш хичээл монгол
Adobe Flash hicheel Mongol Флаш хичээл монголAdobe Flash hicheel Mongol Флаш хичээл монгол
Adobe Flash hicheel Mongol Флаш хичээл монгол
 
мэдээллийн технологи 1 тест
мэдээллийн технологи 1 тестмэдээллийн технологи 1 тест
мэдээллийн технологи 1 тест
 
203lab1
203lab1203lab1
203lab1
 
C++
C++C++
C++
 
SPSS программын хэрэглээ
SPSS программын хэрэглээSPSS программын хэрэглээ
SPSS программын хэрэглээ
 
Spss дээр судалгаа хийх
Spss дээр судалгаа хийхSpss дээр судалгаа хийх
Spss дээр судалгаа хийх
 
Control panel
Control panelControl panel
Control panel
 
хичээл № 5 powerpoint
хичээл № 5 powerpointхичээл № 5 powerpoint
хичээл № 5 powerpoint
 
удирдах элементүүд
удирдах элементүүдудирдах элементүүд
удирдах элементүүд
 
програмд үүсэх алдаа
програмд үүсэх алдаапрограмд үүсэх алдаа
програмд үүсэх алдаа
 

Plus de E-Gazarchin Online University

Plus de E-Gazarchin Online University (20)

ESON101-Хичээл 11 /20190325/
ESON101-Хичээл 11 /20190325/ESON101-Хичээл 11 /20190325/
ESON101-Хичээл 11 /20190325/
 
ECON302-хичээл 10 /20190319/
ECON302-хичээл 10 /20190319/ECON302-хичээл 10 /20190319/
ECON302-хичээл 10 /20190319/
 
ECON302-хичээл 9 /20190312/
ECON302-хичээл 9 /20190312/ECON302-хичээл 9 /20190312/
ECON302-хичээл 9 /20190312/
 
ESON101-Хичээл 8 /20190306/
ESON101-Хичээл 8 /20190306/ESON101-Хичээл 8 /20190306/
ESON101-Хичээл 8 /20190306/
 
ESON101-Хичээл 9 /20190313/
ESON101-Хичээл 9 /20190313/ESON101-Хичээл 9 /20190313/
ESON101-Хичээл 9 /20190313/
 
ECON303-Хичээл 9 /20190311/
ECON303-Хичээл 9 /20190311/ECON303-Хичээл 9 /20190311/
ECON303-Хичээл 9 /20190311/
 
ECON303-Хичээл 8 /20190304/
ECON303-Хичээл 8 /20190304/ECON303-Хичээл 8 /20190304/
ECON303-Хичээл 8 /20190304/
 
ECON303-Хичээл 6 /20190218/
ECON303-Хичээл 6 /20190218/ ECON303-Хичээл 6 /20190218/
ECON303-Хичээл 6 /20190218/
 
ECON303-Хичээл 10 /20190318/
ECON303-Хичээл 10 /20190318/ECON303-Хичээл 10 /20190318/
ECON303-Хичээл 10 /20190318/
 
ESON101-Хичээл 7 /20190227/
ESON101-Хичээл 7 /20190227/ESON101-Хичээл 7 /20190227/
ESON101-Хичээл 7 /20190227/
 
ESON101-Хичээл 6-1 /20190220/
 ESON101-Хичээл 6-1 /20190220/ ESON101-Хичээл 6-1 /20190220/
ESON101-Хичээл 6-1 /20190220/
 
ECON303-Хичээл 7 /20190225/
ECON303-Хичээл 7 /20190225/ECON303-Хичээл 7 /20190225/
ECON303-Хичээл 7 /20190225/
 
ESON101-Хичээл 5 /20190213/
ESON101-Хичээл 5 /20190213/ESON101-Хичээл 5 /20190213/
ESON101-Хичээл 5 /20190213/
 
KLON103-Хичээл-2 /20190125/
KLON103-Хичээл-2 /20190125/KLON103-Хичээл-2 /20190125/
KLON103-Хичээл-2 /20190125/
 
ECON302-хичээл 4 /20190129/
ECON302-хичээл 4 /20190129/ECON302-хичээл 4 /20190129/
ECON302-хичээл 4 /20190129/
 
ESON101-Хичээл 4 /20190130/
ESON101-Хичээл 4 /20190130/ESON101-Хичээл 4 /20190130/
ESON101-Хичээл 4 /20190130/
 
KLON102-Хичээл 3/20190122/
KLON102-Хичээл 3/20190122/KLON102-Хичээл 3/20190122/
KLON102-Хичээл 3/20190122/
 
ESON101-Хичээл 3 /20190123/
ESON101-Хичээл 3 /20190123/ ESON101-Хичээл 3 /20190123/
ESON101-Хичээл 3 /20190123/
 
CPON411-Хичээл-2-1 /20190122/
CPON411-Хичээл-2-1 /20190122/ CPON411-Хичээл-2-1 /20190122/
CPON411-Хичээл-2-1 /20190122/
 
KLON102-Хичээл 2 /2019015/
KLON102-Хичээл 2 /2019015/ KLON102-Хичээл 2 /2019015/
KLON102-Хичээл 2 /2019015/
 

Vizual programchilal cu lekts

  • 1. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 1  Visual C++) Lecture №1-2 Виндоуз орчинд Визуаль С++ хэл ашиглан программ бичих Microsoft Visual C++ Microsoft Visual C++ нь С болон С++ хэл дээр төрөл бүрийн программ бичихэд зориулагдсан. Өөрөөр хэлбэл Windows орчны программыг С++ хэлийг ашиглан бичихэд зориулагдсан. Мөн MFC (Microsoft Founded Classes) –г ашиглан өөрийн программын хүчин чадлыг нэмэгдүүлэх боломж олгодог Визуаль Программчлалын Орчин юм. Визуаль С++ нь таны программ бичих бүх алхмуудыг (бичиглэл нэмэх, хөрвүүлэх, ажиллуулах, ажиллагааг шалгах, программыг оновчтой болгох) хянаж чиглүүлж өгнө. Visual C++ -г ажиллуулахдаа дараах алхмуудыг гүйцэтгэнэ. 1. Windows –н Start цэсний Programs дэд цэсийг сонгоно. 2. Microsoft Visual C++ 6.0 –г сонго. (хэрэв та Visual C++-н зөвхөн дангаараа байдаг хэлбэрийг суулгасан бол Microsoft Visual C++ 6.0 -г, Microsoft Visual Studio -н нэгэн хэсэг болдог хэлбэрийг суулгасан бол Microsoft Visual Studio 6.0 -г сонгож доторхи жагсаалтаас Visual C++-г сонгоно) 3. Дээрхи цонх нь танд Visual C++-г ашиглах бяцхан заавруудыг өгнө. Next Tip товчийг даран дараагийн зааврууд руу орж болно. Close товчийг дарж ажилдаа орно. Visual C++ хэл дээр бичигдэж байгаа программын зүрхэн хэсгийг Ажлын зайд (WorkSpace) агуулагдах прожект (project) гэж хэлж болно. Нэг ажлын зайд хэд хэдэн прожект байж болно. Жишээ нь хэрэв та DLL (Dynamic Link Library) файл бичиж байгаа бол түүний ажиллагааг шалгах программыг тухайн ажлын зайд үүсгэж болно. Прожект файл нь .dsp (developer studio project) өргөтгөлтэй байх ба үүнд программд хамаарах файлууд тухай мэдээллийг агуулахаад гадна Visual C++ программыг хэрхэн ажиллуулах, хөрвүүлэх талын тохируулгуудыг мөн агуулна. Прожект файл үүсгэх болгонд ажлын зай үүсэх ба .dsw (developer studio workspace) өргөтгөлтэй байна. Үүнд Visual C++ -н аль цонх харагдаж аль нь харагдахгүй байгаа зэрэг мэдээллүүдийг агуулна. WorkSpace нь программын кодыг 3 хэлбэрээр харуулна. 1. Class View программын кодыг С++ хэлний обьект (class) –н түвшингээр харуулна. Мод хэлбэрээр харуулах ба обьектуудыг гишүүн өгөгдөл, гишүүн функцийг харуулна. 2. Resource View программын төрөл бүрийн санг (цонх, цэс, зураг) харуулах ба засвар хийх боломжийг олгоно. 3. File View программын бүх файлуудыг харуулна. • Прожектийн тохируулгыг Project цэсний Settings командыг • WorkSpace –ийн тохируулгыг Tools цэсний Options болон Customize командуудыг сонгосноор хийж болно. Шинээр прожект үүсгэх Анхны программ Энэ программ нь 2 товчтой цонх ба эхний товчийг дарахад Hello гэсэн мэдээлэл гарч ирдэг, удаах товчийг дарахад программаас гардаг. Шинээр прожект үүсгэхийн тулд дараах алхмуудыг гүйцэтгэнэ. 1. Шинээр прожектийн ажлын зай үүсгэнэ. 2. Application Wizard-г ашиглан программын код болон санг үүсгэнэ. 3. Үүссэн санд буй цонхны харагдах байдлыг өөрийн үзэмжээр өөрчлөнө. 4. Кодод Hello мэдээлэл гаргах үйлдлийг нэмнэ. 5. Программын зургийг (icon) солино. Шинээр прожектийн ажлын зай үүсгэх. 1. File цэсээс New командыг сонгоно.
  • 2. Визу Бол уал програ о Прог Прог амчлал СИ овсруулсан 2. P 3. P 4. L 5. O A AppWiza гүйцэтгэн 1 2 3 4 5 6 7 8 9 1 граммын цо раммын хар 1. Reso 2. Dialo хара 3. TODO 4. Canc хэмж 5. Хулга Prope 6. Гарч цонх И++ хичээл н багш: Т. Projects хэсгэ Project Name Location хэсэ Ok товчийг AppWizard-г ard-г ашигл нэ. . Алхам 1- 2. Алхам 2- 3. Програм Applicatio 4. Алхам 3 алхамд ш 5. Finish то 6. Ok товчи 7. Програм Хөрвүүлэ 8. Хөрвүүлэ анхааруу 9. Build цэс 0. Таны пр гэсэн 2 т онхны хара рагдах байдл ource View хэ og –г дэлгэхэ гдах байдал O мэдээлли cel товчийг з жээгээр өөрч аны баруун erties коман ирэх цонхн ыг хаа. Энэ лийн лекц .Уламбаяр ээс MFC Ap e хэсэгт прож эгт прожекти дар. Ингэхэ эхлүүлнэ. лан програ -д Dialog Ba -д ActiveX C мын нэр би on гэж бичээ 3-д өөрчлөл шилжинэ. вчийг дарах ийг дарж про м үүссэний элт хийж ба элт хийж улгын тоог х сээс Execute рограмм нэг товч байна. А агдах байдл лыг дараах эсгийг сонго эд гарч ирэх л гарч ирнэ. ийг тэмдэглэ зөөж цонхны чил. товчийг Can дыг сонго. ы Caption хэ гарч ирэх ц ийн хураа р ppWizard (ex жектийн нэр ийн байрлах эд 2 үйлдэл ммын код sed Applicat Controls тэмд чих хэсэгт б эд Next товч т хийлгүй х хад үүсэх пр ограммын ко й дараа Bui айх явцыг Ou дууссаны харуулна. e Hello.exe ко г цонхтой б Аль нэг товч лыг өөрчлө байдлаар ө о х IDD_HELLO ээд устга. (de ы дээр авчир ncel товчин эсэгт буй ут цонхон дээр ангуй xe)-г сонго. рийг (Hello) б х замыг зааж л хийгдэнэ: болон са tion-г сонго. дэглэгээг ари байгаа Hello ч дар. хэвээр үлдэ рограммын т од болон са ild цэсээс B utput цонхно дараа про омандыг сон а түүн дээр чийг даран п өх өөрчилье. Үү O_DIALOG н el товч) рах ба өргөн дээр даран гыг &Close б тухайн товч бич. ж өгнө. : прожектий нг үүсгэхдэ Next товчий илга. o үгийг арил ээгээд Next талаар мэдэ нг үүсгэнэ. Build Hello.e оос харж бол ограммд ба нгон програ р TODO мэ программыг үний тулд нэрэн дээр 2 нийг нь цонх гарч ирэх ц болгон өөрч ч буюу контр йн директоррыг үүсгэнэ.. ээ дараах алхмуудыгг йг дар. лган My Firstt Visual C+++ товч дарж төгсгөлийнн ээлэл гарч ирнэ. exe команды лно. ыг сонгоно.. айгаа алдаа болонн ммаа ажилл эдээлэл ба г дуусгана. луулна. OK, Cancell 2 товшиход цонхны хны өргөний цэсээс (Popuup menu) члөөд Ok тов ролын шинж Page 2 вчийг дарж ж чанарууд 2 
  • 3. Визу Бол уал програ о Прог байн Прог Прог Прог үүний Даал     амчлал СИ овсруулсан гарч ID хэ боло 7. Ok то &Hel 8. Прог раммын тов а. граммд үйл раммд үйлд 1. Hello Class 2. Дара нэмэ 3. Mess нэмэ 4. Нэмс 5. Өөрч // TO гэсэн 6. Mess гэсэн 7. Прог раммын зур йг солих ша 1. Reso 2. Дэлгэ 3. Прог хийсн хэлбэ лгавар: 1. Abou 2. Үндс 3. Hello болго 4. Mess И++ хичээл н багш: Т. ирэх ба тэд эсэгт контрол охгүй. овчийг зураг lo болгон өө раммаа хөр вчуудыг дара лдэл нэмэх длийг нэмэхд o товчинд үй s Wizard ком аах цонх гар эх обьектийн sages хэсгээ эх эсэхийг ас сний дараа E члөлт хийхдэ DO: Add you н үйдлийн да sageBox("He н мөрийг нэм раммын ажи ргийг солих. ардлагатай ource View -> эцэнд гарч и раммаа ажи нээр програ эрийг харж ut цонхон дээ эн цонхны M o ба Bye хэм он өөрчил. sageBox фун лийн лекц .Уламбаяр дгээрийг про лын нэрийг гт харагдах өрчил. рвүүлэн ажил ахад Close т дээ Visual C йлдэл нэмэхд мандыг сонго ч ирэх ба үү н ID (IDHELL эс BN_CLICK суух ба Ok т Edit Code то ээ ur control not араа өөрийн ello. This is m м. иллагааг ша AppWizard н . Үүний тулд > Icon -> IDR ирэх зураг з иллуулахад аммын тухай болно. эр Bye хэмэ Minimize бол мээн мэдээлэ нкцийг судла ийн хураа р граммист өө бичих ба эн байдлаар ө ллагааг нь ш товч програ C++ Class Wi дээ товчин д оно. үнд дээр обь LO)–г сонгон KED –г сонго товчийг дара овчийг даран tification han н үйлдлүүди my first Visua алга. нь программ д R_MAINFRA урах хэрэгсл өөрчилсөн з й мэдээллий ээн мэдээлэ лон Maximize эл гаргадаг ан гарч ирэх ангуй өрийн сонир нэ нэр нь өөр өрчлөөд ID шалга. ммыг хааж H izard-г ашигл дээр баруун ьектуудын ID но. оод Add Fun ан функцийг н тухайн фу ndler code he ийг нэмнэ. al C++ Applic мын зургийг ME-р дээр 2 лүүдийн аш зураг харагд йг гаргах цон л гаргадаг т e товчнууды цонхны HEL х товч болон рхлын дагуу р контролын утгыг IDHEL Hello товч п лана. н товчийг да D (Object ID nction товчий г нэмнэ. ункцэд өөрчл ere cation!"); автоматаар 2 товшилт хи шиглан зурги дах ба Abou нхон дээрээ товч нэм. ыг гарга. LLO нэрийг н зургийг өө у өөрчилж бо н нэртэй дав олно. Үүний вхцаж LLO, captionn утгыг рограммыг ххаахгүй аран гарч иррэх цэсээс s)-с өөрийн үйлдэл йг дарна. Эннэ функц лөлт хийнэ. р (MFC) үүсггэдэг ба ий. йг өөрчил. ut Hello сонго с зургийн то олтыг ом My First Appplication өрчил. Page 33 
  • 4. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 4  Lecture № 3-4 Өөрийн программд стандарт контролуудыг ашиглах Виндовс орчны бүх программуудад (buttons, check boxes, text fields, and drop-down list boxes) зэрэг контролуудыг ашигласан байдаг. Эдгээрийн системээс авч ашигладаг ба бэлэн үүссэн байдаг. Үүнийг Визуаль С хэл дээр авч ашиглах нь маш хялбар байдаг. Бидний өнөөдөр сурах зүйлс: • Хувьсагчуудыг хэрхэн зарлах ба тэдгээрийг хэрхэн контролуудад хавсаргах • Контрол ба хувьсагчуудын утгыг хэрхэн хооронд нь зохицуулах • Контролуудын ажиллагаанд хэрхэн үйлдэл оруулах • Программын ажиллагааны явцад контролуудын төлөв байдлыг хэрхэн программчлах Үндсэн контролууд Виндоузын стандарт контролуудад олон төрлийн контролууд байдаг боловч өнөөдөр бид дараах контролуудыг үзнэ: • Static text • Edit box • Command button • Check box • Radio button • Drop-down list box (combo box) Эдгээр нь визуаль С++-д бэлэн байдаг бөгөөд шууд авч ашиглах боломжтой. Тэдгээрийг визуаль С –н Dialog Painter-с авч болно. Зураг 1. Static Text Control Үүнийг хэрэглэгчид контролын нэр болон элдэв тайлбарыг текст байдлаар харуулахад ашиглана. Хэрэглэгч ажиллагааны явцад текстийг нь өөрчлөх боломжгүй. Гэвч үүний текстийг программист программын аргаар өөрчилж болно. Edit Box Control Энэ нь хэрэглэгч текст бичих ба текстийг өөрчлөх зориулалттай. Өөрөөр хэлбэл энэ нь программд хэрэгтэй өгөгдлийг хэрэглэгчээс оруулахад ашиглагддаг үндсэн контрол. Гэхдээ энэ нь зөвхөн ердийн текстийг өруулахыг зөвшөөрдөг. Command Button Control Энэ нь хэрэглэгч ямар нэгэн үйлдлийг хийх команд өгөхөд ашиглагддаг. Командын товч контрол нь нэртэй байх ба зарим тохиолдолд зураг байж болно. Check Box Control Энэ нь ямар нэгэн утга үнэн, худал (сонгогдсон эсвэл сонгогдоогүй) гэсэн утга илэрхийлэх үед ашиглагддаг. Radio Button Control Энэ нь Vheck Box-той адил боловч бүлэг байдлаар хэрэглэгддэг буюу олон элементээс аль нэг нь сонгогдсон гэсэн утга илэрхийлдэг. Drop-Down List Box Control Drop-down list box эсвэл combo control нь олон мөр төрлийн жагсаалтаас аль нэгийг нь эсвэл хэд хэдийг сонгосон гэсэн утга илэрхийлдэг. Одоо дээрх контролуудыг программд хэрхэн ашиглах талаар жишээ авч үзье. Доорхи жишээ нь контролуудын утгыг хэрхэн программд ашиглах, контролуудын төлөв байдлыг хэрхэн өөрчлөх, мөн нэг программаас өөр программыг хэрхэн дуудаж ажиллуулах зэрэг талаар ойлголт өгнө. Үүний тулд 1. Dialog Based, MFC EXE Application шинээр үүсгэнэ. Өмнөх лабораторид үзсэн шиг. Прожектийн нэрийг Day2 гэж өгнө. 2. Контролуудыг цонхон дээр байрлуулна. Object Property Setting Static Text ID IDC_STATIC Caption This is an example of a Visual C++ Application using a number of controls. Static Text ID IDC_STATICMSG
  • 5. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан   Page 5  Caption Enter a &Message: Static Text ID IDC_STATICPGM Caption Run a &Program: Edit Box ID IDC_MSG Button ID IDC_SHWMSG Caption &Show Message Button ID IDC_DFLTMSG Caption &Default Message Button ID IDC_CLRMSG Caption &Clear Message Button ID IDC_RUNPGM Caption &Run Program Button ID IDC_EXIT Caption E&xit Combo Box ID IDC_PROGTORUN Group Box ID IDC_STATIC Caption Enable Actions Group Box ID IDC_STATIC Caption Show Actions Check Box ID IDC_CKENBLMSG Caption &Enable Message Action Check Box ID IDC_CKENBLPGM Caption E&nable Program Action Check Box ID IDC_CKSHWMSG Caption S&how Message Action Check Box ID IDC_CKSHWPGM Caption Sh&ow Program Action Мөн Tab товчоор шилжих дарааллыг тодорхойлно. (Layout цэсний Tab Order команд) Combo Box-н төрийн жагсаалтанд утгыг дараах байдлаар нэмнэ. Шинэ мөр нэмэхдээ багш: Т.Уламбаяр
  • 6. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 6  ctrl+Enter товчнуудыг хамт дарна. 3. Контролуудад хувьсагч хавсаргана. Визуаль С++ д контролуудыг хувьсагчтай хамтруулж ашигладаг өөрөөр хэлбэл контрол дахь утгыг хавсаргасан хувьсагчаар дамжуулан программд ашиглах мөн контролын текстийг хувьсагчаар дамжуулан өөрчлөх зэрэг үйлдлийг хийхэд ашиглана. Үүний тулд UpdateData(boolean arg) функцыг ашигладаг. Энэ функцын arg аргументад TRUE утга өгвөл контролоос утга авах, FALSE утга өгвөл контолын утгыг хавсаргасан хувьсагчийн нь утгаар өөрчлөх үйлдлийн гүйцэтгэнэ. Контролуудад хувьсагч хавсаргахын тулд дараах алхмуудыг гүйцэтгэнэ. 1. Class Wizard-г нээ. 2. Member Variables хавтсыг сонго. 3. Хувьсагч хавсаргах контролынхоо ID –г сонго. (IDC_MSG) 4. Add Variable товчийг дар. 5. Дээрх байдлаар хувьсагчаа өгнө. 6. Бусад контролуудад хувьсагч хавсаргахын тулд 3-5 алхмуудыг давтан хийнэ. 4. Бидний программд дараах хувьсагчуудыг хавсаргах шаардлагатай. Control Variable Name Category Type IDC_MSG m_strMessage Value CString IDC_PROGTORUN m_strProgToRun Value CString
  • 7. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 7  IDC_CKENBLMSG m_bEnableMsg Value BOOL IDC_CKENBLPGM m_bEnablePgm Value BOOL IDC_CKSHWMSG m_bShowMsg Value BOOL IDC_CKSHWPGM m_bShowPgm Value BOOL 5. Хувьсагчидаа хавсаргаж дууссан бол Class Wizard2-г хаа. 6. Контролуудад хийгдэх үйлдлийг программчилна. Бидний программын хувьд эхлэ цонх үүсэхэд контролууды эд н анхны утгыг хавсаргасан хувьсагчидаар дамжуулан essage Maps хавтасны member functions хэсгээс OnInitDialog 3. TOD кодыг нэмнэ. хаар утга олгож байна. ролууд руу, эсрэг тохиодолд контролуудаас үүргийг өмнөх 2. Edit Cod гдсэн функц дээр үйлдэл нэмнэ. id CDay control notification handler code here 3. Show M аах үйлдлийг нэм. id CDay тодорхойлно. Үүний тулд 1. Class Wizard-н M функцыг сонго. 2. Edit Code товчийг дар. O тэмдэглэгээний дараа өөрийн программын TODO: Add extra initialization here //message цонхон дээр олгох анхны текст re";m_strMessage = "Place a message he гогдсон бай//бүх checkbox-уудыг сон m_bShowMsg = TRUE; m_bShowPgm = TRUE; m_bEnableMsg = TRUE; m_bEnablePgm = TRUE; // дээрх утгуудаар контролуудыг идэвхжүүлж байна. UpdateData(FALSE); 4. UpdateData функц нь контрол болон хувьсагчдын хоорондох тулхүүр болдог. Өөрөөр хэлбэл хувьсагчдаас контролууд руу эсвэл контролуудаас хувьсагчууд руу утгыг дамжуулах үүргийг гүйцэтгэдэг. Үүнийг аргументын утгаас хамаарч хийнэ. Худал бол хуьсагчдаас кон хувьсагчид руу утгыг дамжуулна. 5. 7. Товчнуудын хийх үйлдлийг хийж өгье. Эхлээд программаас гарах Exit товчны хийе. Үүний тулд Class Wizard-с IDC_EXIT обьектын BN_CLI1. CKED message дээр лаборатори дээрх шиг функц нэм. e o товчийг дарж нэмэ v 2Dlg::OnExit() { // TODO: Add your OnOK(); } e o ssage товчин дээр дар v 2Dlg::OnShwmsg() {
  • 8. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 8  dler code here UpdateData(TRUE); а хөрвүүлж шалгахад Show Message товчийг дарахад дараах цонх рч ирнэ. 5. Clear M ge товчин дээр дараах кодыг хий. ation handler code here m_strMessage=""; 6. уд дээр үүргийг нь нэмэх шаардлагатай. Дараах //IDC_CKENBLMSG –д oid CDay nable Message Action check box тэмдэглэгдсэн байна уу? tDlgItem(IDC_CLRMSG)->EnableWindow(TRUE); tDlgItem(IDC_STATICMSG)->EnableWindow(TRUE); tDlgItem(IDC_CLRMSG)->EnableWindow(FALSE); TATICMSG)->EnableWindow(FALSE); //IDC_CKSHWMSG –д our control notification handler code here // Get the current values from the screen tDlgItem(IDC_CLRMSG)->ShowWindow(TRUE); tDlgItem(IDC_STATICMSG)->ShowWindow(TRUE); // TODO: Add your control notification han MessageBox(m_strMessage); } 4. рограммаП га essa v 2Dlg::OnClrmsg()oid CDay { // TODO: Add your control notific UpdateData(FALSE); } Мөн CheckBox контролу кодуудыг нэмж өг. v 2Dlg::OnCkenblmsg() { // TODO: Add your control notification handler code here UpdateData(TRUE); // E if (m_bEnableMsg == TRUE) { // тэмдэглэгдсэн байвал GetDlgItem(IDC_MSG)->EnableWindow(TRUE); GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE); GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE); Ge Ge } else { // тэмдэглэгдээгүй байвал GetDlgItem(IDC_MSG)->EnableWindow(FALSE); GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE); GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE); Ge GetDlgItem(IDC_S } } v y2Dlg::OnCkshwmsg()oid CDa { // TODO: Add y UpdateData(TRUE); // Is the Show Message Action check box checked? if (m_bShowMsg == TRUE) { // Yes, so show all controls that have anything // to do with showing the user message GetDlgItem(IDC_MSG)->ShowWindow(TRUE); GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE); GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE); Ge Ge } else { // No, so hide all controls that have anything // to do with showing the user message GetDlgItem(IDC_MSG)->ShowWindow(FALSE); GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE); GetDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);
  • 9. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 9  _CLRMSG)->ShowWindow(FALSE); GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE); функц бөгөөд харин GetDlgItem(IDC_DFLTMSG) функц нь ектын эцэг класс болох CWnd классын лж ажиллагааг нь шалга. Программаас өөр программ ажиллуулах үйлдлийг ComboBox-н сонголтоос хамааруулан Run Program товчинд нэмнэ. (IDC_RUNPG () n handler code here gmName rPgmNa _SHOW); rPgmNa WinExec("sol.exe",SW_SHOW); ); 10. Даалгавар: nter a message here” мөрийг EditBox-д хийх үйлдлийг 2. Program Action-ы үйлдлүүдийг нэм. 3. OnRunpgm функцийг хэрэглэгч өөрөө программ зааж ажиллуулдаг болгон өөрчил.     GetDlgItem(IDC } } 8. Өмнө бичсэн программын кодыг тайлбарлавал 1. Контролуудаас хувьсагчид утгыг нь авна. (UpdateData(TRUE);) 2. CheckBox тэмдэглэгдсэн эсэхийг шалгана. 3. Хэрэв утга ҮНЭН бол контролуудыг идэвхжүүлэх эсвэл харагдуулах (EnableWindow(TRUE), ShowWindow(TRUE);) үйлдлийг хийнэ. 4. Эсрэг тохиолдолд контролуудыг идэвхгүй болгох эсвэл нууцлах (EnableWindow(FALSE), ShowWindow(FALSE);) үйлдлийг хийнэ. Энэ функц нь CWnd хэмээх классын гишүүн IDC_DFLTMSG идентификатортой обь заагч утгыг буцаадаг. 9. Программаа хөрвүү M) void CDay2Dlg::OnRunpgm { // TODO: Add your control notificatio UpdateData(TRUE); CString strPgmName; strP =m_strProgToRun; strPgmName.MakeUpper(); if (st me=="PAINT") WinExec("pbrush.exe",SW if (st me=="SOLITAIRE") if (strPgmName=="NOTEPAD") WinExec("NotePad.exe",SW_SHOW } Программыг хөрвүүлж ажиллагааг шалга. 1. Default Message товчийг дарахад “E нэм.                                    
  • 10. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 10  Lecture №5-6 цонхтой программ бичих дадлага эзэмшинэ. Дараах рааллаар хийнэ үү! cation үүсгэ. 2. ролууд болон ад хавсаргах хувьсаг чанар Сэдэв: Программд шинээр диалог нэмэх Өнөөдөр бид хэд хэдэн да 1. My Documents директорт Dialogs нэртэй Dialog Based Appli Үндсэн цонхны харагдах байдлыг дараах байдлаар өөрчил. 3. Конт контролууд чид. Төрөл Шинж Утга Command Button ID IDC_BSHWFONTDLG Caption Show Font Dialog Command Button ID IDC_BSHWPICDLG Caption ShowPicture Dialog Command Button ID IDC_BSHWCSTMDLG Caption Show Custom Dialog Command Button ID IDC_BSHWFOPENDLG Caption pen DialogShow File O Command Button ID IDC_BEXIT Caption Exit Group Box ID IDC_GBTOOL Caption Drawing Tool Disabled Checked Group Box ID IDC_GBSHAPE Caption Drawing Shape Disabled Checked Group Box COLORID IDC_GB Caption Color Disabled Checked Radio Button NID IDC_RTPE Caption Pen Group Checked Disabled Checked
  • 11. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 11  dio Button BRUSHRa ID IDC_RT Caption Brush Disabled Checked Radio Button TMAPID IDC_RTBI Caption Bitmap Disabled Checked Radio Button SLINEID IDC_R Caption Line Group Checked Disabled Checked Radio Button RCLEID IDC_RSCI Caption Circle Disabled Checked Radio Button UAREID IDC_RSSQ Caption Square Disabled Checked Radio Button BLACKID IDC_RC Caption Black Group Checked Disabled Checked Radio Button CBLUEID IDC_R Caption Blue Disabled Checked Radio Button GREENID IDC_RC Caption Green Disabled Checked Radio Button CCYANID IDC_R Caption Cyan Disabled Checked Radio Button RCREDID IDC_ Caption Red Disabled Checked Radio Button ENTAID IDC_RCMAG Caption Magenta Disabled Checked Radio Button LLOWID IDC_RCYE Caption Yellow Disabled Checked Radio Button WHITEID IDC_RC Caption White Disabled Checked Command Button ID IDC_BOPENBMP Caption Choose Bitmap File Disabled Checked Static Text ID IDC_OPTION Caption ng><Null Stri Static Text ID IDC_TEXT Caption ><Null String Static Text ID IDC_STATIC Caption File Name:
  • 12. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 12  Edit Box ID IDC_EFILEPATH Контролуудад хавсаргасан хувьсагчид. 4. Exit товчийг дарахад цонхыг хаах үйдлийг нэм. 5. Show File Open Dialog товчийг дарахад гүйцэтгэх үйлдэл void CDialogsDlg::OnBshwfopendlg() { // TODO: Add your control notification handler code here CFileDialog m_ldFile(TRUE); if (m_ldFile.DoModal()==IDOK) { //Хэрэв ямар нэг файл сонгогдсон бол нэрийг нь авах m_strResults=m_ldFile.GetFileName(); UpdateData(FALSE); } } 6. Программаа хөрвүүлээд ажиллагааг нь шалга. 7. Show Custom Dialog товчийг дарахад хийгдэх үйлдлийг нэмнэ. Энэ нь программистийн нэмсэн цонхыг modal хэлбэрээр харагдуулах ба хэрэглэгчээр нэг сонголт хийлгэх ба мөн текстийг гараас оруулах ба оруулсан текстийг IDC_TEXT контролд, сонголтыг IDC_OPTION контрол текст хэлбэрээр дамжуулах үйлдлүүд байна. Эдгээр үйлдлүүдийг дараах алхмаар хийнэ. 7.1. Шинээр диалог нэмнэ. Resource View->Dialogs(right click)- >Insert Dialog. 7.2. Нэмэгдсэн диалогийн ID-г IDD_MSG_DIALOG болгон өөрчил. 7.3. Харагдах байдлыг доорхиор өөрчил.
  • 13. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 13  7.4. Контролууд Төрөл Шинж чанар Утга Command Button ID IDOK Caption Ok Command Button ID IDCANCEL Caption Cancel Group Box ID IDC_STATIC Caption Select an Option Radio Button ID IDC_RADIO1 Caption Option1 Group Checked Radio Button ID IDC_RADIO2 Caption Option2 Radio Button ID IDC_RADIO3 Caption Option3 Radio Button ID IDC_RADIO4 Caption Option4 Static Text ID IDC_STATIC Caption Enter a Message Edit Box ID IDC_EDIT1 7.5. Диалог үүсгээд харагдах байдлыг өөрчлөхөөс гадна программд дамжуулан ашиглах обьектыг үүсгэх хэрэгтэй. Үүний тулд тухайн диалогийн Class Wizard цонхыг нээхэд шинэ класс үүсгэх эсэхийг асууна. Шинэ класс үүсгэх цонхонд нэрийг нь CdlgMsg гэж өгөөд Dialog ID-д үүсгэсэн цонхны ID болох IDD_MSG_DIALOG –г тодорхойлоод Base Class-д CDialog классыг өгөөд Ok товчийг даран үүсгэнэ. 7.6. Контролуудад хавсаргах хувьсагчид IDC_EDIT1 CString m_strText IDC_RADIO1 Int m_iOption 7.7. Цонхыг ачаалахад хувьсагчдын анхны утгыг тодорхойлно. m_iOption=0; m_strText=""; UpdateData(false); Дээрхи мөрүүдийг OnInitDialog функцэд нэм. 8. Show Custom Dialog товчийг дарахад үүсгэсэн цонхоо дуудахын тулд тухайн класс төрлийн хувьсагчийг дуудах цонхны обьект болох CDialogsDlg класст зарлах хэрэгтэй. (Class View->(Right click on CDialogsDlg) Add Member Variable)
  • 14. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 14  Variable Type: CdlgMsg Variable Name: m_dlgMsg 9. Show Custom Dialog товчийг дарахад хийгдэх үйлдлүүд void CDialogsDlg::OnBshwcstmdlg() { // TODO: Add your control notification handler code here if (m_dlgMsg.DoModal()==IDOK) { m_strOption="Option"; m_strOption+=" Was Selected."; m_strText=m_dlgMsg.m_strText; UpdateData(false); } else { m_strText="Canceled"; UpdateData(false); } } 10. Show Font Dialog товчийг дарахад хийгдэх үйлдлийг нэм. Энэ товчийг дарахад дараах цонх modal хэлбэрээр харагдах ба Sample Text дотор бичигдсэн текстийг Font Sample хэсэгт Select a Font –с сонгогдсон бичгийн хэлбэрээр харагдуулна. Close товчийг дарахад цонхыг хаана. 11. Дээрх үйлдлийг хийхийн тулд дараах алхмуудыг гүйцэтгэнэ. 11.1. Шинээр IDD_FONT_DIALOG нэртэй диалог нэмнэ. 11.2. Ашиглагдах контролуудыг байрлуулна. Төрөл Шинж чанар Утга Command Button ID IDCLOSE Caption Close Төрөл Шинж чанар Утга
  • 15. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 15  atic TextSt ID IDC_STATIC Caption Sample Text Static Text ID IDC_STATIC Caption Select a Font Edit Box ID IDC_ESAMPTEXT List Box ID IDC_LFONTS Group Box ID IDC_STATIC Caption Sample Font Static Text ID IDC_DISPLAYTEXT Caption <null string> Maximized in a group box 11.3. Программд ашиглах классыг үүсгэнэ. (CFontDlg) тролуудад хавсаргах хувьсагчид11.4. Кон IDC_ESAMPTEXT CString m_strSampText IDC_DISPLAYTEXT CString m_strDisplayText IDC_DISPLAYTEXT tCStatic m_ctlDisplayTex IDC_LFONTS CString m_strFontName IDC_LFONTS CListBox m_ctlFontList 11.5. Close товчийг дарахад цонхыг хаах үйлдлийн кодыг нэм. 11.6. Цонх үүсэхэд ListBox-д үйлдлийн системд суулгасан бүх бичгийн шрифтийн авах үйлдлийг хийнэ. Үүнийг тусад нь функц хэлбэрээр . (Class view->(Right click on CFontDlg)Add n->FillFontList 11.9. х үйлдэл List() рөл t(); //ListBox-г цэвэрлэж дэхь фонтуудын . > 0; iCurCount--) хийе. 11.7. Шинээр функц нэмье Member Function) 11.8. Function Type-> void, Function Declaratio Шинээр нэмэгдсэн функцэд хийгдэ void CFontDlg::FillFont { int iCount; int iCurCount; CString strCurFont; CString strPrevFont=""; LOGFONT lf; //Font бүтэц тө lf.lfCharSet = DEFAULT_CHARSET; strcpy(lf.lfFaceName, ""); m_ctlFontList.ResetConten байна. CClientDC dc (this); ::EnumFontFamiliesEx((HDC) dc, &lf,(FONTENUMPROC) EnumFontFamProc, (LPARAM) this, 0); //систем нэ авах функцрийг iCount = m_ctlFontList.GetCount(); // ListBox дахь элементүүдийн сүүлчийнхээс эхнийх хүртэл давтаад // давхацсан элементүүдийг хайж давхцлыг арилгаж байна for (iCurCount = iCount; iCurCount { // Идэвхтэй фонтын нэрийг авах
  • 16. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 16  strCurFont); уу? байна } Proc(LPENUMLOGFONT lpelf, ontList функцийг цонх эхэлж ачаалагдахад дуудах // Set big icon дэх текст will not () handler code here _s SampText; ox m_ctlFontList.GetText((iCurCount - 1), // Өмнөхтэйгээ адил нэртэй байна (strCurFont == strPrevFont)if { // тийм бол устга m_ctlFontList.DeleteString((iCurCount - 1)); } // өмнөх фонтыг идэвхжүүлж strPrevFont = strCurFont; } 11.10. Үүнд байгаа EnumFontFamProc нь функцийн нэр бөгөөд EnumFontFamiliesEx функц нь фонтыг олоод дуудах функц юм.Иймээс энэ функцийг global хэлбэрээр зарлах хэрэгтэй Үүний тулд классы тодорхойлж өгөх шаардлагатай.н header файлд (FontDlg.h) #endif // _MSC_VER > 1000 int CALLBACK EnumFontFam NEWT TMET p m,LP EX RIC l nt DWORD nFontType, long lParam); // FontDlg.h : header file Харин g.cpp) бичиж өгнө.хийгдэх үйлдлийг source файлд (FontDl static char THIS_FILE[] = __FILE__; #endif int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, lParam)LPNEWTEXTMETRIC lpntm, DWORD nFontType, long { ow// Create a pointer to the dialog wind CFontDlg* pWnd = (CFontDlg*) lParam; // Add the font name to the list box pWnd->m_ctlFont >elfLo List.AddString(lpelf- gFont.lfFaceName); 1 to continue font enumeration// Return return 1; } //////////////// ////////////////////////////////////// ////// /// ////////////// // CFontDlg dialog 11.11. FillF хэрэгтэй. BOOL CFontDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); ;SetIcon(m_hIcon, FALSE) // TODO: Add extra initialization here FillFontList(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 11.12. Sample Text дэхь текст өөрчлөгдөхөд Font Sample мөн дагаж өөрчлөгдөх естой. idvo CFontDlg::OnChangeEsamptext() { // TODO: If this is a RICHEDIT control, the control // send this notification unless you override the CDialog::OnInitDialog() ion and call CRichEditCtrl().SetEventMask// funct // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification UpdateData(TRUE); m_strDisplayText = m tr UpdateData(FALSE); } 11.13. ListBox-с фонтын нэрийг сонгоход өөрөөр хэлбэл ListB дахь сонголт өөрчлөгдөхөд Font Sample дахь текстийн фонт
  • 17. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 17  йг хийхийн тулд мөн нэмэлт SetMyFont эгш өнцгийн хэмжээг авах ах хувьсагч ? ); bottom; sitive CHARACTER_PRECIS, , DEFAULT_PITCH | // Set the font for the sample display area 11.14. сонголт өөрчлөгдөхөд даж ol notification handler code here (TRUE); w Font Dialog товчийг дарахад гарч ирэх цонхны хувьсагчийг , товчийг дарахад хийгдэх үйлдлийг нэм r code here , сонголтууд илтгэх ийн хувьсагч нэмнэ. уудыг CPaintDlg обьектын кон . ) lg) nitialization ck өөрчлөгдөх ёстой. Үүни функцийг CfontDlg класст нэмнэ. void CFontDlg::SetMyFont() { CRect rRect; // Font Sample –н т хувьсагч йг авint iHeight; // өндөри // Фонт сонгогдсон байна уу if (m_strFontName != "") { // Font Sample гарах m_ctlDisplayText.GetWindowRect(&rRect area height// Calculate the iHeight = rRect.top - rRect. // Make sure the height is po if (iHeight < 0) iHeight = 0 - iHeight; // Release the current font m_fSampFont.Detach(); // Create the font to be used , 0, 0, 0, FW_NORMAL,m_fSampFont.CreateFont((iHeight - 5) 0, 0, 0, DEFAULT_CHARSET, OUT_ CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY FF_DONTCARE, m_strFontName); m_ctlDisplayText.SetFont(&m_fSampFont); } } Нэмсэн дээрх функцээ ListBox-д дуу ажиллуулах хэрэгтэй. void CFontDlg::OnSelchangeLfonts() { // TODO: UpdateData Add your contr // Set the font for the sample SetMyFont(); } 12. Sho (m_FontDlg) CdialogsDlg класст зарлан . void CDialogsDlg::OnBshwfontdlg() { // TODO: Add your control notification handle m_FontDlg.DoModal(); } 13. Программаа хөрвүүлж ажиллагааг нь шалга. 14. Show Picture Dialog товчийг дарахад цонхон дээр зураг зурах, зургийн файл дуудаж үзүүлэх зэрэг үйлдэл хийх бөгөөд цонх нь ердийн хэлбэрээр гарч ирнэ. Мөн цонхон дээрх зургийн шинж чанарыг тодорхойлох сонголтууд идэвхтэй болно. Товчийг дахин дарахад дээрхи цонх хаагдана идэвхгүй болно. Үүний тулд зургийн цонх харагдаж байгаа эсэхийг булийн төрлийн хувьсагч авч ашиглая. (BOOL m_bPaintVis;) Зураг зурах цонх шинээр нэм (IDD_PAINT_DIALOG)14.1. 14.2. Бүх контролуудыг нь устгаад, Maximize, Minimize товчнуудыг идэвхжүүл, хэмжээг нь өөрчлөх боломжтой болго. 14.3. Тухайн цонхны классыг шинээр үүсгэ. (CPaintDlg) 14.4. Зурагдах өнгийг зохицуулахын тулд COLORREF төрл (COLORREF mr_Colors[8]). Өнгөний утг структор функцэд тодорхойлж өгнө CPaintDlg::CPaintDlg(CWnd* pParent /*=NULL*/ : CDialog(CPaintDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPaintD // NOTE: the ClassWizard will add member i here //}}AFX_DATA_INIT am_crColors[0] = RGB( 0, 0, 0); // Bl m_crColors[1] = RGB( 0, 0, 255); // Blue m_crColors[2] = RGB( 0, 255, 0); // Green m_crColors[3] = RGB( 0, 255, 255); // Cyan m_crColors[4] = RGB( 255, 0, 0); // Red m_crColors[5] = RGB( 255, 0, 255); // Magenta
  • 18. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 18  х void DrawLine(CPaintDC *pDg, int iColor); // зурах функц id CP int iColor) ; EFRAME, 1, m_crColors[iColor]); a een each of the lines points t pens on? SelectObject(&lSolidPen); Pen); &lNullPen); lectObject(&lInsidePen); next position liDist; iShape int iTool, int m_crColors[6] = RGB( 255, 255, 0); // Yellow m_crColors[7] = RGB( 255, 255, 255); // White } 14.5. Энэ цонхон дээр туршилтын хэлбэрээр зураг зурах бөгөөд зурагда төрлийг үндсэн цонхноос удирдана. Зурагдах хэлбэр нь Drawing Tool –д заагдсан байгаа. Үүнд 3 төрлийн хэлбэр байгаа бөгөөд эдгээр класст нэмнэ.ийг тус бүрд нь зурах 3 функцыг CPaintDlg шулуун vo aintDlg::DrawLine(CPaintDC *pdc, { // Declare and create the pens CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]); CPen lDotPen (PS_DOT, 1, m_crColors[iColor]); CPen lDashPen (PS_DASH, 1, m_crColors[iColor]); CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]); CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor]) m_crColors[iColor]);CPen lNullPen (PS_NULL, 1, SIDCPen lInsidePen (PS_IN // Get the drawing are CRect lRect; GetClientRect(lRect); ect();lRect.NormalizeR // Calculate the distance betw CPoint pStart; CPoint pEnd; int liDist = lRect.Height() / 8; CPen *lOldPen; // Specify the starting pStart.y = lRect.top; pStart.x = lRect.left; pEnd.y = pStart.y; pEnd.x = lRect.right; int i; // Loop through the differen for (i = 0; i < 7; i++) { // Which pen are we switch (i) { / Solidcase 0: / lOldPen = pdc-> break; / Dotcase 1: / pdc->SelectObject(&lDotPen); break; case 2: // Dash pdc->SelectObject(&lDashPen); break; case 3: // Dash Dot pdc->SelectObject(&lDashDotPen); break; Dot Dotcase 4: // Dash pdc->SelectObject(&lDashDotDot break; case 5: // Null pdc->SelectObject( break; / Insidecase 6: / pdc->Se break; } // Move down to the pStart.y = pStart.y + pEnd.y = pStart.y; // Draw the line pdc->MoveTo(pStart); pdc->LineTo(pEnd); } // Select the original pen pdc->SelectObject(lOldPen); } void DrawRegion(CPaintDC *pDC, int iColor, int iTool, int ); //дүрс зурах void CPaintDlg::DrawRegion(CPaintDC *pdc, int iColor, iShape) { CPen lSolidPen (PS_SOLID, 1, m_crColors[iColor]); CPen lDotPen (PS_DOT, 1, m_crColors[iColor]);
  • 19. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 19  ; olor]); ); ; ); or]); f the drawing regions .Width() / 4; z - 10; he brushes and pens ; i++) is figure. ht; ; th; brush ); th; brush th; h l . th; ush ); CPen lDashPen (PS_DASH, 1, m_crColors[iColor]); CPen lDashDotPen (PS_DASHDOT, 1, m_crColors[iColor]); CPen lDashDotDotPen (PS_DASHDOTDOT, 1, m_crColors[iColor]) CPen lNullPen (PS_NULL, 1, m_crColors[iC CPen lInsidePen (PS_INSIDEFRAME, 1, m_crColors[iColor] // Declare and create the brushes CBrush lSolidBrush(m_crColors[iColor]); CBrush lBDiagBrush(HS_BDIAGONAL, m_crColors[iColor]); CBrush lCrossBrush(HS_CROSS, m_crColors[iColor]); CBrush lDiagCrossBrush(HS_DIAGCROSS, m_crColors[iColor]) CBrush lFDiagBrush(HS_FDIAGONAL, m_crColors[iColor]); iColor]CBrush lHorizBrush(HS_HORIZONTAL, m_crColors[ CBrush lVertBrush(HS_VERTICAL, m_crColors[iCol sh(RGB(192, 192, 192));CBrush lNullBru // Calculate the size o CRect lRect; GetClientRect(lRect); lRect.NormalizeRect(); int liVert = lRect.Height() / 2; int liHeight = liVert - 10; int liHorz = lRect int liWidth = liHor CRect lDrawRect; CPen *lOldPen; CBrush *lOldBrush; int i; all of t// Loop through for (i = 0; i < 7 { switch (i) { case 0: // Solid // Determine the location for th // Start the first row lDrawRect.top = lRect.top + 5; lDrawRect.left = lRect.left + 5; lDrawRect.bottom = lDrawRect.top + liHeig lDrawRect.right = lDrawRect.left + liWidth; // Select the appropriate pen and brush SolidPen);lOldPen = pdc->SelectObject(&l lOldBrush = pdc->SelectObject(&lSolidBrush) break; case 1: // Dot - Back Diagonal // Determine the location for this figure. lDrawRect.left = lDrawRect.left + liHorz; ft + liWidlDrawRect.right = lDrawRect.le // Select the appropriate pen and ctObject(&lDotPen);pdc->Sele pdc->SelectObject(&lBDiagBrush break; case 2: // Dash - Cross Brush // Determine the location for this figure. lDrawRect.left = lDrawRect.left + liHorz; + liWidlDrawRect.right = lDrawRect.left // Select the appropriate pen and pdc->SelectObject(&lDashPen); pdc->SelectObject(&lCrossBrush); break; case 3: // Dash Dot - Diagonal Cross // Determine the location for this figure. lDrawRect.left = lDrawRect.left + liHorz; liWidlDrawRect.right = lDrawRect.left + // Select the appropriate pen and brus ectObject(&lDashDotPen);pdc->Sel pdc->SelectObject(&lDiagCrossBrush); break; case 4: // Dash Dot Dot - Forward Diagona // Determine the location for this figure // Start the second row lDrawRect.top = lDrawRect.top + liVert; lDrawRect.left = lRect.left + 5; ht;lDrawRect.bottom = lDrawRect.top + liHeig WidlDrawRect.right = lDrawRect.left + li br// Select the appropriate pen and otPenpdc->SelectObject(&lDashDotD pdc->SelectObject(&lFDiagBrush); break; case 5: // Null - Horizontal // Determine the location for this figure. lDrawRect.left = lDrawRect.left + liHorz;
  • 20. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 20  t + liWidth; brush ; th; brush Brush); n); d pen void ShowBitmap(CPaintDC *pDC, CWnd *pWnd); // гаргах Wnd) g*)pWnd; itmap = (CBitmap*)dcMem.SelectObject(lpWnd- available ndow , 14.6. функцэд дараах үйдлийг нэмнэ. ting ndler code here sDlg *pWnd = (CDialogsDlg*)GetParent(); ? shape drawing a ellipse or rectangle DrawRegion(&dc, pWnd->m_iColor, pWnd->m_iTool, lDrawRect.right = lDrawRect.lef // Select the appropriate pen and pdc->SelectObject(&lNullPen) pdc->SelectObject(&lHorizBrush); break; case 6: // Inside - Vertical // Determine the location for this figure. lDrawRect.left = lDrawRect.left + liHorz; + liWidlDrawRect.right = lDrawRect.left // Select the appropriate pen and ectObject(&lInsidePen);pdc->Sel pdc->SelectObject(&lVert break; } // Which tool are we using? ool == 0)if (iT pdc->SelectObject(lNullBrush); else pdc->SelectObject(lNullPe // Which shape are we drawing? if (iShape == 1) pdc->Ellipse(lDrawRect); else pdc->Rectangle(lDrawRect); } n// Reset the original brush a pdc->SelectObject(lOldBrush); pdc->SelectObject(lOldPen); } зураг vo aintDlg::ShowBitmap(CPaintDC *pdc, CWnd *pid CP { CDialogsDlg *lpWnd = (CDialogsDl BITMAP bm; // Get the loaded bitmap lpWnd->m_bmpBitmap.GetBitmap(&bm); CDC dcMem; // Create a device context to load the bitmap into dcMem.CreateCompatibleDC(pdc); // Select th bitmap into the compatible device contexte CBitmap* pOldB >m_bmpBitmap); CRect lRect; // Get the display area GetClientRect(lRect); lRect.NormalizeRect(); // Copy and resize the bitmap to the dialog wi pdc->StretchBlt(10, 10, (lRect.Width() - 20) (lRect.Height() - 20), &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); } int Dialog-н OnPaintPa void CPaintDlg::OnPaint() { CPaintDC dc(this); // device context for pain // TODO: Add your message ha CDialog // Do we have a valid pointer if (pWnd) { // Is the tool a bitmap? if (pWnd->m_iTool == 2) { if (pWnd->m_sBitmap!="") ShowBitmap(&dc,pWnd); } else // No, we're drawing a { // Are we drawing a line? if (pWnd->m_iShape == 0) DrawLine(&dc, pWnd->m_iColor); else // We're pWnd->m_iShape); } } // Do not call CDialog::OnPaint() for painting messages }
  • 21. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 21  нь . Өөрөөр д хэсэг нь ил гарч ирсэн зэрэг тохиолдолд ialog цонхыг үндсэн цонхноос дуудахын тулд logsDlg 14.9. Show P ture id CD нээр цонхоо on нь дээр OnRtpen функцийн нэрийг OnRSelection болгон солино. Ингэж йг хийж функцийг тодорхойлж өгнө cation handler code here p төрлий агчийг нэм. 14.13. tification handler code here Files 14.7. Дээрх ОnPaint функц нь WM_PAINT message-н функц бөгөөд энэ тухайн цонх дахин зурагдах шаардлагатай үед дуудагддаг хэлбэл тухайн цонхны хэмжээг өөрчилсөн, идэвхтэй болсон, зөөсөн, дал дуудагдана. Программын аргаар дуудахдаа Invalidate() функцийг ашиглана. 14.8. Шинээр үүссэн Paint D CPaintDlg төрлийн m_dlgPaint нэртэй хувьсагчийг CDia класст тодорхойлно. i Dialog товчийг дарахад хийгдэх үйлдэл lg() c vo ialogsDlg::OnBshwpicd { // TODO: Add your control notification handler code here if (!m_bPaintVis) { m_dlgPaint.Create(IDD_PAINT_DIALOG, this);//цонх ши үүсгэх m_dlgPaint.ShowWindow(SW_SHOW);// үүсгэсэн дэлгэцэнд харуулах bPaintVis=true;m_ m_strShowPic="Hide Picture Dialog" UpdateData(false); } else { ;m_dlgPaint.DestroyWindow() _bPaintVis=false;m m_strShowPic="Show Picture Dialog" UpdateData(false); } GetDlgItem(IDC_GBTOOL)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_GBSHAPE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_GBCOLOR)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RTPEN)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RTBRUSH)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RTBITMAP)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RSCIRCLE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RSSQUARE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RSLINE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCBLACK)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCBLUE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCRED)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCGREEN)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCCYAN)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCYELLOW)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCWHITE)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_RCMAGENTA)->EnableWindow(m_bPaintVis); GetDlgItem(IDC_BOPENBMP)->EnableWindow(m_bPaintVis); } 14.10. Drawing Tool, Drawing Shape, Color дэхь сонголтууд өөрчлөгдөхөд Paint цонхон дахь зураг өөрчлөгдөх өөрөөр хэлбэл Paint цонхыг дахин сэргээх шаардлагатай. Бүх Radio Butt адил үйлдэл хийх учир нэг функцийг зааж өгнө. Үүний тулд шинээр функц нэмье. (CDialogsDlg класст (void OnRSelection)) 14.11. Харин Radio Button-доо энэ функцийг хэрхэн зааж өгөх вэ? Үүний тулд жишээ нь: Pen Radio Button дээр 2 товшиход гарч ирэх цонхон бүх Radio Button дээр үйлдли void CDialogsDlg::OnRSelection() { // TODO: Add your control notifi UpdateData(TRUE); m_dlgPaint.Invalidate(); }. 14.12. Choose Bitmap File товчийг дарахад зургын файлыг олж, зургыг нь хувьсагчид авч Paint цонхонд дамжуулах үйлдэл хийгдэнэ. Иймээс CDialogsDlg класст зураг дамжуулах CBitma н m_bmpBitmap нэртэй хувьс Choose Bitmap File товчийг дарахад хийгдэх үйлдэл. void CDialogsDlg::OnBopenbmp() { // TODO: Add your control no static char BASED_CODE szFilter[] = "Bitmap (*.bmp)|*.bmp||"; // Create the File Open dialog
  • 22. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 22  , m_sBitmap, ITEPROMPT, szFilter); the result ceHandle(), BSECTION); loaded image? detach it p to the bitmap object tmap); хын тулд PaintDlg.cpp logsDlg.h файлын Paint цонхыг Close товчоор нь хаахад үндсэн цонхонд Hide Paint Dialog овчийг дарсантай адил үйлдлийг хийх функцийг нэм.   CFileDialog m_ldFile(TRUE, ".bmp" OFN_HIDEREADONLY | OFN_OVERWR // Show the File Open dialog and capture if (m_ldFile.DoModal() == IDOK) { // Get the filename selected m_sBitmap = m_ldFile.GetPathName(); // Load the selected bitmap file HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstan IMAGE_BITMAP, 0, 0,m_sBitmap, LR_LOADFROMFILE | LR_CREATEDI // Do we have a valid handle for the if (hBitmap) { p// Delete the current bitma if (m_bmpBitmap.DeleteObject()) // If there was a bitmap, m_bmpBitmap.Detach(); // Attach the currently loaded bitma m_bmpBitmap.Attach(hBi } // Invalidate the second dialog window m_dlgPaint.Invalidate(); } } 14.14. Ингэж Paint цонхонд утга дамжуула файлын header файл зарлалтын хэсэгт Dia зарлалтыг нэмэх хэрэгтэй. 15. Программаа хөрвүүлж ажиллуулан үр дүнг шалга. Даалгавар: т                                                      
  • 23. Визу Боло   зөвхө үүсд Клас CEdi CFor CHtm CLis CRic CScr CTre Өнөө SDI уал програ овсруулсан SDI прог өн нэг барим SDI про дэг. About 1. CWin хэрэ CVie 2. CFra энэ зохи 3. CDoc бари боло ба ү 4. CVie обье клас сс itView rmView. mlView stView chEditView rollView eeView өдрийн лаб программ 1. Шинэ 2. AppW тодо 3. 3 да гэсэ 4. 4 да 5. Гарч өргө 6. Next амчлал СИ н багш: Т. Сэдэв рамм гэдэг мт боловсру ограмм үүс t цонхны к nApp –с уд эглэгдэх б ew обьекту ameView -с нь тухайн ион байгуу cument –с имтын обье овсруулах үүнээс дэл ew–с удамш ект. Энэ к ссаас удам Тайлбар EditBox боловср Харагда хэлбэри Web bro мэдээлэ List ко w Тэмдэгт боловср CView к Мод хэл бораториор үүсгэх: ээр Lab4 н Wizard эхн орхойл. ахь алхамы эн тэмдэгл ахь алхмыг ч ирэх цон өтгөлийг з t товчийг И++ хичээл .Уламбаяр в: Single нь баримт б уулдаг. Жиш сгэхэд диа классыг эс дамшсан кл бусад обье уудын mess с удамшсан н цонхон д улах үүрэг удамшсан ект. Үүнд ба энэ кл лгэцэнд га шсан класс класс нь д мшиж болно р x контрол руулахад а ах байдлын ийн мэдээл owser –н ү эл боловср онтрол дах т болон хэ руулахад х класст scr лбэрийн мэ р бид SDI нэртэй про ний алхамд ыг байгааг лэгээг ари г хэвээр н нхон дээрэ зааж өгнө. даран дар лийн лекц р Lecture e Document боловсруула шээ нь Notep алог прогр с тооцвол ласс. Энэ ектыг тодо sage-уудыг н класс нь дахь обьек гтэй. класс нь баримтанд ласст бари аргах мэдэ с нь барим дэлгэцэнд о. Жнь: дахь үйлд ашиглагдда н обьект н лэл боловс үйлдлүүдий руулахад х хь үйдлийг элбэржүүлс хэрэглэгдэ roll хийх эдээлэл бо хэлбэрийн ожект үүсг д программ гаар нь өн илга нь үлдээгэ ээс програ .(lb4) Clo раагийн ал ийн хураа №7-8 t Applicat ах программ pad, Paint, So рамм үүсгэ дараах кл класс нь орхойлж өг г илгээх д ь программ ктуудыг (t тухайн пр д шаардлаг имтад оруу ээллийг CV мтын дэлгэ харагдах длийг хийд аг. нь контрол сруулахад йг хийдэг. хэрэглэдэг г хийдэг. сэн текст энэ. шинж чана оловсруула н, зураг з гэ. мын төрлий нгөрөөгөөд ээд Advanc аммын боло ose товчий лхамд шилж ангуй tion үүсгэ мын ерэнхий olitaire гэх м эснээс хам лассууд үү тухайн пр гөх үүрэгт дамжуулах мын цонхны toolbar, s рограммын гатай өгөг улах мэдээ View руу и эцэнд хара байдлын х дэг. Ердий луудыг агу хэрэглэгд .Үүнийг UR г. хэлбэрийн арыг нэмж ахад ашигл зурдаг про йн Single д 4 дэхь а ced товчий овсруулах йг даран ц ж. эх й хэлбэр бөг мэт. маагүй оло үснэ. рограммд тэй ба CFr үүрэгтэй. ы обьект б scrollbar, боловсруу гдлийн төр элэл CView илгээгддэг агдах байд хэд хэдэн йн текст м уулж болно дэнэ. RL, Html х н мэдээлэл өгнө. лагдана. ограммыг б Document алхмын Act йг ба дар римтын цонхоо хаа Page 23 өөд тухайн он класс rameView, . бөгөөд ,menu,…) улах рлийг w-с ирэх г. длын төрлийн мэдээлэл о. Form хэлбэрийн л бичнэ. гэж tiveX а. 3 
  • 24. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 24  ыг . 1. Үүнийг ->m_ptFrom гэж өгөөд Ok CLine)- бичээд Ok товчийг дар. 7. Нэм n om, CPoint ptTo) { ; . Үүний тулд кц нэм. 2. Нэм длийг нэм. d CL C) { г 7. 5 дахь алхам дахь утгуудыг хэвээр үлдээ. 8. 6 дахь алхамд баримтын харагдах байдлын обьекитын удамших класс CView гэж хэвээр нь үлдээгээд Finish товчийг дарвал AppWizard программыг үүсгэнэ. Line класс үүсгэх. Энэ программд зураг зурах үйлдэл хийх учир зурагдах дүрс болгонд обьектыг үүсгэх хэрэгтэй. Жишээ нь шулуун зурах класс үүсгэе. Ингэж класс үүсгэснээр шулууны шинж чанаруудыг тодорхойлох боломжтой болно Class View-> (right click on Lab4 Classes)->New Class 2. Дээрхи байдлаар утгуудыг тодорхойл. 3. OK товчийг дарахад CLine класс шинээр үүснэ. CLine классын гишүүн өгөгдөл, гишүүн функц, байгуулагч болон устгагч функцүүдийг тодорхойлох. CLine кл1. асс 2 гишүүн өгөгдөлтэй. (эхлэх цэг, төгсөх цэг) нэмнэ. 2. Class View->(right click on CLine)->Add Member Variable Variable type-3. > CPoint, variable name товчийг дар. 4. Дээрх байдлаар m_ptTo өгөгдлийг нэм. Байгуулагч функц нэмэхийн тулд Class5. View->(right click on >Add Member Function командыг сонго Function type –г хоосон үлдээгээд function declaration –д6. CLine(CPoint ptFrom, CPoint ptTo) гэж сэ CLi н функцдээ дараах үйлдлийг хий. e::CLine(CPoint ptFr m_ptFrom = ptFrom m_ptTo = ptTo; } Зөв обьект хандалтат программд обьект нь өөрөө үйлдлээ хийдэг байх хэрэгтэй. Иймээс CLine класс нь шулуунаа зурдаг байх хэрэгтэй шулуун зурдаг функцыг нэмж өгнө. 1. void төрлийн Draw(CDC *pDc) нэртэй фун сэ voi н функцдээ дараах үйл ine::Draw(CDC * pD // Draw the line pDC->MoveTo(m_ptFrom); pDC->LineTo(m_ptTo); } Дээрхи нэмсэн классаа баримт боловсруулах CDocument класстайгаа холбож өгөх хэрэгтэй. Өөрөөр хэлбэл шинээр зурагдсан шулууныг баримтад хадгалах хэрэгтэй. Үүний тулд хадгалах динамик массивыг тодорхойлох шаардлагатай. Массив нь CobArray төрлийн хувьсагч байх шаардлагатай. MFC-д CStringArray, CByteArray, CWordArray, CDWordArray,CPtrArray гэсэн массив төрлүүд байда
  • 25. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 25  атай үйлдэл бол шулуун нэмэх үйлдэл юм. Доорхий функцыг CL CLine * CLab4Doc::AddLine(CPoint ptFrom, CPoint ptTo) { eate a new CLine object ne * try { ct array ; he x("Out of memory", MB_ICONSTOP | MB_OK); Did ne object? if (pLi { e exception object (); Дараагийн зайлшгүй йт хэдэн шулуун зурагдсаныг тоолох. int CLa эцэст нь зай өн дугаарын шулууны обьектыг тодорхойлох. CLine * { ct жтайгаар гүйцэтгэнэ. Үүний тулд хулганы товч дарагдахад UTTONDOWN, WM_LBUTTONUP, ба WM_MOUSEMOVE 3. Дээ 4. Нэмэгдсэн message handler code here and/or call default id CL or call default s) can ReleaseCapture(); бөгөөд тус бүр өөр өөрийн тодорхой төрлүүдийн хадгалдаг. Харин CobArray төрөл нь ямарч төрлийн хувьсагчдыг хадгалах чадвартай байдаг. CLab4Doc клөасст CobArray төрлийн m_oaLines нэртэй хувьсагч нэм. Документ класст хийгдэх анхны шаардлаг ab4Doc класст нэм. // CLi Cr pLine = new CLine(ptFrom, ptTo); // Add the new line m_oaLines.Add(pLine) to the obje // Mark the document as dirty SetModifiedFlag(); } // Did we run into a memory exception? ryException* perr)catch (CMemo { , giving him or her t// Display a message for the user // bad news xMessageBoAf // we create a li ne) // Delete it delete pLine; LL;pLine = NU } // Delete th perr->Delete } return pLine; } хийгдэх үйлдэл бол ни b4Doc::GetLineCount() { // Return the array count return m_oaLines.GetSize(); } лшгүй хийгдэх үйлдэл бол өгөгдс CLab4Doc::GetLine(int nIndex) // Return a pointer to the line obje // at the specified point in the object array return (CLine*)m_oaLines[nIndex]; } Дараагийн шаардлага бол хэрэглэгч хулганы заагчийн тусламжтайгаар шулуун зурдаг байх. Өөрөөр хэлбэл хулганы зүүн товчийг дараад хулганы заагчийг гүйлгэхэд заагчийн гйүсний дагуу шулуун зурагддаг байх явдал юм. Үүнийг CView классын туслам илгээгддэг message-үүд болох WM_LB –үүдийг ашиглана. 1. Class Wizard цонхыг нээ 2. CLab4View классыг сонго рхи 3 message тус бүрд функц нэм. функцүүдэд дараах үйлдлийг хий. n(UINT nFlags, CPoint point)void CLab4View::OnLButtonDow { // TODO: Add your SetCapture(); // Save the point m_ptPrevPos = point; CView::OnLButtonDown(nFlags, point); } , CPoint point)vo ab4View::OnLButtonUp(UINT nFlags { // TODO: Add your message handler code here and/ aptured the mouse?// Have we c if (GetCapture() == thi // If so, release it so other applications // have it
  • 26. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 26  tton is down TTON) ocument()->AddLine(m_ptPrevPos, point); ious point ж ин зурах шаардл ардлагатай гэсэн утга WM_PAINT message-р ирснээр ункцийг нэмж өгөх хэрэгтэй. ument lines in the document? s++) o point for each line ine(liPos); // Draw the line рлах шаардлагатай. ab4View.cpp файлуудад Line.h файлыг зарлах хэрэгтэй. удын Харин DeleteContents функцэд цэвэ . Ийм функц байхгүй байвал ClassWizard- нэмэ CView::OnLButtonUp(nFlags, point); } void CLab4View::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default // Check to see if the left mouse bu _LBUif ((nFlags & MK_LBUTTON) == MK { // Have we captured the mouse? if (GetCapture() == this) { // Get the Device Context CClientDC dc(this); // Add the line to the document CLine *pLine = GetD // Draw the current stretch of line pLine->Draw(&dc); // Save the current point as the prev m_ptPrevPos = point; } } CView::OnMouseMove(nFlags, point); } Дээр дуудагдсан SetCapture функц нь хулганы товч дарагдахад хийгдэх ба энэ нь хулганы заагчийг зөвхөн өөрийн программд ажиллах боломжтой болгодог. Шалтгаан нь жишээ нь хулганы заагчийг чирж байгаад зураг зурах цонхноос хэтрээд гарч яваад буцаж орж ирэх тохиолдолд шулуун зурсан хэвээр байна гэ зааж өгч байна. Өөрөөр хэлбэл бусад программд хулганы талаархи message- үүдийг илгээхгүй болгож байна. Харин ReleaseCapture функц нь үүний эсрэг юм. Хулганыг зөөж байх агшинд баримтад шулуун нэмж байна. View класс дахь шаардлагатай үйлдэл бол CView обьект дахин сэргээгдэх (зурагдах) ш лд баримт дахь шулуун болгоныг дахаардлагатай болсон тохиолдо атай. Дахин сэргээгдэх шааг мэдэгддэг. Иймээс доорхи ф void CLab4View::OnDraw(CDC* pDC) { CLab4Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here // Get the number of lines in the doc pDoc->GetLineCount();int liCount = // Are there any if (liCount) { int liPos; CLine *lptLine; // Loop through the lines in the document for (liPos = 0; liPos < liCount; liPo { // Get the from and t lptLine = pDoc->GetL lptLine->Draw(pDC); } } } аас өмнө CLine классынПрограммаа хөрвүүлж ажиллагааг нь шалгах одорхойлолтыг шаардлагатай обьектуудад зат Lab4Doc.cpp ба L Программаа хөрвүүлж ажиллагааг нь шалга. Шинээр баримт үүсгэх. Программын документ класст байгаа OnNewDocument функц нь дэлгэцэнд байгаа зургийг устгахгүй харин New командыг (цэсний) сонгоход бусад классу эхний утгууд үдийг хийдэг.ыг тодорхойлох зэрэг үйлдлү эх үйлдлийг хийх хэрэгтэйрл р х боломжтой. Дараах үйлдлийг хий. void CLab4Doc::DeleteContents()
  • 27. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 27  Add your specialized code here and/or call the base class leting each object liCount; liPos++) х элемент (шул чид хадгалж байгаа учир зөвхөн энэ хувьсагч цийг дуудахад хангалттай. ж байгаа рөөр хэлбэл CLine классын Serialize фу e класст дээрх функцийг тодорхойлох rchive &ar) } Программаа хөрвүүлж ажиллагааг гарна. дарт функц бөгөөд энэ нь DECLARE_SERIAL, IMPLEM дорхойлолтуудыг зарласнаар алдаагүй ажиллана AL (CLine) Харин Line.c ntation of the CLine class. /////////////////////////////////////////////////// fx.h" { // TODO: // Get the number of lines in the object array int liCount = m_oaLines.GetSize(); int liPos; // Are there any objects in the array? if (liCount) { ay, de// Loop through the arr for (liPos = 0; liPos < delete m_oaLines[liPos]; // Reset the array m_oaLines.RemoveAll(); } eleteContents();CDocument::D } Дээрх функц нь шинээр баримт нээхэд гарч болох алдаануудыг багасгана. Баримтаа хадгалах ба нээх. AppWizard нь хэдийгээр Save, Open, Save as цэснүүдийгүүсгэдэг боловч хийгдэх үйлдлийг нь өөрсдөө хийх шаардлагатай. Эдгээр үйлдлүүдийг Serialize гэж нэрлэдэг бөгөөд файлд хадгалах, файлаас унших үйлдлийг CLab4Doc классын Serialize хэ хувьд баримтын бүмээх функцэд хийж өгнө. Бидний программын н) нь m_aoLines хэмээх хувьсагуу ийн файлд хадгалах стандарт функ void CLab4Doc::Serialize(CArchive& ar) { m_oaLines.Serialize(ar); } Харин m_aoLines хувьсагчийн Serialize функц нь дотор нь хадгалагда хувьсагчдын Serialize функцыг дууддаг. Өө цыг дуудна. Иймээс бид CLinнк шаардлагатай. void CLine::Serialize(CA { CObject::Serialize(ar); if (ar.IsStoring()) ar << m_ptFrom << m_ptTo; else ar >> m_ptFrom >> m_ptTo; шалгахад дараах алдаа Учир нь Serialize гэдэг нь стан _SERIAL гэсэн макро тоENT . Ий class CLin мээс Line.h файлд e : public CObject { DECLARE_SERI public: e(CPoint ptFrom, CPoint ptTo);CLin pp файлд // Line.cpp: impleme // /////////////////// #include "stda #include "Lab4.h" #include "Line.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
  • 28. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 28  /////////////////////////////////////////////////////// Destruction /////////////////////////////////////////////////////////////////// лагатай. Одоо программаа хөрвүүлж ажиллагааг ber Varialble тодорхойлон Ok 3. CLi кцийг өөрчил. int ptTo, COLORREF crColor) 4. Мөн функцүүд өөрчлөгдөнө. e drawing object >SelectObject(&lpen); pDC->LineTo(m_ptTo); л UINT m_nColor, static const COLORREF m_crColors[8] 2. M_crColor файлд тодорхойл. = { ta /////////////////////////////////////////// 3. Мөн доошл функцүүдэд өөрчлөлт хийгдээд IMPLEMENT_SERIAL (CLine, CObject, 1) /////////////// // Construction/ /// CLine::CLine() { } гэж тус тус өөрчлөлт хийх шаард нь шалгахад алдаа гарахгүй ба зурсан зургаа хадгалдаг, хадгалсан зургаа нээдэг болсон байна. Цэстэй ажиллах, өнгө оруулах. Одоо программаа хэрэглэгчийн сонгосон өнгөөр зурдаг болгон үйлдэл нэмье. Үүний тулд CLine класстаа шинээр өнгө тодорхойлсон хувьсагч нэмнэ. 1. Class View->(right click on Cline)->Add Mem 2. Variable type->COLORREF, Variable name->m_crColor гэж вчийг дар.то ne классын байгуулагч фун CPoCLine::CLine(CPoint ptFrom, { m_ptFrom=ptFrom; m_ptTo=ptTo; m_crColor=crColor; } Draw, Serialize void CLine::Draw(CDC *pDC) { // Create a pen D, 1, m_crColor);CPen lpen (PS_SOLI // Set the new pen as th C-CPen* pOldPen = pD // Draw the line pDC->MoveTo(m_ptFrom); // Reset the previous pen pDC->SelectObject(pOldPen); } rchive &ar)void CLine::Serialize(CA { CObject::Serialize(ar); if (ar.IsStoring()) ar << m_ptFrom << m_ptTo<<(DWORD) m_crColor; else ar >> m_ptFrom >> m_ptTo>> (DWORD) m_crColor; } Ингэж CLine класст үйлдэл нэмэхээс гадна документ класст мөн үйлдэ нэмэх хэрэгтэй. Учир нь хэрэглэгч өнгийг тодорхойлохдоо цэсийг ашиглана. Иймээс цэс, тухайн үеийн өнгийг хадгалах хувьсагч, мөн өнгөнүүдийн тогтмол утгыг хадгалах массив хэлбэрийн хувьсагч шаардлагатай болно. Эдгээрийг нэмэхийн тулд 1. Class Vie асст дараах 2 хувьсагчийг нэм.w-v CLab4Doc кл s хувьсагчийн утгуудыг Lab4Doc.cpp END_MESSAGE_MAP() const COLORREF CLab4Doc::m_crColor[8] RGB( 0, 0, 0), // Black RGB( 0, 0, 255), // Blue RGB( 0, 255, 0), // Green RGB( 0, 255, 255), // Cyan RGB( 255, 0, 0), // Red RGB( 255, 0, 255), // Magen RGB( 255, 255, 0), // Yellow RGB( 255, 255, 255) // White }; ///////////////////// ///////////// // CLab4Doc construction/destruction CLab4Doc::CLab4Doc() { д OnNewDocumet, AddLineоо доорхи байдалтай болно.
  • 29. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 29  lor[m_nColor]); to the object array the t of memory", MB_ICONSTOP | MB_OK); line object? he exception object 4. CLa ийг Ca болгон өөрчил. цэс цэсийг нэм.(дарааллаар нь) BOOL CLab4Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; alization code here// TODO: add reiniti // (SDI documents will reuse this document) m_nColor=ID_COLOR_BLACK-ID_COLOR_BLACK; return TRUE; } CLine * CLab4Doc::AddLine(CPoint ptFrom, CPoint ptTo) { // Create a new CLine object CLine *pLine = new CLine(ptFrom, ptTo, m_crCo try { // Add the new line m_oaLines.Add(pLine); // Mark the document as dirty SetModifiedFlag(); } // Did we run into a memory exception? catch (CMemoryException* perr) { , giving him or her// Display a message for the user // bad news AfxMessageBox("Ou // Did we create a if (pLine) { // Delete it delete pLine; pLine = NULL; } // Delete t perr->Delete(); } return pLine; } b4Doc класст доорхи функцийг нэм. UINT CLab4Doc::GetColor() { return ID_COLOR_BLACK+m_nColor; } Дээрхи ID_COLOR_BLACK хувьсагч нь шинээр нэмэх цэсний нэр юм. 5. Хэрэглэгч өнгөө тодорхойлох цэс болон түүн дээр хийгдэх үйлдлүүдийг нэмье. 1. Resource View->Menu(Double Click)->IDR_MAINFRAME(Double Click) 2. Гарч ирэх цэсний зохион байгуулалт дээрхи хоосон цэс View ард байрлуул.зөөн . Түүний цэсний 3 ption-г &Color раах дэд4. Color Property энд да SettinObjec t g Menu Entry ID ID_COLOR_BLACK Caption &Black Menu Entry ID ID_COLOR_BLACK Caption B&lue Menu Entry ID ID_COLOR_BLACK Caption &Green Menu Entry ID ID_COLOR_BLACK Caption &Cyan Menu Entry ID ID_COLOR_BLACK Caption &Red Menu Entry ID ID_COLOR_BLACK Caption &Magenta Menu Entry ID ID_COLOR_BLACK Caption &Yellow Menu Entry ID ID_COLOR_BLACK Caption &White 5. Class Wizard цонхыг нээ. CLab4Doc классыг сонго.
  • 30. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 30  6. Нэмэгд UPDATE_COMMAND_UI event- үүд дээр фун 7. Нэмэгдсэн фу d CL d CL nd update UI handler code here or() == ID_COLOR_BLACK ? 1 : 0); d CL ; гэх мэтчилэн 8. ний гө сонгогдсон . Энэ функц нь хөрвүүлж ажиллагааг нь шалга. Даалга ммд шулууны өргөн, нарийнийг лж байгаа шиг г болго. өргөнийг тодорхойлох тогтмол утгууд ry th Settin сэн цэснүүдийн COMMAND ба кц нэм. нкцүүдэд хийгдэх үйлдэл. ab4Doc::OnColorBlack()voi { // TODO: Add your command handler code here m_nColor = ID_COLOR_BLACK - ID_COLOR_BLACK; } ab4Doc::OnUpdateColorBlack(CCmdUI* pCmdUI)voi { // TODO: Add your comma pCmdUI->SetCheck(GetCol } id CLab4Doc::OnColorBlue()vo { // TODO: Add your command handler code here m_nColor=ID_COLOR_BLUE-ID_COLOR_BLACK; } ab4Doc::OnUpdateColorBlue(CCmdUI* pCmdUI)voi { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(GetColor() == ID_COLOR_BLUE ? 1 : 0) } бүх өнгөний цэсний функцүүдэд нэм. Command функц нь тухайн цэсний өнгийг тодорхойлж өгөх үүрэгтэй. Үүнд хийгдэж байгаа m_nColor=ID_COLOR_BLUE-ID_COLOR_BLACK; үйлдэл нь m_nColor хувьсагчид тухайн сонгогдсон өнгө m_crColors массив дахь индексийг олгож байна. Харин UPDATE_COMMAND_UI функцэд тухайн өн цэсийг тэмдэглэх үйлдлийг хийж байна ихэвчлэн цэсийг тэмдэглэх, идэвхтэй болгох, идэвхгүй болгох зэрэг үйлдэл хийхэд ашиглагддаг. Программаа вар: Програ өнгө тодорхой тодорхойлдо Шулууны Menu Ent Wid g Very Thin 1 Thin 8 Medium 16 Thick 24 Very Thick 32                                
  • 31. Визу Бол уал програ о MDI ерэн Өөрө цонх (chi Ийм CMai шинж чана Өнөө зохи хэлб ялга Шинэ Прог тодо Stat болг Дэд Прог прог mess бид овсруулсан Сэдэв: программ нхий хэлбэ өөр хэлбэл хтой байна ild) цонх программы inFrame –с ж чанарыг арыг тодор өдөр бид ө ион байгуу бэрийн про аатай. ээр MDI пр 1. Шинэ Docu 2. 4-р 3. Мөн тодо 4. Прог граммдаа н орхойлдог, tusBar дээ гоно. Үүни цэс нэмэх граммд бол граммын цо sage илгээ дэд цэс г 1. Reso 2. Шинэ 3. Нэмэ амчлал СИИ++ хичээл н багш: Т. MDI прогр гэдэг нь эр бөгөөд л нэг ерөн а. Ерөнхий гэж нэрлэ ыг AppWiza с удамшдаг агуулсан рхойлох кл өмнөх лабо улна. AppW ограмм үүс рограмм үү э AppWizar ument-г со лаборатор өмнөх лаб орхойлдог граммаа хө нэмээд бид мөн tool эр одоогий ий тулд да х. лон програ онхон дээр эгддэг. Эн гаргахын т ource View ээр нэмэгд эгдсэн цэс .Уламбаяр Le рамм үүсгэ SDI прогр тухайн хэ нхий цонхт й цонхыг э эдэг. ard-р үүсг г классын класс мөн ласс тус т оратори дэ Wizard-р M сгэхтэй ад үсгэх rd прожект онго. ри шиг про бораторийн шулуун зу өрвүүлж аж д PopupMen lbar-н тус йн идэвхтэ араах алхм аммын цонх р хулганы нэ message тулд эхлээ w->(right дсэн цэсни сний зохио лийн лекцийн хураа р ecture эх, програ раммтай ад эд хэдэн б той ба хар эцэг цонх гэхэд SDI оронд CMD н CMDIChil тус үүсдэг ээрхи шиг MDI програ дил ба зөв т (Lab5) ү ограммаа ү н ажлын да урдаг, фай жиллагааг nu-н тусла сламжтайга эй байгаа муудыг гүй хон дээр д баруун то e нь WM_CO эд дэд цэс click on ий ID-г ID он байгуул ангуй №9-10 аммд toolb дил баримт баримтыг з рин баримт гэх ба ба шиг олон DIMainWnd- ldWnd –с у г. үйлдэл хи амм үүсгэх вхөн эхний үүсгээд эх үүсгэ. арааллаар йлд хадгал нь шалга. амжтайгаар аар өнгө, өнгө боло йцэтгэнэ. дэд цэс га овч дарагд ONTEXTMENU сээ лдэбэ н Menu)-> I DR_CONTEXT лалт bar, statu т боловсру зэрэг бол т болгон н аримтын цо класс үүс -с удамшса удамшсан х ийдэг MDI х алхмууд й алхам да хний алхам өнгө, өрг лдаг, файл . р өнгө, өр өргөнийг он, өргөни аргах өөрө длаа гэдги U юм. Энэ нэ. Үүний Insert Men TMENU болг usbar ашиг уулах прог ловсруулда нь тус тус онхыг хүүх глах граммын аг. сдаа хэд сдэг. Хари ан эцэг цо хүүхэд цон applicati ин онхны нь үндсэн нхны шинж ion ахь сонгол ндээ SDI лтоороо мд Multiplle гөнийг лаас уншда ргөнийг аг болго. тодорхойл ийг хардаг өөр хэлбэл лдог, ийг илтгэс г л мэдээллий тулд: сэн йг ирэхэд nu гон өөрчилл. Page 311 
  • 32. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 32  olor, элтэй адил байна. лно. 6. Class Wizard->CLab5View->WM_CONTEXTMENU(add function) 7. Нэмэгдс :OnContextMenu(CWnd* pWnd, CPoint point) handler code here pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | үлж ажиллагааг нь шалга. лдэл нэмэх. гүйцэтгэх дээр айн товчин дээрх зургийг гарч ирэх зургийн 2.2. гарган өнгийн товчны Member 3.1.2. tected) 3.2. л STRUCT lpCreateStruct) 4. Энэ цэсний командуудын хийгдэх үйлдэл нь үндсэн цэсний C Width цэсний коамндуудын хийх үйлд 5. WM_CONTEXTMENU мэдээлэл ирэхэд хийх үйлдлийг тодорхой эн функцэд хийгдэх үйлдэл void CDay11View: { // TODO: Add your message CMenu menu; // Load the context menu menu.LoadMenu(IDR_CONTEXTMENU); // Get the first sub menu (the real menu) 0);CMenu *pContextMenu = menu.GetSubMenu( // Display the context menu for the user TPM_LEFTBUTTON | TPM_RIGHTBUTTON, d());point.x, point.y, AfxGetMainWn } 8. Программаа хөрвү ToolBar болон StatusBar ашиглах үй Программын цонхонд (эцэг) Toolbar нэмэхийн тулд дараах алхмуудыг шаардлагатай. 1. Шинээр ToolBar үүсгэнэ. 1.1. Resource View->(right click on Toolbar)->Insert Toolbar 1.2. үүссэн ToolBar-н ID-г IDR_TBCOLOR болгон өөрчил. 2. Үүссэн ToolBar –н харагдах байдлыг өөрчилнө. 2.1. ToolBar-д зураг байхгүй хоосон товч байх ба товчин дарснаар тух хэрэгслийн самбар дээрх хэрэгслүүдийг ашиглан өөрчлөх боломжтой. Зургийг өөрчлөх агшинд ToolBar-д шинээр товч нэмэгдэнэ. Зургийг нь өөрчилсөн товчны Properties цонхыг (Alt+Enter) ID -г нь ID_COLOR_BLACK болгон сонго. (хар хувьд). 2.3. Үүссэн ToolBar-н харагдах байдал 2.4. Өнгөнүүдийн товчны ID-г тус бүрд нь өөрчилнө. 3. Программын цонхонд үүсгэсэн Toolbar-г хавсаргах программын кодыг нэмнэ. Үүнийг цонх үүсэх агшинд хийж өгнө. Цонх үүсэхэд дуудагддаг OnCreate функцфункц нь юм. . Цонхонд ToolBar үүсгэхэд ашиглах хувьсагчаа зарлана.3.1 3.1.1. Class view->(right click on CmainFrame)->Add Variable Type: CToolBar, Name: m_wndColorBar, (pro айдалтай болгон өөрчиOnCreate функцийг дараах б OnCreate(LPCREATEint CMainFrame:: { if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
  • 33. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 33  LYBY | _wndToolBar.LoadToolBar(IDR_MAINFRAME)) return -1; // fail to create T, WS_CHILD | CBRS_TOOLTIPS | OR)) // Loop through the buttons, setting them to act as radio uttons r.SetButtonStyle(i, TBBS_CHECKGROUP); the toolbar ANY); BRS_ALIGN_ANY); ; _wndToolBar); бар бий тодорхойл 5.1. ew ц . 5.2. үйлдэл ) != 0); 5.3. ааран цэсний тэмдэг гдсэ кцийг нэмнэ. UI handler code here etStyle() & WS_VISIBLE) != 0 ? 1 : 0); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_F CBRS_SIZE_DYNAMIC) || !m { TRACE0("Failed to create toolbarn"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || ators,!m_wndStatusBar.SetIndicators(indic sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status barn"); } int iTBCtlID; int i; // Create the Color Toolbar FLAif (!m_wndColorBar.CreateEx(this, TBSTYLE_ WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndColorBar.LoadToolBar(IDR_TBCOL { TRACE0("Failed to create toolbarn"); // fail to createreturn -1; } // Find the Black button on the toolbar iTBCtlID = m_wndColorBar.CommandToIndex(ID_COLOR_BLACK); if (iTBCtlID >= 0) { Ab for (i= iTBCtlID; i < (iTBCtlID + 8); i++) m_wndColorBa } // TODO: Delete these three lines if you don't want to // be dockable RS_ALIGN_m_wndToolBar.EnableDocking(CB m_wndColorBar.EnableDocking(C EnableDocking(CBRS_ALIGN_ANY) DockControlBar(&m // Dock the Color Toolbar DockControlBar(&m_wndColorBar); return 0; } снээр4. Ингэ таны программд өнгөний сонголттой хэрэгслийн сам болно. 5. Цэсэнд нэмэгдсэн хэрэгслийн самбарын харагдах, харагдахгүйг до i г үйлдэлтэй цэс нэмье. V эсэнд Colorbar нэртэй шинэ дэд цэс нэмнэ андыг сонгоход хийгдэхЭнэ нэмэгдсэн цэсийн ком void CMainFrame::OnViewColorbar() { // TODO: Add your command handler code here BOOL bVisible; // Check the state of the color toolbar tyle() & WS_VISIBLEbVisible = ((m_wndColorBar.GetS // Toggle the color bar ShowControlBar(&m_wndColorBar, !bVisible, FALSE); // Reshuffle the frame layout RecalcLayout(); } н ColorBar –н харагдах, харагдахгүйгээс хамМө эл н эсэхийг тодорхойлно. Үүний тулд дараах фун v d CMainFrame::OnUpdateViewColorbar(CCmdUI* pCmdUI)oi { // TODO: Add your command update pCmdUI->SetCheck((m_wndColorBar.G
  • 34. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 34  } д өгнө. Өөрөөр 7.4 а гэсэн мөрийг 2 удаа нэмнэ. IDR_TBCOLOR TOOLBAR DISCARDABLE 16, 15 BEGIN LOR_YELLOW LOR_WHITE 7.6. гарч ирнэ. команды д шинэ мөр нэмнэ. Дараах мө 6. Программаа хөрвүүлж ажиллагааг нь шалга. Хэрэгслийн самбарт comboBox нэмэх 7. Цэс хэлбэрээр хийсэн шулууны өргөнийг тодорхойлох үйлдлийг слийхэрэг н самбар дээр combobox контрол ашиглан хийе. Үүний тул дараах үйдлүүдийг хийнэ. 7.1. Visual C++ -н едитор ашиглан Toolbar-т Combobox нэмэх ломж бид үүнийг өөрсдөө хйижбо гүй байдаг. Иймээс хэлбэл программынхаа resource файлыг өөрчилнө. 7.2. Visual C++-с гар. 7.3. Notepad-г ажиллуулан Lab5.rc файлыг нээ.(өөрийн программын директор дотроос) Bar хэмээх toolbar-н бичлэг. Үүнд саяын нэмэгдсэн Color байга . Түүний ард Separator BUTTON ID_COLOR_BLACK BUTTON ID_COLOR_BLUE BUTTON ID_COLOR_GREEN BUTTON ID_COLOR_CYAN BUTTON ID_COLOR_RED OLOR_MAGENTABUTTON ID_C BUTTON ID_CO BUTTON ID_CO SEPARATOR SEPARATOR END 7.5. Үүний эхнийх нь обьектын хоорондох зураас, 2 дахь нь ямар нэгэн обьек тавих зай гэж ойлгодог. ComboBox-д сонгогдох мөрүүдийг String Table-д нэмнэ. (double click on String Table) дараах хэлбэрээр 7.7. Үүн дээр хулганы баруун товчийг товшиход гарч ирэх цэснээс Insert String г сонгоо рүүдийг нэм. ID Caption ID_WIDTH_VTHIN Very Thin ID_WIDTH_THIN Thin ID_WIDTH_MEDIUM Meduim ID_WIDTH_THICK Thick ID_WIDTH_VTHICK Very Thick 7.8. Одоо программын аргаар ComboBox-г нэмэх хэрэгтэй. Үүнийг үүсгэнэ. хийхийн тулд дараахалхмуудыг гүйцэтгэнэ. 7.8.1. Combobox-д ашиглах ID-г үүсгэнэ. лдэнэ.7.8.2. ComboBox2-г toolbar дээр үүсгэх зайг бэ 8.3.7. Combobox-г Toolbar-н хүүхэд цонх байдлаар 7.8.4. ComboBox-д сонгогдох мөрүүдийг нэмнэ.
  • 35. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 35  тусад нь функц үүсгэе. (BOOL 7.11. лдэл ar() iTBCtlID; Y | ) rBar.CommandToIndex(ID_COLOR_BLACK); Bar.SetButtonStyle(i, TBBS_CHECKGROUP); 9, IDC_CBWIDTH, TBBS_SEPARATOR,nWidth); ; nHeight; t, &m_wndColorBar, IDC_CBWIDTH); .AddString((LPCTSTR)szStyle); ource View->Right click on Lab4 Resources->Resource х хэсгийг тусад нь авсан учраас OnCreate функц нь (lpCreateStruct) == -1) D | )) ); turn -1; // fail to create 7.9. Дээрх үйлдлийг хийсэн программын кодыг нэмье. 7.10. Хялбарчилахын тулд CMainFrame::CreateColorBar()) Нэмэгдсэн функцэд хийгдэх үй BOOL CMainFrame::CreateColorB { int int i; if (!m_wndColorBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYB IZE_DYNAMIC) ||CBRS_S !m_wndColorBar.LoadToolBar(IDR_TBCOLOR) { TRACE0("Failed to create toolbarn"); return FALSE; // fail to create } BCtlID = m_wndColoiT if (iTBCtlID >= 0) { for (i= iTBCtlID; i < (iTBCtlID + 8); i++) m_wndColor } // Add the Combo int nWidth = 100; int nHeight = 125; // Configure the combo place holder m_wndColorBar.SetButtonInfo( // Get the colorbar height CRect rect; m_wndColorBar.GetItemRect(9, &rect) rect.bottom = rect.top + // Create the combo box m_ctlWidth.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rec // Fill the combo box CString szStyle; if (szStyle.LoadString(IDS_WIDTH_VTHIN)) m_ctlWidth.AddString((LPCTSTR)szStyle); if (szStyle.LoadString(IDS_WIDTH_THIN)) m_ctlWidth.AddString((LPCTSTR)szStyle); if (szStyle.LoadString(IDS_WIDTH_MEDIUM)) m_ctlWidth.AddString((LPCTSTR)szStyle); if (szStyle.LoadString(IDS_WIDTH_THICK)) m_ctlWidth.AddString((LPCTSTR)szStyle); if (szStyle.LoadString(IDS_WIDTH_VTHICK)) m_ctlWidth return TRUE; } 7.12. Үүнд ашиглагдаж байгаа IDC_CBWIDTH нь combobox-н ID юм. Үүнийг дараах байдлааг нэмнэ. 7.13. Res bolSym s 7.14. New-> Name: IDC_CBWIDTH 8. ColorBar үүсгэ өөрчлөгдөнө. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { FrameWnd::OnCreateif (CMDI return -1; f (!m_wi ndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHIL WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | C) ||CBRS_SIZE_DYNAMI !m_wndToolBar.LoadToolBar(IDR_MAINFRAME { RACE0("Failed to create toolbarn"T re
  • 36. Визуал програмчлал СИ++ хичээлийн лекцийн хураангуй Боловсруулсан багш: Т.Уламбаяр  Page 36  } _ANY); dth if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { n");TRACE0("Failed to create status bar l to createreturn -1; // fai } if (!CreateColorBar()) { barn");TRACE0("Failed to create color tool return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndColorBar.EnableDocking(CBRS_ALIGN EnableDocking(CBRS_ALIGN_ANY); ;DockControlBar(&m_wndToolBar) // Dock the Color Toolbar dColorBar);DockControlBar(&m_wn return 0; } ахад ComboBox нэмэгдсэн нь харагдана.9. Программа ажиллуул ComboB үox-н йлдлийг нэмэх. 10. ComboBox-н сонголт өөрчлөгдсөн хэмээх event нь ON_CBN_SELCHANGE эм хэд дуудагдах функцийг нэмнэ.х ээх утга байдаг. Энэ Event-г илрэ 11. дэлНэмэгдсэн функцэд хийгдэх үйл d CMavoi inFrame::OnSelChangeWidth() { // Get the new combo selection .GetCurSel();int nIndex = m_ctlWidth CB_ERR)if (nIndex == return; // Get the active document )GetActiveDocument();CToolbarDoc* pDoc = (CToolbarDoc* ve a valid document?// Do we ha if (pDoc) // Set the new drawing wi pDoc->SetWidth(nIndex); } 12. Харин нэмсэн функцээ Event-тэй холбохдоо CMainFrame классын messagemap-д дараах өөрчлөлтийг хийнэ. /////////////////////////////////////////////////////////////////////// ////// CMainFrame// IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_VIEW_COLORBAR, OnViewColorbar) ON_UPDATE_COMMAND_UI(ID_VIEW_COLORBAR, OnUpdateViewColorbar) //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_CBWIDTH, OnSelChangeWidth) END_MESSAGE_MAP() 13. Нэмэгдсэн функц дэх SetWidth функц нь баримтын шулууны өргөнийг өр .ө члөх функц юм. Иймээс дээрхи функцийг нэм 14. Программаа хөрвүүлж ажиллагааг шалга. Status Bar ашиглах 15. StatusBar нь индикаторууд хэмээх текст мэдээлэл илэрхийлэх хэсгүүдээс тогтдог. Программист мэдээллийн самбар дээр өөрийн мэдээллийн гаргах индикатор хэсгийн нэмэх боломжтой. Үүнийг роп граммд зарласан байдаг. 16. ям мье.Бид ар өнгө сонгогдсоныг илтгэдэг индикатор шинээр нэ 16.1. String Table-д индикаторын ID-г Caption-г өгнө. _IN(ID DICATOR_COLOR) 16.2. Индикаторуудын зарлалтанд нэмсэн индикаторыг нэмнэ.