Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Программирование -> C / C++ -> WinAPI: Не запутайтесь в типах

Очень часто вами будет использоваться тип 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" и задаем параметры изображения, например 48x48x256. Редактируем курсор, а потом переключаемся на монохромное изображение и удаляем его: "Image|Open Device Image -> Monochrome32x32", "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

 
Популярные книги

SQL для "чайников", 5-е издание

Подробнее

Практические работы по Excel на уроках информатики

Подробнее

Обработка цифровых фотографий (+CD)

Подробнее

 

 
Новости ИТ
01.12.2008  Buffalo выпустил миниатюрные USB-накопители
01.12.2008  VENTO TA-U1 - стильный корпус представлен Asus
01.12.2008  Fujitsu-Siemens выпускает в продажу внешний ускоритель для ноутбуков
01.12.2008  Оригинальные чехлы для ноутбуков от Choiix
01.12.2008  Опубликован код драйвера для беспроводных карт Atheros
01.12.2008  Лучший блог 2008
01.12.2008  Linux запустили на Apple iPhone
01.12.2008  LG KC780
01.12.2008  MSI дополнит линейку Wind-нетбуков двумя моделями
01.12.2008  Nikon D3X - 24,5 млн пикселей для профессионалов
01.12.2008  Киловаттник HIPER M1000 с КПД выше 85%
01.12.2008  AMD впервые снизила цены линейки Radeon HD 4800
01.12.2008  Чистильщики: Wise Registry Cleaner v.3.8.2
01.12.2008  Антивирусы: RemoveIT Pro v4 SE (30.11.2008)
01.12.2008  Корпус ASUS Vento TA-U1 можно поставить вместо новогодней ёлки
01.12.2008  Диагностика: PC Wizard 2008 v.1.871
01.12.2008  Диагностика: NextSensor v.2.7.6.0 Build 1130
01.12.2008  Тестовые приложения: PassMark BurnInTest v.6.0 Build 1000 Beta 15
01.12.2008  Неофициальные драйверы для модемов Motorola
01.12.2008  Драйверы и утилиты для сетевых хранилищ D-Link
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100