Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
93-95.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
972 Кб
Скачать
☆

Добавление курсоров

Н а рисунке представлено окно редактора курсоров. Глядя на законченные изображения, обратите внимание, что оно представлено в двух разных масштабах. Увеличенное изображение в поле редактирования позволяет легко создавать изображение. Маленькое, в натуральную величину, изображение справа показывает курсор или значок в том виде, в котором он появится в приложении.

При создании курсора вы можете выбрать инструмент "острие". Острие (hotspot) курсора — это точка, которая отмечает текущие экранные координаты мыши. Острие у курсора в виде сектора находится в его вершине.

Как только вы выбрали инструмент "острие", в области редактирования появляется маленький крестик. Поместите крестик в точку, которую вы хотите назначить острием, и щелкните мышью. Координаты острия будут добавлены в информационную панель. Каждый курсор может иметь только одно острие.

Добавить курсор к приложению не составляет труда. Сначала перемен­ной szCursorName присваивается значение — имя курсора, определенное в CUR.RC: szCursorName[]="NewCursor";

Затем новый курсор присваивается классу окна:

wcApp.hCursor=LoadCursor(hlnst, szCursorName);

При создании окна оригинальный курсор автоматически связывается с положением "мыши".

Еще раз напомним, что создавая файл проекта, следует убедиться в том, что в список построения включены файл с исходным текстом программы CUR.C и файл ресурсов CUR.RC. Утилита проекта автоматически включит, откомпилирует и свяжет эти ресурсы с исполняемым файлом приложения CUR.EXE.

Добавление битовых образов

Битовый образ представляет собой находящуюся в памяти компьютера, и, следовательно, невидимую графическую поверхность, на которой программа может сформировать изображение. Содержимое битового образа (картинка) легко и, что особенно важно, быстро может быть выведено на поверхность формы или области вывода иллюстрации (image). Поэтому в программах битовые образы обычно используются для хранения небольших изображений, например, картинок командных кнопок. При хранении битовых образов в отдельном файле обычно используется расширение BMP (это единственный растровый формат, который напрямую поддерживается Windows). Часто они хранятся и в ресурсах. 

В MFC битовые образы описываются классом CBitmap. Для их создания можно использовать либо ресурсный редактор, либо импортировать в ресурсы готовые файлы BMP, созданные при помощи графических пакетов. Битовый образ является таким же ресурсом, как иконка или диалог. Нужно помнить, что область ресурсов с битовыми образами в EXE-файле может занимать большой размер. Но это не очень страшно, так как ресурсы автоматически не загружаются в память.

Когда битовый образ помещен в ресурсы, его можно выводить на экран. Но этот процесс не такой уж и простой.

Сначала необходимо создать объект типа CBitmap и с помощью функции LoadBitmap() загрузить в него битовый образ из ресурсов. Прототип функции таков:

BOOL CBitmap::LoadBitmap(LPCSTR ResourceName);

Способы добавления битовых образов незначительно отличаются от спосо­бов добавления курсоров или пиктограмм, но включают вызовы нескольких новых функций.

Для создания данного приложения при помощи компилятора С/С++ потребуются файл проекта, файл с исходным текстом программы на языке С, файл ресурсов и новый битовый образ. Битовый образ создается в редакторе ресурсов и в данном примере сохранен в файле BMP.BMP. Для данного примера необходимо разработать свой оригинальный курсор. Предупреждение: не делайте битовый образ слишком большим; иначе все файлы могут не поместиться на один диск!

Ниже приведен листинг файла ресурсов BMP.RC:

#include "windows.h"

BMImage BITMAP bmp.bmp

В данном листинге имя ресурса курсора (ВМР.ВМР) связывается с именем BMImage. Имя BMImage будет использоваться в файле с исходным текстом программы.

Ниже приведен полный листинг файла с исходным Текстом программы ВМР.С:

// bmp.с

// Приложение, выводящее битовый образ

// в определенной зоне окна пользователя.

// Copyright (с) Chris Н. Pappas and William Н. Murray, 1995

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM) ;

char szProgName[]="ProgName";

char szBMName[]="BMImage";

HBITMAP hBitmap;

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst, LPSTR lpszCmdLine,int nCmdShow)

HWND hWnd;

MSG lpMsg;

WNDCLASS wcApp;

hBitmap=LoadBitmap(hInst,szBMName);

if {!hPrelnst) {

wcApp.lpszClassName =szProgName;

wcApp.hInstance wcApp.lpfnWndProc wcApp.hCursor wcApp.hicon wcApp.lps zMenuName

=hInst;

=WndProc;

=LoadCursor(NULL;IDC_ARROW);

=NULL;

=NULL;

wcApp.hbrBackground =GetStockObject(WHITE BRUSH);

wcApp.style =CS_HREDRAW|CS_VREDRAW;

wcAppIcbClsExtra =0;

wcApp.cbWndExtra =0;

if (!RegisterClass (&wcApp))

return 0;

}

hWnd=CreateWindow(szProgName,"Drawing a Bitmap",

WS OVERLAPPEDWINDOW,CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT,(HWND)NULL,(HMENU)NULL,

(HANDLE)hInst, (LPSTR)NULL);

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

while (GetMessage(&lpMsg,NULL,0,0)) {

TranslateMessage(&lpMsg);

DispatchMessage(&lpMsg);

}

return(lpMsg.wParam);

}

LRESULT CALLBACK WndProc(HWND hWndfUINT messg,

WPARAM wParam,LPARAM lParam)

{

HDC hdc;

HDC hmdc;

PAINTSTRUCT ps;

BITMAP bm;

switch (messg) { case WM_PAINT:

hdc=BeginPaint(hWnd,&ps);

// Начало фрагмента пользователя

hmdc=CreateCompatibleDC(hdc);

SelectObject(hmdc,hBitmap);

GetObject(hBitmap,sizeof(bm),(LPSTR) &bm) ;

BitBlt(hdc,50,50,bm.bmWidth,bm.bmHeight, hmdc, 0,0,SRCCOPY);

DeleteDC(hmdc);

// Конец фрагмента пользователя

ValidateRect(hWnd,NULL);

EndPaint(hWnd,&ps);

break;

case WM_DESTROY:

DeleteObject(hBitmap) ;

PostQuitMessage(0);

break;

default:

return(DefWindowProc(hWnd,messg,wParam, lParam));

}

return(0);

}

В данном примере вызов функции LoadBitmap() (после описания данных функции WinMain()) возвращает идентификатор битового образа. Формат вызова функции совпадает с форматом функций LoadIcon() и LoadCursor(), которые использовались в предыдущих примерах.

Windows может выводить любой битовый образ при вызове функции BitBit(). Однако перед выводом битового образа на экран необходимо создать контекст памяти, совместимый с контекстом отображения устройства вывода, и выбрать битовый образ. Это позволяют сделать следующие четыре строки текста WndProc():

hmdc=CreateCompatibleDC(hdc);

SelectObject(hmdc, hBitmap);

GetObject(hBitmap, sizeof(bm), (LPSTR) &bm) ;

BitBit(hdc, 50, 50, bm.bmWidth, bm.bmHeight, hmdc, 0, 0,

SRCCOPY);

При вызове функции CreateCompatibleDC() создается контекст памяти, совместимый с контекстом отображения устройства вывода. Функция SelectObject() служит для выбора битового образа, идентифицируемого nBitmap, в контекст памяти hmdc.

Вызов третьей функции, GetObject(), возвращает характеристики bm.bmWidth и bm.bmHeight битового образа. Данные характеристики требуются для вызова функции BitBit(). Последняя функция производит копирование битового образа из контекста памяти в совместимый контекст отображения устройства вывода и помещает битовый образ в точку (50, 50). Затем копи­руется весь битовый образ с характеристиками bm.bmWidth и bm.bmHeight.