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



Пример (прислал 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.

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