Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Спільні елементи керування 2 страница






Програмне встановлення позиції стрілки та отримання поточного значення здійснюються функціями SetPos() та GetPos() відповідно:

 

int CSpinButtonCtrl:: SetPos(int nPos);

int CSpinButtonCtrl:: GetPos();

 

де nPos – значення, яке програмно встановлюється. SetPos() встановлює це значення, одночасно повертаючи попередній стан стрілки. GetPos() здійснює стандартний запит про стан елемента і повертає його попереднє значення.

За допомогою функції GetRange() можна отримати діапазон значень, встановлений для стрілки:

 

int CSpinButtonCtrl:: GetRange(int & lower, int& upper);

 

де на адреси lower та upper записуються межі діапазону стрілки.

Раніше у прикладі 5.3 описаний клас діалогового вікна, що містить стрілку. Його функція OnInitDialog() на разі визначається текстом, що наведений у прикладі 5.4.

 

Приклад 5.4 – Оголошення створення стрілки під час ініціалізації діалогового вікна програми

 

BOOL CSDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

GetClientRect(& r);

m_Spin.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | UDS_ALIGNRIGHT, r, this, IDC_SPIN1);

m_Spin.SetBuddy(GetDlgItem(IDC_EDIT2));

m_Spin.SetRange(-100, 100);

m_Spin.SetPos(-10);

return TRUE;

}

 

Обробка повідомлень стрілки є стандартною і відповідає повідомленню WM_VSCROLL. У наступних розділах наводитиметься приклад із використанням стрілки та обробкою зміни її значень у обробнику OnVScroll().

 

5.5 Робота з регуляторами

 

Регулятор або слайлер (slider) є одним з найбільш популярних серед елементів керування Microsoft Windows. Гадаю, з ним стикався будь-який користувач, що прослуховував музичні файли. Саме регулятор забезпечує збільшення або зменшення гучності звуку. Регулятор гучності зображений на рисунку 5.5.

 

Рисунок 5.5 – Вертикальний та горизонтальний регулятори

Регулятор оформлюється окремим вікном, у якому розміщується смуга прокрутки регулятора. Смуга прокрутки може позначатися спеціальними позначками по обидва її боки. Інші елементи зображення регулятора (текст, зображення) розміщуються додатково і не належать йому безпосередньо.

Регулятор належить до спільних елементів керування і описується класом CSliderCtrl.

Регулятор може розміщуватися у головному вікні програми або бути частиною оформлення діалогового вікна. В першому випадку для cтворення регулятора використовується функція CSliderCtrl:: Create(), яку необхідно забезпечити повним набором описів елемента регулювання. Для другого випадку достатнім буде у редакторі ресурсів Visual C++ розмістити графічне зображення регулятора у шаблоні ресурсів діалогового вікна. Далі: у функції OnInitDialog() відповідного класу діалогового вікна провести зв’язування об’єкта регулятора, оголошеного в цьому класі, та графічного ресурсу регулятора, поданого ідентифікатором.

Після створення регулятора у перший або другий спосіб, необхідно обробити його повідомлення. У залежності від того, яким – вертикальним чи горизонтальний є ваш регулятор, це робиться в обробниках OnVScroll() або OnHScroll().

Функція Create() класу CSliderCtrl має такий прототип:

 

BOOL CSliderCtrl:: Create(DWORD dwStyle, RECT& rect, CWnd* pParentWnd, UINT nID);

 

Параметрами в ній є: dwStyle – визначає стиль регулятора (дивись таблицю 5.7); rect – визначає розмір регулятора та його розташування; pParentWnd - покажчик на батьківське вікно; nID – власний ідентифікатор.

Зазвичай стиль містить стандартні значення WS_CHILD, WS_VISIBLE, WS_BORDER, що доповнюються додатковими, які вказано в таблиці.

 

Таблиця 5.7 – Визначення стилів регулятора

Значення константи Коментар
TBS_AUTOTICKS автоматичне розміщення позначок
TBS_HORZ горизонтальне розміщення регулятора
TBS_VERT вертикальне розміщення регулятора
TBS_NOTICKS відсутність позначок
TBS_BOTTOM розміщення позначок внизу горизонтального регулятора
TBS_TOP розміщення позначок вгорі горизонтального регулятора
TBS_LEFT розміщення позначок ліворуч у вертикальному регуляторі
TBS_RIGHT розміщення позначок праворуч у вертикальному регуляторі
TBS_ENABLESELRANGE підсвітка діапазону регулятора

 

Як зазначувалося у п.3.4.5, зі смугами прокрутки пов’язуються повідомлення WS_VSCROLL та WS_HSCROLL – для вертикальної та горизонтальної смуг, відповідно. Регулятор є іншим прикладом реалізації смуги прокрутки, йому відповідають ті самі повідомлення і стандартні обробники:

 

void CWnd:: OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void CWnd:: OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

 

Параметри регулятора можна визначити за допомогою додаткових функцій класу CSliderCtrl.

Для визначення та встановлення поточної позиції регулятора, як і у ви-падку стрілки, використовують функції GetPos() та SetPos():

 

int CSliderCtrl:: GetPos();

void CSliderCtrl:: SetPos(int nPos);

 

Функція GetPos() повертає поточну позицію регулятора, параметр nPos функції SetPos() вказує позицію, у яку має програмно встановитися регулятор.

За допомогою функції SetRange() можна змінити діапазон значень регулятора, що має стандартні межі 0-100:

 

void CSliderCtrl:: SetRange(int nMin, int nMax, BOOL bRedraw = FALSE);

 

де nMin – початковове значення діапазону регулятора, nMax – кінцеве значення діапазону. Параметр bRedraw означає ознаку оновлення регулятора. Якщо bRedraw рівний TRUE, то, одразу після зміни діапазону, зображення регулятора має бути оновлене. Значення FALSE не вимагатиме неодмінного оновлення.

Окрім встановлення діапазону значень, можна запитати регулятор про встановлений діапазон значень. Це забезпечує функція GetRange():

 

void CSliderCtrl:: GetRange(int& nMin, int& nMax);

 

де до змінних nMin та nMax записуватимуться мінімальне та максимальне значя діапазону регулятора.

 

5.6 Робота з індикаторами

Індикатор (або progress bar) є спеціальним елементом керування, який використовується для вказання ступіню виконання тривалої операції програми. Він складається з невеликого вікна (зображений на рисунку 5.6), що по мірі виконання операції заповнюється прямокутниками

 

Рисунок 5.6 – Індикатор (розташований у нижній частині вікна)

 

Як і регулятор, індикатор належить до спільних елементів керування і описується класом CProgressCtrl.

Для створення індикатора у головному вікні програми зазвичай використовується функція Create() класу CProgressCtrl:

BOOL CProgressCtrl:: Create(DWORD dwStyle, RECT& rect, CWnd* pParentWnd, UINT nID);

 

де dwStyle – визначає стиль індикатора, rect – визначає розмір індикатора та його положення, pParentWnd – вказує на вікно, що є його власником (не може бути NULL), nID – визначає ідентифікатор індикатора.

Положення індикатора можна програмно визначити. Також можна встановити нове значення елемента, встановити та отримати діапазон його значень. Все це забезпечують функції GetPos(), SetPos(), SetRange(), GetRange() класу CProgressCtrl:

 

int CProgressBar:: GetPos(); // повертає встановлене значення

void CProgressBar:: SetPos(int nPos); // встановлює значення nPos

void CProgressBar:: SetRange(short nLower, short nUpper);

void CProgressBar:: GetRange(int& nLower, int& nUpper);

 

У функціях SetRange() та GetRange() параметри nLower та nUpper означають нижню та верхню межі діапазону регулятора (стандартний діапазон обмежується інтервалом 0-100).

Зовнішній стан індикатора змінюється відповідно до кількості прямокутників, які його заповнюють, і вказують стан індикатора. Функція StepIt() забезпечує збільшення позиції регулятора на один крок:

 

int CProgressCtrl:: StepIt();

 

SetStep() збільшує поточну позицію на 10 одиниць і повертає попередній стан, але це значення може змінюватися за допомогою функції SetStep():

int CProgressCtrl:: SetStep(int nStep);

де nStep – нове значення кроку індикатора. Одночасно SetStep() повертає значення попереднього кроку переміщення індикатора.

 

5.7 Використання стрілок, регуляторів та індикаторів

5.7.1 Загальні умови використання елементів керування

Як вже зазначалося у попередніх главах, елементи керування можуть розміщуватися в головному або діалогових вікнах програми. Кожен з цих ви-падків має свої особливості.

При розміщенні елемента керування у головному вікні програми необхідно:

1) оголосити об’єкт керування у класі головного вікна;

2) у конструкторі головного вікна за допомогою функції Create() забезпечити визначення стилів, розмірів та координат елемента;

3) у необхідних обробниках забезпечити обробку повідомлень елемента.

У випадку діалогових вікон ситуація дещо спрощується. Редактор ресурсів дозволяє просто обрати необхідний елемент керування у панелі елементів та розташувати його у необхідному місці діалогового вікна. Таким чином для використання елементів керування у діалоговому вікні необхідно:

1) у редакторі ресурсів визначити положення, розміри та властивості елемента керування, зафіксувати його ідентифікатор;

2) оголосити об’єкт керування у класі діалогового вікна;

3) у функції ініціалізації діалогового вікна забезпечити зв’язок між об’єктом елемента керування та його графічним ресурсом, визначити початкові параметри елемента;

4) забезпечити обробку повідомлень елемента керування.

 

5.7.2 Приклади використання стрілок, регуляторів та індикаторів у головному вікні програми

Нехай у програмі необхідно визначити прості взаємопов’язані елементи: стрілку, регулятор та індикатор. Зміна стану стрілки змінюватиме положення регулятора і, навпаки, зміна положення регулятора змінюватиме стрілку. При цьому, індикатор лише показуватиме поточне значення регулятора та стрілки.

У програмі оголошуються класи прикладки та головного вікна. У клас головного вікна додані об’єкти спільних елементів керування: стрілки, регулятора та індикатора. Конструктор головного вікна забезпечує створення та ініціалізацію об’єктів керування. Обробник OnVScroll() забезпечує пов’язування дій елементів: зміна одного забезпечує зміну іншого. Повний текст програми наведений у прикладі 5.5.

 

Приклад 5.5 – Програма із використанням стрілки, регулятора та індикатора у головному вікні програми

 

// файл App.h

class CApp: public CWinApp

{public: BOOL InitInstance(); };

 

class CMain: public CFrameWnd

{public: void OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB);

CMain();

DECLARE_MESSAGE_MAP()

private: CSpinButtonCtrl mySpin;

CSliderCtrl mySlider;

CProgressCtrl myProgress;

CEdit BuddyEdit; };

 

// файл App.cpp

#include < afxwin.h>

#include < afxcmn.h>

#include " App.h"

CMain:: CMain()

{Create(NULL, " Приклад зі стрілкою, регулятором, індикатором");

InitCommonControls();

CRect r1(10, 10, 50, 125); // розташування вікна регулятора

mySlider.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|TBS_VERT|TBS_BOTH, r1, this, 1);

CRect r2(0, 0, 0, 0); // розмір стрілки визначатиметься приятельським вікном

mySpin.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|UDS_SETBUDDYINT|

UDS_ALIGNLEFT, r2, this, 2);

CRect r3(90, 10, 145, 40); // розташування приятельського вікна

BuddyEdit.Create(WS_CHILD|WS_VISIBLE|WS_BORDER, r3, this, 3);

mySpin.SetBuddy(GetDlgItem(3));

CRect r4(10, 135, 180, 155); // розташування індикатора

myProgress.Create(WS_CHILD|WS_VISIBLE|WS_BORDER, r4, this, 4);

}

BOOL CApp:: InitInstance()

{m_pMainWnd = new CMain;

m_pMainWnd-> ShowWindow(m_nCmdShow);

m_pMainWnd-> UpdateWindow();

return TRUE; }

 

void CMain:: OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB)

{ if(SB==(CScrollBar*)& mySpin)mySlider.SetPos(mySpin.GetPos());

if(SB==(CScrollBar*)& mySlider)mySpin.SetPos(mySlider.GetPos());

myProgress.SetPos(mySpin.GetPos());

}

BEGIN_MESSAGE_MAP(CMain, CFrameWnd)

ON_WM_VSCROLL()

END_MESSAGE_MAP()

CApp App;

 

На рисунку 5.7 наведено вигляд вікна наведеної вище програми.

 

Рисунок 5.7 – Вигляд програми із використанням стрілки, регулятора

та індикатора у головному вікні

 

5.7.3 Приклади використання стрілок, регуляторів та індикаторів у діалоговому вікні програми

Для діалогового вікна створення програми дещо спрощується. По-перше, елементи керування розташовуються за допомогою редактора ресурсів. По-друге, за допомогою редактора ресурсів можна визначити окремі властивості елементів керування. Програма знову складається лише з двох класів. Тепер це клас діалогового вікна та клас прикладки. Функція OnInitDialog() класу діалогового вікна забезпечує пов’язування ресурсів програми із об’єктами класу. Повний текст програми наведений у Прикладі 5.6

 

Приклад 5.5 – Програма із використанням стрілки, регулятора та індикатора у діалоговому вікні програми

 

// файл App.h

class CApp: public CWinApp {public: BOOL InitInstance(); };

 

class CSDialog: public CDialog

{public: BOOL OnInitDialog();

void OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB);

CSDialog(UINT id, CWnd *Owner): CDialog(id, Owner){}

DECLARE_MESSAGE_MAP()

private: CSliderCtrl *mySlider;

CProgressCtrl *myProgress;

CSpinButtonCtrl mySpin;

CEdit *BuddyEdit; };

// файл App.cpp

#include < afxwin.h>

#include < afxcmn.h>

#include " App.h"

#include " resource.h"

 

BOOL CApp:: InitInstance()

{CSDialog a(IDD_DIALOG1, NULL);

a.DoModal();

return TRUE; }

 

CApp App;

 

void CSDialog:: OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB)

{ if(SB==(CScrollBar*)& mySpin)mySlider-> SetPos(mySpin.GetPos());

if(SB==(CScrollBar*)mySlider)mySpin.SetPos(mySlider-> GetPos());

myProgress-> SetPos(mySpin.GetPos());

}

 

BOOL CSDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

InitCommonControls();

mySlider=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);

myProgress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);

BuddyEdit=(CEdit*)GetDlgItem(IDC_EDIT1);

CRect r1(0, 0, 0, 0);

mySpin.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|UDS_SETBUDDYINT|

UDS_ALIGNLEFT, r1, this, 2);

mySpin.SetBuddy(GetDlgItem(IDC_EDIT1));

return TRUE;

}

BEGIN_MESSAGE_MAP(CSDialog, CDialog)

ON_WM_VSCROLL()

END_MESSAGE_MAP()

Результат роботи програми зображено на рисунку 5.8.

 

 

Рисунок 5.8 – Вигляд програми із використанням стрілки, регулятора

та індикатора у діалоговому вікні

 

5.7.4 Використання регулятора для керування гучності звуку

Інший приклад, який хотілося б запропонувати – розробка простої програми для регулювання гучності звуку вашого комп’ютера. Така програма наочно демонструє можливості використання регулятора і має хоча б мінімальну, але практичну цінність. Дана програма будуватиметься за комбінованою схемою із використанням ClassWizard. Детально опишемо кроки побудови програми:

1. Створити новий проект типу “Win32 Application”.

2. Визначити пустий тип створюваного проекту – “Empty project”.

3. Натиснувши комбінацію клавіш “Ctrl+r” перейти у діалогове вікно до­давання ресурсів. Вибрати “Dialog” та натиснути “New”.

4. Створити ресурс діалогового вікна із трьома регуляторами – для лівого, правого каналів та загальним регулятором за прикладом, наведеним на рисунку 5.9 (регулятори мають властивості “Tick marks” та “Autoticks”). Ресурс діалогового вікна звичано матиме ідентифікатор IDD_DIALOG1.

 

 

Рисунок 5.9 – Вигляд ресурсів програми для регулювання гучності звуку

 

 

5. Зберегти файл ресурсів (за замовчуванням – “Script1.rc”)

6. За допомогою меню “Project”-> ”Add to Project”-> ”Files” додати файл ресурсів у проект.

7. Натиснувши на полі діалогового вікна праву клавішу обрати ClassWizard. У вікні вибору файлів нічого не обирати, натиснути OK. У відповідь на пропозицію створити клас, відповідний ресурсу IDD_DIALOG1 – натиснути OK.

8. Ввести ім’я класу діалогового вікна, наприклад CSDialog.

9. На сторінці “Member Variables” Class Wizard для кожного з регуляторів визначити відповідні змінні, наприклад m_sl1, m_sl2, m_sl3 (типу CSliderCtrl).

10. Обравши на сторінці “Message Maps” у полі “Object ID’s ” CSDialog, у полі “Messages” обрати повідомлення WM_VSCROLL (вертикальна прокрутка) та натиснути кнопку “Add Function”, далі – “Edit code”. Для створеної функції OnVScroll() визначити такий текст:

 

void CSDialog:: OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{ // TODO: Add your message handler code here and/or call default

DWORD volume;

UINT uRetVal, uNumDevs;

if (uNumDevs = waveOutGetNumDevs())

{uRetVal = waveOutGetVolume(0, (LPDWORD)& volume);

if(pScrollBar==(CScrollBar*)& m_sl1)

{DWORD curVol=MAKELONG((DWORD)0xFFFF/100*m_sl1.GetPos(), HIWORD(volume));

waveOutSetVolume(0, curVol); }

if(pScrollBar==(CScrollBar*)& m_sl2)

{DWORD curVol=MAKELONG(LOWORD(volume), (DWORD)0xFFFF/100*m_sl2.GetPos()); waveOutSetVolume(0, curVol); }

if(pScrollBar==(CScrollBar*)& m_sl3)

{m_sl1.SetPos(m_sl3.GetPos());

m_sl2.SetPos(m_sl3.GetPos());

DWORD curVol=MAKELONG((DWORD)0xFFFF/100*m_sl1.GetPos(),

(DWORD)0xFFFF/100*m_sl2.GetPos()); waveOutSetVolume(0, curVol);

}

} CDialog:: OnVScroll(nSBCode, nPos, pScrollBar);

}

 

11. Для повідомлення WM_INITDIALOG ввести відповідну функцію OnInitDialog() та визначити її код:

 

BOOL CSDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

m_sl1.SetPos(50);

m_sl2.SetPos(50);

m_sl3.SetPos(50);

return TRUE;

}

 

12. Додати через вікно структури проекту клас прикладки CApp, наслідуваний від CWinApp. Визначити для нього функцію InitInstance() такого вигляду:

 

 

BOOL CApp:: InitInstance()

{CSDialog a;

a.DoModal();

return TRUE; }

13. Визначити об’єкт прикладки як глобальну змінну програми:

 

CApp App;

 

14. Директиви #include *.cpp файла проекту замінити, додавши необхідні бібліотеки:

#include < afxwin.h>

#include < afxcmn.h> // заголовочний файл спільних елементів керування

#include < Mmsystem.h> // заголовочний файл мульти-медіа пристроїв

#include " resource.h"

#include " SDialog.h"

 

15. Додати у проект (послідовність “Project”-> ”Add to Project”-> ”Files”) бібліотеку мультимедіа: WINMM.LIB з бібліотечного каталога Visual C++ (\Program Files\Microsoft Visual Studio\VC98\Lib\WINMM.LIB).

16. Натиснувши комбінацію “Alt+F7”, встановити необхідність використання MFC.

17. Побудувати проект та запустити його.

18. Запустити будь-яку програму, що програває звукові файли (наприклад Windows Media Player або RealPlayer) та упевнитись у працездатності проекту.

 

Повний текст коду програми наводиться у прикладі 5.6.

 

Приклад 5.6 – Проста програма регулювання гучності звуку

 

// SDialog.h: header file

 

class CSDialog: public CDialog // формується Class Wizard

{

// Construction

public: CSDialog(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CSDialog)

enum { IDD = IDD_DIALOG1 };

CSliderCtrl m_sl3;

CSliderCtrl m_sl2;

CSliderCtrl m_sl1;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSDialog)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CSDialog)

afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

virtual BOOL OnInitDialog();

//}}AFX_MSG

DECLARE_MESSAGE_MAP() };

class CApp: public CWinApp

{public: BOOL InitInstance();

CApp();

virtual ~CApp();

};

 

// SDialog.cpp: implementation file

 

#include < afxwin.h>

#include < afxcmn.h>

#include < Mmsystem.h>

#include " resource.h"

#include " SDialog.h"

 

CSDialog:: CSDialog(CWnd* pParent /*=NULL*/) // формується Class Wizard

: CDialog(CSDialog:: IDD, pParent)

{ //{{AFX_DATA_INIT(CSDialog)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

 

void CSDialog:: DoDataExchange(CDataExchange* pDX) // формується Class Wizard

{ CDialog:: DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSDialog)

DDX_Control(pDX, IDC_SLIDER3, m_sl3);

DDX_Control(pDX, IDC_SLIDER2, m_sl2);

DDX_Control(pDX, IDC_SLIDER1, m_sl1);

//}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CSDialog, CDialog) // формується Class Wizard

//{{AFX_MSG_MAP(CSDialog)

ON_WM_VSCROLL()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

BOOL CSDialog:: OnInitDialog()

{CDialog:: OnInitDialog();

m_sl1.SetPos(50); m_sl2.SetPos(50); m_sl3.SetPos(50);

return TRUE; }

 

CApp:: CApp(){}

CApp:: ~CApp(){}

 

BOOL CApp:: InitInstance()

{CSDialog a;

a.DoModal();

return TRUE; }

 

CApp App;

 

void CSDialog:: OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{ DWORD volume;

UINT uRetVal, uNumDevs;

if (uNumDevs = waveOutGetNumDevs())

{uRetVal = waveOutGetVolume(0, (LPDWORD)& volume);

if(pScrollBar==(CScrollBar*)& m_sl1)

{DWORD curVol=MAKELONG((DWORD)0xFFFF/100*m_sl1.GetPos(), HIWORD(volume));

waveOutSetVolume(0, curVol); }

if(pScrollBar==(CScrollBar*)& m_sl2)

{DWORD curVol=MAKELONG(LOWORD(volume), (DWORD)0xFFFF/100*m_sl2.GetPos()); waveOutSetVolume(0, curVol); }

if(pScrollBar==(CScrollBar*)& m_sl3)

{m_sl1.SetPos(m_sl3.GetPos());

m_sl2.SetPos(m_sl3.GetPos());

DWORD curVol=MAKELONG((DWORD)0xFFFF/100*m_sl1.GetPos(),

(DWORD)0xFFFF/100*m_sl2.GetPos()); waveOutSetVolume(0, curVol);

}

} CDialog:: OnVScroll(nSBCode, nPos, pScrollBar);

}

 

Додамо коментар до самого процесу регулювання гучності. За допомогою функції waveOutGetNumDevs() можна отримати кількість пристроїв виведення звуку на вашому комп’ютері. Якщо така кількість ненульова, можна здійснити контроль гучності. Через те, що керування гучністю здійснюється окремо за кожним з каналів – правим та лівим, необхідно встановити поточну гучність у кожному з каналів, записавши її у змінну volume типу DWORD:

 

waveOutGetVolume(0, (LPDWORD)& volume); // 0 – ідентифікатор пристрою виведення

 

Зі змінної volume можна отримати значення гучності у кожному з каналів, для чого запитуються значення нижнього та верхнього складових слів змінної.

Гучність у кожному з каналів задається типом DWORD (32-бітне беззнакове ціле) і має мінімальне значення 0х0000 та максимальне – 0хFFFF. Коли змінюється гучність у одному з каналів, другий має залишатися незмінним, тому поточне значення гучності щоразу формується зі значень нижнього та верхнього слів. Це можна зробити макросом MAKELONG (приклад для лівого каналу):

 

DWORD curVol=MAKELONG((DWORD)0xFFFF/100*m_sl1.GetPos(), HIWORD(volume));

 

де HIWORD(volume) – поточне значення гучності у правому каналі (верхнє слово), а (DWORD)0xFFFF/100*m_sl1.GetPos() – максимум гучності, розділений на 100 (повний діапазон шкали) та помножений на поточне значення регулятора. Тепер можна встановити гучність звуку:

 

waveOutSetVolume(0, curVol); // сurVol (current volume) – поточна гучність

 

 

5.8 Використання простих вікон анімації

 

Стандартне вікно анімації, що входить до складу спільних елементів керування Windows забезпечує виведення відеозображень у стандартному для системи форматі AVI (AudioVideo Interleaved). AVI-файли є послідовними наборами кадрів бітових зображень і таким чином можуть складати велику послідовність, яка може розглядатися як фільм. Слід, однак, зауважити, що мова йде про прості нестиснені файли анімації. Усі якісні відеозображення займають багато місця дискової пам’яті комп’ютера. Навіть за наявності великих вінчестерів, таку відео-інформацію доводиться стискати спеціальними методами. Таким чином, програма для відображення стиснутих відеозображень має працювати як пристрій розкодування. Ви, можливо, знаєте, що кількість спеціальних програм для кодування та розкодування фільмів та самих форматів кодування постійно збільшується.

У нашому випадку мова може йти про відображення дуже простих відеопослідовностей. Такі відеокліпи можна використовувати як допоміжний засіб демонстрації можливостей розроблюваної програми.

Просте вікно анімації описується класом CАnimateCtrl. Відеозображення має відповідати таким обмеженням:

1. У відеокліпі має бути присутнім один відеопотік, що міститиме щонайменше один кадр.

2. У файлі відеокліпу може бути присутнім щонайменше два потоки (другим потоком може бути аудіопотік, який, щоправда ігнорується вікном анімації).

3. Відеокліп має бути нестисненим або стисненим методом RLE8.

4. У відеокліпі не може відбуватися зміна палітр кольорів.

Вікно анімації створюється за допомогою функції Create() класу CAnimateCtrl:

 

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

 

де dwStyle – стиль вікна анімації, rect – розташування та розміри вікна, pParentWnd – покажчик на батьківське вікно, nID – ідентифікатор елемента анімації.

Зазвичай стиль приймає стандартну сукупність значень (WS_CHILD, WS_VISIBLE, WS_BORDER). Також вікно анімації має власні стилі:

 

Значення константи Коментар
ACS_CENTER відцентровує відеокліп відповідно до розмірів вікна анімації
ACS_TRANSPARENT відображує відеокліп із прозорим фоном
ACS_AUTOPLAY забезпечує автоматичний запуск програвання після відкриття

 

Клас CAnimateCtrl має невелику кількість функцій -

а) функція відкриття відеокліпу Open()

 

BOOL CAnimateCtrl:: Open(LPCTSTR lpszFileName);

 

де lpszFileName – покажчик на рядок із іменем файла.

б) функція програвання відеокліпу Play()

 

BOOL CAnimateCtrl:: Play(UINT nFrom, UINT nTo, UINT nRep);

 

де nFrom – номер кадру початку (у діапазоні 0-65536), nTo – номер кадру закінчення (у діапазоні 0-65536, -1 означатиме – до кінця), nRep – кількість повторень (-1 – необмежена кількість повторень).

 

в) функція пошуку кадру зображення Seek()






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.