Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Використання графічної бібліотеки opengl 1 страница
12.1 Загальні особливості OpenGL Мабуть, будь-якому користувачу персональних комп’ютерів, що не обмежується Microsoft Word та Excel, а ще й захоплюється комп’ютерними іграми, відомі такі словосполучення, як OpenGL та Direct3D. Саме OpenGL та Direct3D на сьогоднішній день є основними технологіями розробки ігрового програмного забезпечення в галузі тривимірної графіки. Більш того, на сьогоднішній день саме комп’ютерні ігри є найбільшою рушійною силою розвитку апаратного забезпечення персональних комп’ютерів, бо саме комп’ютерні ігри, а також системи моделювання робочих міст оператора (наприклад авіаційні, або інші тренажери) є найбільш вибагливими з точки зору забезпечення швидкості обчислень, обробки та виведення аудіо-візуальної інформації. Збільшення складності та якості зображень тягне за собою збільшення потреб та апаратного забезпечення, що у свою чергу надає нові і нові можливості. Сегмент ринку комп’ютерних технологій, пов’язаний із комп’ютерними іграми залишається одним з найбільш прибуткових і динамічних. З точки зору користувача в іграх немає різниці, яка використовується технологія програмування, важливим є оптимальне налаштування відеопристроїв комп’ютера і апаратна підтримка тієї чи іншої графічної технології. Зазначимо, що, на відміну від OpenGL, Direct3D є частиною більш загальної технології DirectX, що включає не тільки роботу із графічною інформацією, а й забезпечення інших мультимедійних засобів, у тому числі пов’язаних із введенням та виведення звукової та іншої інформації. Але, якщо DirectX – витвір компанії Microsoft і функціонує лише у Microsoft Windows, OpenGL підтримується і іншими операційними системами. OpenGL є графічною бібліотекою, що надає програмний інтерфейс забезпечення машинної графіки (близько 250 команд), які використовуються для визначення об’єктів і операцій, необхідних під час створення тривимірного графічного програмного забезпечення. OpenGL розроблено у як низькорівневий апаратно-незалежний інтерфейс, що реалізується рядом різних апаратних платформ. З цієї причини у OpenGL не включені команди для роботи з вікнами або забезпечення введення користувача. Також бібліотека не містить команди високого рівня для опису моделей тривимірних об’єктів. Навпаки, необхідна модель створюється з обмеженого набору геометричних примітивів: точок, ліній, багатокутників. На базі OpenGL пізніше були створені більш складні бібліотеки: − бібліотека утиліт OpenGL (GLU – OpenGL Utility Library), яка включає широкі можливості моделювання (поверхні другого порядку та сплайни); − бібліотека FSG (Fahrenheit Scene Graph). До основних можливостей OpenGL належить [4]: − відображення каркасних моделей; − підтримка ілюзії перспективи та глибини простору, атмосферних ефектів (туман, сніг); − підтримка згладжування вершин сцен; − підтримка сцен з плоским зафарбовуванням без використанням освітлення; − підтримка сцен з освітленням та рівномірним зафарбовуванням; − накладення тіней та текстур; − моделювання розмитості відображення рухомих об’єктів (motion blur); − підтримка ефектів глибини різко зображеного простору. Основними графічними операціями OpenGL є: − створення форм з графічних примітивів, і таким чином, створення математичних описів об’єктів (примітивами є лінії, багатокутники, зображення); − упорядкування об’єктів у тривимірному просторі та вибір бажаної точки розташування камери для перегляду скомпонованої сцени; − обчислення кольорів усіх об’єктів, де кольори у явний вигляд задаються програмою, визначаються, виходячи з умов освітлення, отримуються шляхом накладання текстур або комбінацією трьох зазначених дій; − перетворення математичного опису об’єктів та пов’язаної з ними інформації щодо кольору об’єктів у пікселі на екрані (процес, що називають растеризацією).
12.2 Конвеєр візуалізації OpenGL
Оскільки графічна система OpenGL забезпечує вирішення великої кіль-кості завдань, структура програми, що використовує OpenGL, може бути досить складною для розуміння. Насправді, основні завдання програми полягають у тому, щоб ініціювати певні стани, що забезпечують керування візуалізацією та визнати чи, які саме об’єкти мають бути візуалізовані. Щоб надалі не заплутувати читача, оголосимо певні визначення OpenGL згідно з [4]. Візуалізацією є процес, під час якого комп’ютер створює зображення з моделей. У свою чергу, моделі або об’єкти створюються з графічних примітивів – точок, ліній та багатокутників, що визначаються їх вершинами. Кінцеве візуалізоване зображення складається з пікселів, що виводяться на екран. Піксель є найменшим видимим елементом, що може створюватися апаратними засобами відображення. Інформація про пікселі (наприклад, колір) організовується у вигляді бітових площин. Бітова площина є областю пам’яті, що містить один біт інформації для кожного пікселя на екрані (наприклад, із кольором пікселя). Бітові площини організуються, у свою чергу у буфер кадру, що містить усю інформацію, необхідну дисплею для того, щоб забезпечити керування кольором та яскравістю усіх пікселів на екрані. З програмної точки зору, OpenGL є набором команд, що визначають координати об’єктів, забезпечують встановлення параметрів та їх перетворення. У будь-якому випадку команди OpenGL мають однаковий та визначений порядок виконання операцій обробки, що називається конвеєром візуалізації OpenGL. Цей порядок є практично повною структурою OpenGL і зображений на рисунку 12.1.
Рисунок 12.1 – Схема конвеєру візуалізації OpenGL
Тепер стисло розшифруємо окремі блоки цієї схеми [4]. 1. Будь-які дані OpenGL можуть зберігатися у списках виведення для поточного або подальшого використання. 2. Усі графічні примітиви описуються вершинами. Параметричні криві та поверхні можуть спочатку описуватися контрольними точками та поліноміальними функціями, що називаються базовими функціями. Обчислювачі надають методи отримання вершин, що використовуються для подання поверхні за контрольними точками. Таким методом є поліноміальне відображення, що може формувати нормаль до поверхні, координати текстури, тексту та значення просторових координат за контрольними точками. 3. Наступною операцією для вершин є стадія операцій обробки вершин, що перетворює вершини у примітиви. Певні типи даних вершин (просторові координати) перетворюються у матриці чисел із плаваючою точкою розміром 4x4. Просторові координати проектуються з положення у тривимірному просторі у положення на екрані. Якщо програма використовує текстури, на цій стадії можуть генеруватися та перетворюватися координати текстур. Якщо використовується освітлення, також використовується обчислення параметрів освітлення, нормалі до поверхонь, положення джерел освітлення, властивості матеріалу та інша інформація освітлення. 4. Основною частиною збирання примітивів є операція відсікання, що полягає у вилученні тих частин зображення, що виходять за межі напівпростору, визначеного певною площиною. Під час відсікання точок, вершини можуть пропускатися або відкидатися; під час відсікання ліній або багатокутників можуть додаватися додаткові вершини у залежності від того, як відсікається лінія або багатокутник. Інколи збирання примітивів супроводжується перспективним поділом, що забезпечує зменшення віддалених геометричних об’єктів. Результатом етапу є закінчені геометричні примітиви, що складаються з перетворених та відсічених вершин та пов’язаних з ними значеннями кольору, глибини та інколи координати текстур. 5. Піксельні дані крокують своїм власним шляхом: з визначених масивів пам’яті пікселі спочатку розпаковуються у компоненти певного формату. Потім дані масштабуються, змішуються, оброблюються за допомогою елементів відображення. Опісля цього, результати фіксуються та записуються в область пам’яті, виділену під текстури, або передаються на стадію растеризації. Якщо піксельні дані зчитуються з буфера кадру, виконуються операції передавання пікселя (масштабування, зміщення, відображення та фіксація). Насамкінець, отримані результати запаковуються у відповідний формат та повертаються у певний формат системної пам’яті. 6. За допомогою операцій збирання текстур OpenGL- програми можуть накладати зображення на геометричні об’єкти, що робить їх більш реалістичними. Якщо програма використовує декілька зображень текстури, можна використовувати текстурні об’єкти та здійснювати перехід від одного текстурного об’єкта до іншого. Можна також здійснювати впорядкування текстур. 7. Растеризацією є перетворення геометричних або піксельних даних у фрагменти. Кожен квадратний фрагмент відповідає пікселю у буфері кадру. Штрихування ліній та багатокутників, ширина ліній, розмір точок, модель замальовування та обчислення покриття, необхідні для підтримки згладжування, враховуються як вершини, що з’єднуються у лінії, або як внутрішні пікселі, розраховані для зарисованого багатокутника. Значення кольору та глибини призначаються для кожного квадратного фрагмента. 8. Перед фактичним збереженням у буфері кадру виконується ряд операцій. Результатом операцій є змінення фрагментів або навіть їх відкидання. Усі операції можна увімкнути або вимкнути. Першою операцію є накладення текстур. Вона полягає у тому, що тексель (елемент текстури) генерується у пам’яті текстур для кожного фрагмента і застосовується для конкретного фрагмента. Після цього можуть застосовуватися операції обчислення туману, що супроводжуються тестом ножиць, альфа-тестом, тестом трафарету, тестом буферу глибини. Також можуть виконуватися операції змішування кольорів, псевдозмішування (розмиття) кольорів для передавання напівтонів, логічної обробки та маскування за допомогою бітової маски. Нарешті, повністю оброблений фрагмент виводиться у відповідний буфер, де він перетворюється у піксель і досягає свого кінцевого розташування. Буфер кадру відіграє особливу роль. Дані буфера кадру можуть записуватися та зчитуватися функціями OpenGL, однак його настроювання відбувається за допомогою операційної системи, у якій використовується OpenGL.
12.3 Взаємодія Windows та OpenGL у MFC-програмах
12.3.1 Загальні принципи Хоча команди OpenGL можуть виконуватися у різних операційних системах, написання програм OpenGL у спосіб, наприклад, зазначений у [4] для про-ектів Visual C++ консольного типу (аналогічний організації DOS-програм), не завжди є прийнятним. Організація OpenGL-програм для операційної системи Microsoft Windows має свої особливості. Як вже зазначалося у розділі 2, MFC-програми для виведення інформації графічного або текстового вмісту використовують контексти пристроїв. Інтерфейс графічних пристроїв Windows GDI забезпечує керування контекстами цих пристроїв. Технологія OpenGL не співпрацює зі стандартними контекстами пристроїв Windows, натомість використовує так званий контекст візуалізації (rendering context) [2]. Під час роботи з контекстом пристрою для вибору нового інструмента відображення (пера або пензля) використовується GDI-функція SelectObject(). Обраний інструмент залишається активним до вибору наступного інструмента. За аналогією з контекстом пристрою, контекст візуалізації забезпечує обробку графічного стану. Технологія OpenGL використовує контекст візуалізації для обробки інформації, необхідної для коректного екранного подання сцени у заданому вікні. У OpenGL має бути присутнім спеціальний механізм взаємозв’язку вихідної інформації з контекстом пристроїв Windows. Шляхом розміщення визначених ділянок інформації у структурі контексту візуалізації, OpenGL дозволяє оновлювати графічний стан вікна під час роботи з операційною системою Windows. Ці взаємини описуються рисунком 12.1.
Рисунок 12.1 – Відношення у системі контекст пристрою-контекст візуалізації Контексти візуалізації є багатопотоковими, тобто один спільний контекст візуалізації може використовуватися декількома потоками. У структурі програми може використовуватися декілька контекстів візуалізації, з яких обирається необхідний. Однак один потік має функціонувати в межах активного контексту візуалізації. OpenGL-команди не потребують дескрипторів або покажчиків на контексти візуалізації незалежно від того, який контекст візуалізації є активним. Контекст візуалізації є практично однаковим для різних OpenGL-команд. У процесі роботи з OpenGL контекст візуалізації спочатку створюється, потім ініціюється, обирається поточним, використовується, відключається та вилучається. Така послідовність не означає необхідність її виконання під час кожного оновлення графічної сцени. У реальних OpenGL-програмах створений та ініційований контекст візуалізації надалі багаторазово використовується у роботі поточної програми. При цьому активізація та відключення контексту виконуються багаторазово, а вилучення здійснюється один раз – після закінчення роботи програми. Використання контекстів візуалізації забезпечується такими WinAPI-функціями: HGLRC wglCreateContext(HDC hdc); // створення контексту візуалізаціїBOOL wglDeleteContext(HGLRC hglrc); // вилучення контексту візуалізації BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc); // активізація контексту візуалізації
У наведених функціях hdc – дескриптор контексту GDI, hglrc – дескриптор контексту візуалізації OpenGL.
12.3.2 Структура PIXELFORMATDESCRIPTOR В основі контекстного відображення знаходиться поняття формату пікселя. Формат пікселя Windows не завжди узгоджується з OpenGL. У процесі ініціалізації OpenGL ці формати необхідно узгодити. Інформація щодо взаємодії OpenGL та конкретного системного пристрою Windows міститься у структурі PIXELFORMATDESCRIPTOR, що описується нижче:
typedef struct tagPIXELFORMATDESCRIPTOR {
} PIXELFORMATDESCRIPTOR;
Структура PIXELFORMATDESCRIPTOR використовується для запису значень, до яких програма OpenGL має налаштуватися. До таких параметрів належить подвійна буферизація (використання двох відеобуферів для підтримки мультиплікації без мерехтіння) та пікселі типу RGBA (червоний, зелений, синій та альфа). Після заповнення, структура передається GDI-функції і дозволяє використовувати можливості поточної системи. Контекст візуалізації створюється функцією wglCreateContext(). Окремі елементи структури PIXELFORMATDESCRIPTOR мають значну кількість значень. Значення поля dwFlags наводяться у таблиці 12.1.
Таблиця 12.1 – Значення поля dwFlags структури PIXELFORMATDESCRIPTOR
Значення поля iPixelType наводяться у таблиці 12.2.
Таблиця 12.2 – Типові значення поля iPixelType структури PIXELFORMATDESCRIPTOR
12.3.3 Особливості організації OpenGL-орієнтованої MFC-програми У літературі з OpenGL звичайно створення MFC-програм звичайно базується на проектах, створюваних за допомогою MFC Application Wizard, що в основному передбачає роботу із класами вигляду (view). В даному посібнику розглянуто інший підхід, тому і побудова OpenGL-програми ґрунтується на вже розглянутій структурі проекту типу Win32 Application. Розглянемо порядок внесення змін у просту MFC-програму: 1. До класу головного вікна додати дескриптор контексту візуалізації OpenGL та покажчик на палітру:
class CMain: public CFrameWnd {private: CPalette *m_pPal; // покажчик на палітру HGLRC m_hrc; // дескриптор контексту візуалізації ………….. };
2. У конструкторі головного вікна MFC-програми оголосити об’єкт структури PIXELFORMATDESCRIPTOR та ініціалізувати його поля необхідними значеннями, наприклад:
PIXELFORMATDESCRIPTOR pfd; memset(& pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; // номер версії pfd.dwFlags = PFD_DOUBLEBUFFER | // використання подвійної буферизації PFD_SUPPORT_OPENGL | // підтримка OpenGL PFD_DRAW_TO_WINDOW; // піксельний формат вікна pfd.iPixelType = PFD_TYPE_RGBA; // тип пікселів pfd.cColorBits = 24; // 24-розрядний колір pfd.cDepthBits = 32; // буфер 32-розрядної глибини pfd.iLayerType = PFD_MAIN_PLANE; // тип шару
3. За допомогою функції ChoosePixelFormat() переглянути у контексті пристрою сумісні піксельні формати та обрати такий, що найбільшою мірою співпадає з зазначеним у структурі pfd:
CClientDC dc(this); int nPixelFormat = ChoosePixelFormat(dc.m_hDC, & pfd);
Дані про підтримку формату можуть бути перевірені. Якщо значення nPixelFormat дорівнюватиме 0, робота OpenGL -програми має бути завершена. 4. Після отримання формату, що найбільш співпадає з запитаним, встановити його у контекст пристрою за допомогою функції SetPixelFormat():
BOOL bResult = SetPixelFormat(dc.m_hDC, nPixelFormat, & pfd);
Результат встановлення формату знову може бути перевіреним. 5. Створити контекст візуалізації за допомогою функції wglCreateContext() та зробити його поточним функцією wglMakeCurrent():
m_hrc = wglCreateContext(dc.m_hDC); wglMakeCurrent(dc.m_hDC, m_hrc);
6. У разі, коли програма використовує контекст візуалізації OpenGL, особливу важливість має керування параметрами масштабування. Під час зміни розмірів вікна контекст візуалізації також має коректно змінюватися. Це викликає необхідність спеціального опису обробки повідомлення WM_SIZE, наприклад у такий спосіб:
void CMain:: OnSize(UINT nType, int cx, int cy) { CClientDC dc(this); // Встановлення m_hrc поточним контекстом візуалізації BOOL bResult = wglMakeCurrent(dc.m_hDC, m_hrc); // Встановлення відповідності області 3D-виведення та простору екрана GLdouble gldAspect = (GLdouble) cx/ (GLdouble) cy; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, gldAspect, 1.0, 10.0); glViewport(0, 0, cx, cy); wglMakeCurrent(NULL, NULL); // жоден контекст буде поточним }
7. У випадках, коли система підтримує не більше 256 кольорів, необхідно забезпечити процедури керування палітрою кольорів програми. Для повної підтримки можна реалізувати спеціальну функцію, наприклад CreateRGBPalette():
BOOL CMain:: CreateRGBPalette(HDC hDC) { PIXELFORMATDESCRIPTOR pfd; int n = GetPixelFormat(hDC); // отримання піксельного формату // отримання інформації про формат пікселів DescribePixelFormat(hDC, n, sizeof(PIXELFORMATDESCRIPTOR), & pfd); if (! (pfd.dwFlags & PFD_NEED_PALETTE)) return FALSE; // заповнення логічної палітри інформацією про таблиці кольорів LOGPALETTE* pPal = (LOGPALETTE*) malloc(sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)); if (! pPal){TRACE(" Out of memory for logpal"); return FALSE; } // нестача пам’яті pPal-> palNumEntries = 256; // розмір таблиці кольорів BOOL bResult = m_pPal-> CreatePalette(pPal); // створення палітри RGB free (pPal); return bResult; }
8. Окремо у програмі можна визначити вилучення контексту візуалізації. Це забезпечується під час обробки повідомлення WM_DESTROY. До обробника OnDestroy(), зокрема можна включити такі рядки:
wglDeleteContext(m_hRC); if (m_pPal! = NULL) {DeleteObject (m_pPal); }
9. Визначити обробник OnPaint() повідомлення WM_PAINT (у проектах, створених за допомогою MFC Application Wizard – обробник OnDraw()). Цей обробник, може бути реалізованим, наприклад, у такий спосіб:
void CMain:: OnPaint() { CPaintDC pDC(this); CPalette* ppalOld = NULL; if (m_pPal) {ppalOld = pDC.SelectPalette(m_pPal, 0); pDC.RealizePalette(); } // Встановлення поточного контекста візуалізації BOOL bResult = wglMakeCurrent(pDC.m_hDC, m_hrc); // Виконання графічних команд OpenGL GLInit(); // виконання настроювання OpenGL OnOpenGLFirst(); // виконання необхідних OpenGL-конструкцій SwapBuffers(pDC.m_hDC); if (ppalOld) pDC.SelectPalette(ppalOld, 0); wglMakeCurrent(NULL, NULL); }
Зазначимо, що функції користувача GLInit() та OnOpenGLFirst() виконуватимуть ініціалізацію та необхідні графічні побудови безпосередньо із використанням OpenGL-команд. 10. Для реалізації обертання об’єктів OpenGL додати повідомлення вертикального і горизонтального прокручування (WM_VSCROLL та WM_HSCROLL) та їх відповідні обробники:
void CMain:: OnVScroll(UINT SBCode, INT Pos, CScrollBar *SB) {switch(SBCode) {case SB_LINEDOWN: vspos++; break; case SB_LINEUP: vspos--; break; case SB_PAGEDOWN: vspos+=5; break; case SB_PAGEUP: vspos-=5; break; case SB_THUMBTRACK: vspos=Pos; break; case SB_THUMBPOSITION: vspos=Pos; break; } Invalidate(FALSE); SetScrollPos(SB_VERT, vspos); } void CMain:: OnHScroll(UINT SBCode, INT Pos, CScrollBar *SB) {switch(SBCode) {case SB_LINERIGHT: hspos++; break; case SB_LINELEFT: hspos--; break; case SB_PAGERIGHT: hspos+=5; break; case SB_PAGELEFT: hspos-=5; break; case SB_THUMBTRACK: hspos=Pos; break; case SB_THUMBPOSITION: hspos=Pos; break; } Invalidate(FALSE); SetScrollPos(SB_HORZ, hspos); }
11. Реалізувати команди OpenGL в необхідній послідовності у функціях GLInit() та OnOpenGLFirst(), наприклад у такий спосіб:
void CMain:: GLInit() { static GLdouble marengo[3] = {1.0, 0.0, 0.0 }; glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(0.15, 0.15, -4.5); glColor3dv(marengo); glScalef(1.0, 1.0, 1.0); }
void CMain:: OnOpenGLFirst() { glRotatef(360.0*hspos/100, 0, 1, 0); // 3D-scrolling around y glRotatef(360.0*vspos/100, 1, 0, 0); // 3D-scrolling around x auxWireTeapot(1.0); // об’єкт типу каркасний чайник } 12. Додати у проект бібліотеки GLU32.LIB, GLAUX.LIB, OPENGL32.LIB. Підключити заголовкові файли " gl/gl.h", " gl/glu.h" та " gl/glaux.h". У разі побудови програми маємо отримати вікно, яке зображено на рисунку 12.2.
Рисунок 12.2 – Вигляд вікна простої OpenGL-програми
Текст простої OpenGL-програми, побудованої у спосіб, визначений вище, наведено у Прикладі 12.1.
Приклад 12.1 – Текст простої OpenGL-програми
// App.h: interface for the CApp class.
class CApp: public CWinApp {public: BOOL InitInstance(); };
class CMain: public CFrameWnd { CPalette *m_pPal; HGLRC m_hrc; public: void GLInit(); void OnVScroll(UINT SBCode, INT Pos, CScrollBar *SB); void OnHScroll(UINT SBCode, INT Pos, CScrollBar *SB); void OnSize(UINT nType, int cx, int cy); void OnPaint(); BOOL CreateRGBPalette(HDC hDC); void OnOpenGLFirst(); CMain(); DECLARE_MESSAGE_MAP() };
// App.cpp: implementation of the CApp class.
#include < afxwin.h> #include < afxext.h> // MFC extensions #include < memory.h> #include < math.h> // sqrt #include " gl/gl.h" //OPENGL #include " gl/glu.h" //OPENGL #include " gl/glaux.h" //OPENGL #include " App.h" #include " resource.h"
int vspos=50, hspos=50;
CMain:: CMain() {Create(NULL, " OpenGL: проста програма", WS_OVERLAPPEDWINDOW |WS_VSCROLL| WS_HSCROLL, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU1)); SetScrollPos(SB_HORZ, 50); SetScrollPos(SB_VERT, 50); PIXELFORMATDESCRIPTOR pfd; memset(& pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1;
|