Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

Про переименование рассылки в Visual C# подумаем, когда a) прочитаем про этот C# – здесь же;) и б) Microsoft выпустит продукт под таким названием.

А по поводу пожелания – так ведь так оно и есть! Рубрика WinAPI на что? А вот ActiveX и СOM действительно рассылкой не освещаются. Про COM/DCOM кажется, есть отдельная рассылка.

На заданные в прошлом выпуске вопросы пришло очень много ответов, так что я, скорее всего, похожие ответы сгруппирую в один, а потом просто укажу, кто такой ответ прислал. Иначе объем выпуска не выдержит ни один почтовый ящик ;) Постараюсь никого не забыть!

Да, и еще. Ради бога, прошу извинить меня тех, кто написал мне и не получил пока ответа. Писем приходит очень много,

и я не могу отвечать всем.

На сегодня пока все. Рубрики "WinAPI" и "Вопрос-Ответ" – в следующем выпуске. 

Будьте здоровы!

Красноярск, 2000.

Программирование на Visual C++

Выпуск №7 от 06/07/2000

Добрый день!

Сегодня я представляю вам обещанное продолжение публикации о типах WinAPI, а также ответы на заданные в 5-ом выпуске вопросы.

WINAPI
WinAPI: НЕ ЗАПУТАЙТЕСЬ В ТИПАХ 
(Продолжение. Начало см. выпуск No.5)

Очень часто вами будет использоваться тип HANDLE — дескриптор, предназначенный для описания различных объектов. На самом деле этот тип представляет собой ни что иное, как указатель на void, т.е. как бы на любой тип. 

Объекты Windows обычно представлены своими дескрипторами. Например, HWND — дескриптор окна. Что он из себя представляет? Давайте посмотрим:

В файле windef.h можно обнаружить такую строчку:

DECLARE_HANDLE(HWND);

Эта строка при определенной опции STRICT разворачивается в 

struct HWND__ {int unused;};

typedef struct HWND__ *HWNDж

То есть HWND есть указатель на структуру HWND__. Если же опция STRICT не определена, то HWND везде заменяется на HANDLE.

Идентификатор STRICT указывает на необходимость проводить более строгую проверку типов. Как вы уже убедились, без этой опции все HWND, а также описатели других объектов Windows — HPEN, HBITMAP, HFONT, HMENU, HDC и др. будут фактически представлять собой один тип — HANDLE. Если же вы включите определение STRICT, тогда они будут трактоваться как разные типы (благодаря макросу DECLARE_HANDLE), и при их несоответствии компилятор будет выдавать сообщение об ошибке. Использование STRICT рекомендуется для того, чтобы было легче находить возможные ошибки в программе.

В заключение давайте рассмотрим очень часто используемый тип COLORREF. По сути это unsigned long. Этот тип представляет возможность задать цвет набором его RED, GREEN и BLUE составляющих, для этого используйте макрос RGB:

COLORREF color=RGB(0,255,255);

Результат этого выражения – длинное целое число, самый младший байт которого содержит интенсивность красного, второй – зеленого и третий байт – синего. В этом случае color будет содержать голубой цвет. Сам макрос RGB(r,g,b) при обработке препроцессором расширяется до ((COLORREF)((BYTE)(r) | ((WORD)(g) <<8)) | (((DWORD)(BYTE)(b))<<16))).

ВОПРОС – ОТВЕТ

Q. …Как делать окна нестандартной формы? Например, круг (как у диска Компьютерры — там окно обычное, но с помощью прозрачности виден только круг, так?)

eFi

A. На этот вопрос пришло довольно много фактически одинаковых ответов, и я сейчас постараюсь объяснить самую суть.

В Windows существует понятие регионов — областей. Каждое окно имеет свою область, которая по умолчанию создается прямоугольной. В WinAPI (и в классе CWnd) существует функция SetWindowRgn, которая позволяет задать форму этой области. То есть сначала вы создаете область, потом устанавливаете его как форму для окна (это можно сделать, например, в OnInitDialog). Создать область можно с помощью функций Create…Rgn. Например,

чтобы сделать круглое окно, можно воспользоваться CreateEllipticRgn. Подробно параметры я описывать не буду – смотрите пример. Замечу только, что регионы можно создавать сложные, составленные из нескольких примитивов. Они образуются путем комбинирования областей (CombineRgn).

Пример (прислал Sergey Melnikov):

CRect Rect;

GetWindowRect(&Rect);

HRGN hRgn = CreateEllipticRgn(0, 0, Rect.Width, Rect.Height);

SetWindowRgn(hRgn, TRUE);

А если добавить такой код, получим окно с "прорезью" в виде эллипса:

HRGN hRgn1 = CreateRectRgn(0, 0, Rect.Width, Rect.Height);

HRGN hRgn2 = CreateEllipticRgn(0, 0, Rect.Width, Rect.Height);

HRGN hRgn3 = CreateRectRgn(0, 0, Rect.Width, Rect.Height);

CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);

SetWindowRgn(hRgn3, TRUE);

Ответ на этот вопрос прислали (в порядке получения): Андрей Колчанов, Ренат Васиков, Ilgar Mashayev, Sergey Skornyakov, LiMar, Sergey Melnikov, Igor Kurilov, Michael Stepanenkov.

Q. …Как загружать 256-цветный курсор в приложении? Т.е. проблема в том что в редакторе ресурсов можно сделать либо только черно-белый курсор, либо еще и цветной, но при этом LoadCursor загружет только ч.б…

George V. Samodumov

A. Ответ на этот вопрос часто сводится к рекомендации воспользоваться LoadImage вместо LoadCursor. Вот самый полный и интересный ответ из присланных:

Дело в том, что файл курсора имеет схожий формат с файлом иконки, т.е. в одном файле могут находиться несколько изображений разных форматов, например: 16×16×16, 32×32×256 и т.д. При добавлении нового курсора редактор ресурсов VC автоматически создает курсор формата 32×32×2, который вероятно и грузится первым даже если добавлены еще несколько изображений. Поэтому нужно сделать так, чтобы курсор содержал только одно изображение. В редакторе ресурсов выполняем Insert|Cursor, потом открываем его для редактирования и в появившемся меню Image выбираем "New Device Image", а там "Custom" и задаем параметры изображения, например 48×48×256. Редактируем курсор, а потом переключаемся на монохромное изображение и удаляем его: "Image|Open Device Image –> Monochrome32×32", "Image|Delete Device Image". Теперь мы избавились от монохромного изображения и можем грузить курсор функциями: LoadCursor, LoadCursorFromFile, LoadImage:

BOOL CSampleDlg::OnInitDialog {

 CDialog::OnInitDialog;

 ::SetClassLong(m_hWnd, GCL_HCURSOR, (LONG)(HCURSOR)AfxGetApp->LoadCursor(IDC_CURSOR1));

 // Грузим анимационный курсор

 (LONG)(HCURSOR)::LoadCursorFromFile("Appstart.ani"));

 return TRUE;

}

Alex Hin

Ответ прислали (в порядке получения): Azanov Max, Dmitri A. Doulepov, Alex Hin, Igor Kurilov.

По многочисленным просьбам уменьшить размер выпуска, одновременно выпуская его чаще, оставшиеся два вопроса будут рассмотрены в следующем выпуске рассылки, который выйдет послезавтра (в субботу).

Предлагаю подписаться на дружественную рассылку:

Visual Basic — Трюки и Хитрости, советы и ответы на вопросы

Всего хорошего!

Поделиться:
Популярные книги

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия