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-н төрийн жагсаалтанд утгыг дараах байдлаар нэмнэ. Шинэ мөр нэмэхдээ
багш: Т.Уламбаяр
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);
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
}
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
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 классыг сонго.
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