Создание растрового изображения для панели инструментов

До того как использовать панели инструментов, необходимо сделать иконки, форми­рующие изображения на кнопках панели. Для этого пригодится графический редактор. Процесс сотворения растрового изображения схож в целом процессу рисования иконки (Вы делали это, создавая пользовательские иконки к примерам гл. 6). Но здесь есть и одно существенное отличие: с панелью инструментов может быть Создание растрового изображения для панели инструментов связано только одно растровое изображение, и оно должно содержать все изображения для кнопок. Таким макаром, если панель инструментов должна содер­жать 6 кнопок, то и растр, связанный с ней, должен содержать 6 изображе­ний. К примеру, если изображения кнопок имеют размер 16´16 пикселей и панель инструментов содержит 6 кнопок, то растр, связанный Создание растрового изображения для панели инструментов с этой панелью, обязан иметь высоту 16 и ширину 96 (16´16) пикселей.

Для примеров программ, приведенных в этой главе, нам будет нужно 5 изображений для кнопок. Каждое из их имеет размер 16´16 пикселей. Это значит, что Вам пригодится сделать растровое изображение размером 80´16 пикселей. На рис. 10.1 показано растровое изображение, которое применено в примерах Создание растрового изображения для панели инструментов этой главы в графическом редакторе (4-ое изображение преднамеренно оставлено пус­тым). Панель инструментов употребляется как другое меню для работающей с графикой программки из гл. 9. Вы сможете сделать собственное растровое изображе­ние и сохранить его в файле с именованием Toolbar.bmp.

Рис. 10.1. Панель инструментов в процессе графического

редактирования

Пример Создание растрового изображения для панели инструментов 10-1. Программка работы с панелью инструментов.

Последующий пример представляет собой программку работы с графикой из гл. 9, в которую добавлена панель инструментов, дублирующая команды меню. Используя панель инструментов, Вы сможете отрисовывать полосы, прямоугольники и эллипсы, также стереть изображение в окне и избрать команду Помощь.

// Демонстрация панели инструментов

#include

#include

#include

#include

#include "Tb Создание растрового изображения для панели инструментов.h"

#define NUMBUTTONS 6

void InitToolBar(); // Функция инициализации панели

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

char szWinName[] = "МоеОкно"; // Имя класса окна

int maxX, maxY; // Размеры экрана

HDC memdc; // DC виртуального окна

HBITMAP hbit; // Растр - это виртуальное окно

HBRUSH hbrush, hOldbrush; // Дескрипторы кистей

HPEN hOldpen; // Дескриптор прежнего пера

HPEN hRedpen,hGreenpen,hBluepen,hYellowpen; // Перья

TBBUTTON tbButtons[NUMBUTTONS];

HWND tbwnd; // Дескриптор Создание растрового изображения для панели инструментов панели инструментов

int WINAPI WinMain (HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASS wcl;

HACCEL hAccel;

// Найти класс окна

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по дефлоту

wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Иконка

wcl.hCursor=LoadCursor(NULL Создание растрового изображения для панели инструментов,IDC_ARROW) ; // Курсор

wcl.lpszMenuName="MYMENU"; // Меню

wcl.cbClsExtra=0; // Без дополнительной

wcl.cbWndExtra=0; // инфы

// Найти наполнение окна белоснежным цветом

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH);

if(!RegisterClass(&wcl)) // Зарегистр. класс окна

return 0;

// Сделать окно

hwnd=CreateWindow(szWinName, // Имя класса

"Работа с панелью инструментов Toolbar",

WS_OVERLAPPEDWINDOW,// Стиль окна

CW_USEDEFAULT, // Х-координата

CW_USEDEFAULT, // Y-координата

CW_USEDEFAULT Создание растрового изображения для панели инструментов, // Ширина окна

CW_USEDEFAULT, // Высота окна

HWND_DESKTOP, // Нет родит. окна

NULL, // Нет меню

hThisInst, // Дескрип. приложения

NULL); // Без дополит. аргументов

// Загрузить акселераторы

hAccel=LoadAccelerators(hThisInst,"MYMENU");

InitToolBar(); // Инициализация панели инструментов

InitCommonControls(); // Общие элементы управления

tbwnd=CreateToolbarEx(hwnd,

WS_VISIBLE|WS_CHILD|WS_BORDER,

ID_TOOLBAR, NUMBUTTONS,

hThisInst, IDTB_BMP,

tbButtons,

NUMBUTTONS,

0, 0, 16, 16,

sizeof(TBBUTTON));

ShowWindow(hwnd,nWinMode) ; // Показать окно и

UpdateWindow(hwnd Создание растрового изображения для панели инструментов); // перерисовать содержимое

// Запустить цикл обработки сообщений

while(GetMessage (&msg,NULL,0,0))

if(!TranslateAccelerator(hwnd,hAccel,&msg))

{

TranslateMessage(&msg); // Использ.Клавиатуры

DispatchMessage (&msg); // Возврат к Windows

}

return msg.wParam;

}

// Последующая функция вызывается операционной системой

// Windows и получает в качестве характеристик сообщения

// из очереди сообщений данного приложения

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM Создание растрового изображения для панели инструментов lParam)

{

HDC hdc;

PAINTSTRUCT paintstruct;

switch(message)

{

case WM_CREATE: // Получаем размеры экрана

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

hdc=GetDC(hwnd); // Совмест. с окном растр

memdc=CreateCompatibleDC(hdc);

hbit=CreateCompatibleBitmap(hdc,maxX,maxY);

SelectObject(memdc,hbit);

hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);

SelectObject(memdc,hbrush);

PatBlt(memdc,0,0,maxX,maxY Создание растрового изображения для панели инструментов,PATCOPY);

// Сделать новые перья

hRedpen =CreatePen(PS_SOLID,1,RGB(255,0,0));

hGreenpen=CreatePen(PS_SOLID,1,RGB(0,255,0));

hBluepen =CreatePen(PS_SOLID,1,RGB(0,0,255));

hYellowpen=

CreatePen(PS_SOLID,1,RGB(255,255,0));

hOldpen=(HPEN)SelectObject(memdc,hRedpen);

SelectObject(memdc,hOldpen); // Старенькое перо

ReleaseDC(hwnd,hdc);

break;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case ID_LINES:

// Вывести 2 темных пикселя

SetPixel(memdc,40,14,RGB(0,0,0));

SetPixel Создание растрового изображения для панели инструментов(memdc,40,15,RGB(0,0,0));

// Вывести прямую линию

LineTo(memdc,100,50);

MoveToEx(memdc,100,50,NULL);

// Установить зеленоватое перо

hOldpen=

(HPEN)SelectObject(memdc,hGreenpen);

LineTo(memdc,200,100);

// Установить желтоватое перо

SelectObject(memdc,hYellowpen);

LineTo(memdc,0,200);

// Установить голубое перо

SelectObject(memdc,hBluepen);

LineTo(memdc,200,200);

// Установить красноватое перо

SelectObject(memdc,hRedpen);

LineTo(memdc,0,0);

// Возвратиться к прежнему перу

SelectObject (memdc, hOldpen);

// Провести дугу

Arc(memdc Создание растрового изображения для панели инструментов,0,0,300,300,0,50,200,50);

// Показать полосы, отрезающие дугу

MoveToEx(memdc,150,150,NULL);

LineTo(memdc,0,50);

MoveToEx(memdc,150,150,NULL);

LineTo(memdc,200,50);

InvalidateRect(hwnd,NULL,1);

break;

case ID_RECTANGLES:

// Прямоугольники не заполняются

hOldbrush=(HBRUSH)SelectObject(memdc,

GetStockObject(HOLLOW_BRUSH));

// Рисуем прямоугольники

Rectangle(memdc,50,50,300,300);

RoundRect(memdc,125,125,220,240,15,13);

// Избираем красноватое перо

SelectObject(memdc,hRedpen);

Rectangle(memdc,100,100,200,200);

SelectObject(memdc,hOldpen);

// Возвратиться к прежнему перу

// Вернуть Создание растрового изображения для панели инструментов прежнюю кисть

SelectObject(memdc,hOldbrush);

InvalidateRect(hwnd,NULL,1);

break;

case ID_ELLIPSES:

// Создаем голубую кисть

hbrush=CreateSolidBrush(RGB(0,0,255));

hOldbrush=

(HBRUSH)SelectObject(memdc,hbrush);

// Рисуем эллипсы с голубым наполнением

Ellipse(memdc,50,200,100,280);

Ellipse(memdc,75,25,280,100);

// Рисуем красноватым пером, зеленоватой кистью

SelectObject(memdc,hRedpen);

DeleteObject(hbrush); // Удалить кисть

// Сделать зеленоватую кисть

hbrush=CreateSolidBrush(RGB(0,255,0));

SelectObject(memdc,hbrush);

Ellipse(memdc,100,100,200,200);

// Рисуем Создание растрового изображения для панели инструментов сектор

Pie(memdc,200,200,340,340,225,200,

200,250);

SelectObject(memdc,hOldpen);

// Возвратиться к прежнему перу

SelectObject(memdc,hOldbrush);

// Вернуть прежнюю кисть и удалить

DeleteObject(hbrush); // зеленоватую кисть

InvalidateRect(hwnd,NULL,1);

break;

case ID_RESET:

// Вернуть текущую позицию в 0,0

MoveToEx(memdc,0,0,NULL);

// Стереть изображение с помощью

// перерисовки фона

PatBlt(memdc,0,0,maxX,maxY,PATCOPY);

InvalidateRect(hwnd,NULL,1);

break;

case ID_SHOW Создание растрового изображения для панели инструментов: // Показать панель toolbar

ShowWindow(tbwnd, SW_RESTORE);

break;

case ID_HIDE: // Упрятать панель toolbar

ShowWindow(tbwnd, SW_HIDE);

break;

case ID_HELP:

// Показать кнопку помощи в панели

// инструментов как нажатую

SendMessage(tbwnd, TB_CHECKBUTTON,

(WPARAM)ID_HELP,

(LPARAM)1);

MessageBox(hwnd,

"F2: линии\n"

"FЗ: прямоугольники\n"

"F4: эллипсы\n"

"F5: сброс\n"

"F6: показать Создание растрового изображения для панели инструментов toolbar\n"

"F7: упрятать toolbar\n",

"Работа с графикой",MB_OK);

// Показать кнопку помощи в панели

// инструментов как отжатую

SendMessage(tbwnd, TB_CHECKBUTTON,

(WPARAM)ID_HELP,

(LPARAM)0);

break;

}

break;

case WM_PAINT: // Перерисовка окна

// Получить DC */

hdc=BeginPaint(hwnd,&paintstruct);

// Сейчас копируем растр из памяти на экран

BitBlt(hdc,0,0,maxX,maxY,memdc Создание растрового изображения для панели инструментов,0,0,SRCCOPY);

// Высвободить DC

EndPaint(hwnd,&paintstruct);

break;

case WM_DESTROY: // Окончание программки

// Удалить сделанные перья

DeleteObject(hRedpen);

DeleteObject(hGreenpen);

DeleteObject(hBluepen);

DeleteObject(hYellowpen);

DeleteDC(memdc); // Удалить виртуальное окно

PostQuitMessage(0);

break;

default:

// Все сообщения, не обрабатываемые в данной

// функции, направляются на обработку по

// умолчанию

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}

// Инициализация структур панели инструментов

void InitToolBar()

{

tbButtons[0].iBitmap Создание растрового изображения для панели инструментов=0;

tbButtons[0].idCommand=ID_LINES;

tbButtons[0].fsState=TBSTATE_ENABLED;

tbButtons[0].fsStyle=TBSTYLE_BUTTON;

tbButtons[0].dwData=0L;

tbButtons[0].iString=0;

tbButtons[1].iBitmap=1;

tbButtons[1].idCommand=ID_RECTANGLES;

tbButtons[1].fsState=TBSTATE_ENABLED;

tbButtons[1].fsStyle=TBSTYLE_BUTTON;

tbButtons[1].dwData=0L;

tbButtons[1].iString=0;

tbButtons[2].iBitmap=2 ;

tbButtons[2].idCommand=ID_ELLIPSES;

tbButtons[2].fsState=TBSTATE_ENABLED;

tbButtons[2].fsStyle=TBSTYLE_BUTTON Создание растрового изображения для панели инструментов;

tbButtons[2].dwData=0L;

tbButtons[2].iString=0;

tbButtons[3].iBitmap=3;

tbButtons[3].idCommand=ID_RESET;

tbButtons[3].fsState=TBSTATE_ENABLED;

tbButtons[3].fsStyle=TBSTYLE_BUTTON;

tbButtons[3].dwData=0L;

tbButtons[3].iString=0;

// Разделитель кнопок

tbButtons[4].iBitmap=0;

tbButtons[4].idCommand= 0;

tbButtons[4].fsState=TBSTATE_ENABLED;

tbButtons[4].fsStyle=TBSTYLE_SEP;

tbButtons[4].dwData=0L;

tbButtons[4].iString=0;

tbButtons[5].iBitmap=4;

tbButtons[5].idCommand=ID_HELP;

tbButtons Создание растрового изображения для панели инструментов[5].fsState=TBSTATE_ENABLED;

tbButtons[5].fsStyle=TBSTYLE_BUTTON;

tbButtons[5].dwData=0L;

tbButtons[5].iString=0;

}

Для этой программки пригодится последующий файл ресурсов Mydialog.rc:

#include

#include "Tb.h"

IDTB_BMP BITMAP "Toolbar.bmp"

MYMENU MENU

{

POPUP "&Нарисовать"

{

MENUITEM "&Полосы", ID_LINES

MENUITEM "&Прямоугольники", ID_RECTANGLES

MENUITEM "&Эллипсы", ID_ELLIPSES

}

POPUP "&Различное"

{

MENUITEM "&C Создание растрового изображения для панели инструментов6pос", ID_RESET

MENUITEM "&Показать Toolbar", ID_SHOW

MENUITEM "&Упрятать Toolbar", ID_HIDE

}

MENUITEM "Помощь", ID_HELP

}

MYMENU ACCELERATORS

{

VK_F2, ID_LINES, VIRTKEY

VK_F3, ID_RECTANGLES, VIRTKEY

VK_F4, ID_ELLIPSES, VIRTKEY

VK_F5, ID_RESET, VIRTKEY

VK_F6, ID_SHOW, VIRTKEY

VK_F7, ID_HIDE, VIRTKEY

VK_F1, ID_HELP, VIRTKEY

}

И, в конце концов, будет нужно файл Tb.h:

#define Создание растрового изображения для панели инструментов ID_LINES 100

#define ID_RECTANGLES 101

#define ID_ELLIPSES 102

#define ID_SHOW 103

#define ID_HIDE 104

#define ID_RESET 105

#define ID_HELP 106

#define ID_TOOLBAR 200

#define IDTB_BMP 300

Большая часть этой программки Вам уже знакома. Приведем куцее описание остальной ее части. Вся информация, относящаяся к панели инструментов, хранится в массиве tbButtons Создание растрового изображения для панели инструментов. Инициализацию этого массива делает функция InitToolBar(). Заметьте, что структура ID_HIDE определяет просвет меж клавишами. В функ­ции WinMain() вызывается функция инициализации общих частей управления InitCommonControls(). После чего создается панель инструментов и ее дескриптор сохраняется в переменной tbwnd.

Любая кнопка панели инструментов соответствует определенной команде меню. Потому Создание растрового изображения для панели инструментов при нажатии таковой кнопки соответственная команда будет передана программке в параметрах сообщения WM_COMMAND точно так же, как если б была выбрана команда меню. Практически эти сообщения обрабатываются в одних и тех же операторах case.

Так как панель инструментов является окном, она может быть укрыта либо отображена, как и хоть какое Создание растрового изображения для панели инструментов другое окно, с помощью функции ShowWindow(). Панель инструментов может быть спрятана по команде Упрятать Toolbar в меню Функции. Чтоб она потом вновь появилась, в том же меню необходимо избрать команду Показать Toolbar. Так как панель инструментов уменьшает размер рабочей области окна, всегда следует предоставлять юзеру возможность убирать ее с Создание растрового изображения для панели инструментов экрана. Как видно из программки, делается это довольно легко.

В конце концов, направьте внимание на кусок программки, обрабатывающий команду ID_HELP. При выборе команды Помощь (в меню либо нажатием соответственной кнопки панели инструментов) кнопка помощи в панели инструментов нажимается вручную с помощью посылки сообщения TB_CHECKBUTTON. Когда же пользо­ватель закрывает окно сообщения Создание растрового изображения для панели инструментов со справочной информацией, кнопка вручную освобождается. Таким макаром, кнопка помощи остается нажатой всегда, пока окно сообщения находится на дисплее. Это пример того, как из программки можно управлять панелью инструментов. Пример окна, создаваемого этой программкой, показан на рис. 10.2.

Рис. 10.2. Окно диалога с панелью инструментов

Включение подсказок

Работая с Windows, Вы, возможно Создание растрового изображения для панели инструментов, увидели, что при задержке указателя мыши на несколько секунд на кнопках неких панелей инструментов автоматом возникают маленькие текстовые окошки, содержащие короткое описание назначе­ния кнопок. Они именуются подсказками (tooltips). И хотя это и не является неотклонимым, лучше все-же иметь такие подсказки, так как многим пользова­телям Создание растрового изображения для панели инструментов они помогают ориентироваться посреди огромного количества кнопок. В этом разделе будет поведано, как это делается.

Для включения подсказок при разработке панели инструментов следует задать стиль TBSTYLE_TOOLTIPS. Это разрешает посылку сообщения WM_NOTIFY при нахождении указателя мыши над кнопкой панели инструментов в течение более чем одной секунды. В сообщении WM_NOTIFY Создание растрового изображения для панели инструментов параметр lParam содержит указатель на структуру TOOLTIPTEXT, которая определяется последующим образом:

typedef struct

{

NMHDR hdr;

LPSTR lpszText;

char szText[80];

HINSTANCE hinst;

UINT uFlags;

}

TOOLTIPTEXT;

Первым полем структуры TOOLTIPTEXT является структура NMHDR:

typedef struct tagNMHDR

{

HWND hwndFrom; // Дескриптор элемента управления

UINT idFrom; // Идентификатор элемента управления

UINT code; // Код, передаваемый в сообщении

}

NMHDR;

Если запрашивается подсказка Создание растрового изображения для панели инструментов, то поле code будет содержать TTN_NEEDTEXT, a поле idFrom – идентификатор кнопки, для которой требуется подсказка. Текст подсказки можно задать одним из 3-х методов: скопировать текст в поле szText структуры TOOLTIPTEXT, или записать в поле lpszText указатель на текстовую строчку, или, в конце концов, задать идентификатор ресурса строчки Создание растрового изображения для панели инструментов. В последнем случае идентификатор строчки записывается в поле lpszText, а поле hinst содержит дескриптор приложения, содержащего ресурс. Естественно, простой метод – это записать в lpszText указатель на строчку, определенную в программке. Последующий кусок обрабатывает запросы подсказок в нашей программке вывода графики:

LPTOOLTIPTEXT TTtext;

//...

case WM_NOTIFY: // Обработка запроса от подсказки

TTtext=(LPTOOLTIPTEXT Создание растрового изображения для панели инструментов)lParam;

if(TTtext->hdr.code == TTN_NEEDTEXT)

{

switch( TTtext->hdr.idFrom )

{

case ID_LINES:

TTtext->lpszText="Полосы";

break;

case ID_RECTANGLES:

TTtext->lpszText="Прямоугольники";

break;

case ID_ELLIPSES:

TTtext->lpszText="Эллипсы";

break;

case ID_RESET:

TTtext->lpszText="Сброс";

break;

case ID_HELP:

TTtext->lpszText="Помощь";

break;

}

break;

После того Создание растрового изображения для панели инструментов как текст подсказки определен, подсказка отображается автоматичес­ки при возврате управления к Windows, и программке больше не надо делать никаких действий. Видите ли, подсказки отлично автоматизированы и ординарны в использовании.

Пример 10-2. Программка сотворения Toolbar с подсказками.

В этом разделе приводится полный текст программки сотворения панели инструментов и подсказок Создание растрового изображения для панели инструментов. В ней употребляются те же файлы ресурсов и определений, что и в предшествующей версии программки.

// Демонстрация панели инструментов с подсказками

#include

#include

#include

#include

#include "Tb.h"

#define NUMBUTTONS 6

void InitToolBar(); // Функция инициализации панели

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

char szWinName[] = "МоеОкно"; // Имя класса окна

int maxX, maxY; // Размеры Создание растрового изображения для панели инструментов экрана

HDC memdc; // DC виртуального окна

HBITMAP hbit; // Растр - это виртуальное окно

HBRUSH hbrush, hOldbrush; // Дескрипторы кистей

HPEN hOldpen; // Дескриптор прежнего пера

HPEN hRedpen,hGreenpen,hBluepen,hYellowpen; // Перья

TBBUTTON tbButtons[NUMBUTTONS];

HWND tbwnd; // Дескриптор панели инструментов

int WINAPI WinMain (HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASS wcl;

HACCEL hAccel;

// Найти Создание растрового изображения для панели инструментов класс окна

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по дефлоту

wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Иконка

wcl.hCursor=LoadCursor(NULL,IDC_ARROW) ; // Курсор

wcl.lpszMenuName="MYMENU"; // Меню

wcl.cbClsExtra=0; // Без дополнительной

wcl.cbWndExtra=0; // инфы

// Найти наполнение окна белоснежным цветом

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH);

if(!RegisterClass(&wcl)) // Зарегистр Создание растрового изображения для панели инструментов. класс окна

return 0;

// Сделать окно

hwnd=CreateWindow(szWinName, // Имя класса

"Работа с Toolbar с подсказками",

WS_OVERLAPPEDWINDOW,// Стиль окна

CW_USEDEFAULT, // Х-координата

CW_USEDEFAULT, // Y-координата

CW_USEDEFAULT, // Ширина окна

CW_USEDEFAULT, // Высота окна

HWND_DESKTOP, // Нет родит. окна

NULL, // Нет меню

hThisInst, // Дескрип. приложения

NULL); // Без дополит. аргументов

// Загрузить акселераторы

hAccel=LoadAccelerators(hThisInst,"MYMENU");

InitToolBar(); // Инициализация панели Создание растрового изображения для панели инструментов инструментов

InitCommonControls(); // Общие элементы управления

tbwnd=CreateToolbarEx(hwnd,

WS_VISIBLE|WS_CHILD|WS_BORDER|

TBSTYLE_TOOLTIPS,

ID_TOOLBAR,

NUMBUTTONS, hThisInst,

IDTB_BMP, tbButtons,

NUMBUTTONS,

0, 0, 16, 16,

sizeof(TBBUTTON));

ShowWindow(hwnd,nWinMode) ; // Показать окно и

UpdateWindow(hwnd); // перерисовать содержимое

// Запустить цикл обработки сообщений

while(GetMessage (&msg,NULL,0,0))

if(!TranslateAccelerator(hwnd,hAccel,&msg))

{

TranslateMessage(&msg); // Использ.Клавиатуры

DispatchMessage (&msg); // Возврат к Windows

}

return Создание растрового изображения для панели инструментов msg.wParam;

}

// Последующая функция вызывается операционной системой

// Windows и получает в качестве характеристик сообщения

// из очереди сообщений данного приложения

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT paintstruct;

LPTOOLTIPTEXT TTtext;

switch(message)

{

case WM_CREATE: // Получаем размеры экрана

maxX=GetSystemMetrics(SM_CXSCREEN);

maxY=GetSystemMetrics(SM_CYSCREEN);

hdc Создание растрового изображения для панели инструментов=GetDC(hwnd); // Совмест. с окном растр

memdc=CreateCompatibleDC(hdc);

hbit=CreateCompatibleBitmap(hdc,maxX,maxY);

SelectObject(memdc,hbit);

hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);

SelectObject(memdc,hbrush);

PatBlt(memdc,0,0,maxX,maxY,PATCOPY);

// Сделать новые перья

hRedpen =CreatePen(PS_SOLID,1,RGB(255,0,0));

hGreenpen=CreatePen(PS_SOLID,1,RGB(0,255,0));

hBluepen =CreatePen(PS_SOLID,1,RGB(0,0,255));

hYellowpen Создание растрового изображения для панели инструментов=

CreatePen(PS_SOLID,1,RGB(255,255,0));

hOldpen=(HPEN)SelectObject(memdc,hRedpen);

SelectObject(memdc,hOldpen); // Старенькое перо

ReleaseDC(hwnd,hdc);

break;

case WM_NOTIFY: // Обработка запросов подсказок

TTtext=(LPTOOLTIPTEXT)lParam;

if(TTtext->hdr.code == TTN_NEEDTEXT)

{

switch(TTtext->hdr.idFrom)

{

case ID_LINES:

TTtext->lpszText="Полосы";

break;

case ID_RECTANGLES:

TTtext->lpszText="Прямоугольники";

break;

case Создание растрового изображения для панели инструментов ID_ELLIPSES:

TTtext->lpszText="Эллипсы";

break;

case ID_RESET:

TTtext->lpszText="Сброс";

break;

case ID_HELP:

TTtext->lpszText="Помощь";

break;

}

}

break;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case ID_LINES:

// Вывести 2 темных пикселя

SetPixel(memdc,40,14,RGB(0,0,0));

SetPixel(memdc,40,15,RGB(0,0,0));

// Вывести прямую линию

LineTo(memdc,100,50);

MoveToEx(memdc,100,50,NULL);

// Установить зеленоватое перо

hOldpen=

(HPEN)SelectObject Создание растрового изображения для панели инструментов(memdc,hGreenpen);

LineTo(memdc,200,100);

// Установить желтоватое перо

SelectObject(memdc,hYellowpen);

LineTo(memdc,0,200);

// Установить голубое перо

SelectObject(memdc,hBluepen);

LineTo(memdc,200,200);

// Установить красноватое перо

SelectObject(memdc,hRedpen);

LineTo(memdc,0,0);

// Возвратиться к прежнему перу

SelectObject (memdc, hOldpen);

// Провести дугу

Arc(memdc,0,0,300,300,0,50,200,50);

// Показать полосы, отрезающие дугу

MoveToEx(memdc,150,150,NULL);

LineTo(memdc,0,50);

MoveToEx(memdc,150,150,NULL);

LineTo(memdc,200,50);

InvalidateRect(hwnd Создание растрового изображения для панели инструментов,NULL,1);

break;

case ID_RECTANGLES:

// Прямоугольники не заполняются

hOldbrush=(HBRUSH)SelectObject(memdc,

GetStockObject(HOLLOW_BRUSH));

// Рисуем прямоугольники

Rectangle(memdc,50,50,300,300);

RoundRect(memdc,125,125,220,240,15,13);

// Избираем красноватое перо

SelectObject(memdc,hRedpen);

Rectangle(memdc,100,100,200,200);

SelectObject(memdc,hOldpen);

// Возвратиться к прежнему перу

// Вернуть прежнюю кисть

SelectObject(memdc,hOldbrush);

InvalidateRect(hwnd,NULL,1);

break;

case ID_ELLIPSES:

// Создаем голубую кисть

hbrush Создание растрового изображения для панели инструментов=CreateSolidBrush(RGB(0,0,255));

hOldbrush=

(HBRUSH)SelectObject(memdc,hbrush);

// Рисуем эллипсы с голубым наполнением

Ellipse(memdc,50,200,100,280);

Ellipse(memdc,75,25,280,100);

// Рисуем красноватым пером, зеленоватой кистью

SelectObject(memdc,hRedpen);

DeleteObject(hbrush); // Удалить кисть

// Сделать зеленоватую кисть

hbrush=CreateSolidBrush(RGB(0,255,0));

SelectObject(memdc,hbrush);

Ellipse(memdc,100,100,200,200);

// Рисуем сектор

Pie(memdc,200,200,340,340,225,200,

200,250);

SelectObject(memdc,hOldpen);

// Возвратиться к прежнему перу

SelectObject(memdc,hOldbrush);

// Вернуть Создание растрового изображения для панели инструментов прежнюю кисть и удалить

DeleteObject(hbrush); // зеленоватую кисть

InvalidateRect(hwnd,NULL,1);

break;

case ID_RESET:

// Вернуть текущую позицию в 0,0

MoveToEx(memdc,0,0,NULL);

// Стереть изображение с помощью

// перерисовки фона

PatBlt(memdc,0,0,maxX,maxY,PATCOPY);

InvalidateRect(hwnd,NULL,1);

break;

case ID_SHOW: // Показать панель toolbar

ShowWindow(tbwnd, SW_RESTORE);

break;

case ID_HIDE: // Упрятать панель toolbar

ShowWindow Создание растрового изображения для панели инструментов(tbwnd, SW_HIDE);

break;

case ID_HELP:

// Показать кнопку помощи в панели

// инструментов как нажатую

SendMessage(tbwnd, TB_CHECKBUTTON,

(WPARAM)ID_HELP,

(LPARAM)1);

MessageBox(hwnd,

"F2: линии\n"

"FЗ: прямоугольники\n"

"F4: эллипсы\n"

"F5: сброс\n"

"F6: показать Toolbar\n"

"F7: упрятать Toolbar\n",

"Работа с графикой",MB_OK);

// Показать кнопку помощи в Создание растрового изображения для панели инструментов панели

// инструментов как отжатую

SendMessage(tbwnd, TB_CHECKBUTTON,

(WPARAM)ID_HELP,

(LPARAM)0);

break;

}

break;

case WM_PAINT: // Перерисовка окна

// Получить DC */

hdc=BeginPaint(hwnd,&paintstruct);

// Сейчас копируем растр из памяти на экран

BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);

// Высвободить DC

EndPaint(hwnd,&paintstruct);

break;

case WM_DESTROY: // Окончание программки

// Удалить сделанные перья

DeleteObject(hRedpen Создание растрового изображения для панели инструментов);

DeleteObject(hGreenpen);

DeleteObject(hBluepen);

DeleteObject(hYellowpen);

DeleteDC(memdc); // Удалить виртуальное окно

PostQuitMessage(0);

break;

default:

// Все сообщения, не обрабатываемые в данной

// функции, направляются на обработку по

// умолчанию

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}

// Инициализация структур панели инструментов

void InitToolBar()

{

tbButtons[0].iBitmap=0;

tbButtons[0].idCommand=ID_LINES;

tbButtons[0].fsState=TBSTATE_ENABLED;

tbButtons[0].fsStyle=TBSTYLE_BUTTON Создание растрового изображения для панели инструментов;

tbButtons[0].dwData=0L;

tbButtons[0].iString=0;

tbButtons[1].iBitmap=1;

tbButtons[1].idCommand=ID_RECTANGLES;

tbButtons[1].fsState=TBSTATE_ENABLED;

tbButtons[1].fsStyle=TBSTYLE_BUTTON;

tbButtons[1].dwData=0L;

tbButtons[1].iString=0;

tbButtons[2].iBitmap=2 ;

tbButtons[2].idCommand=ID_ELLIPSES;

tbButtons[2].fsState=TBSTATE_ENABLED;

tbButtons[2].fsStyle=TBSTYLE_BUTTON;

tbButtons[2].dwData=0L;

tbButtons[2].iString=0;

tbButtons[3].iBitmap=3;

tbButtons[3].idCommand=ID_RESET;

tbButtons[3].fsState=TBSTATE Создание растрового изображения для панели инструментов_ENABLED;

tbButtons[3].fsStyle=TBSTYLE_BUTTON;

tbButtons[3].dwData=0L;

tbButtons[3].iString=0;

// Разделитель кнопок

tbButtons[4].iBitmap=0;

tbButtons[4].idCommand= 0;

tbButtons[4].fsState=TBSTATE_ENABLED;

tbButtons[4].fsStyle=TBSTYLE_SEP;

tbButtons[4].dwData=0L;

tbButtons[4].iString=0;

tbButtons[5].iBitmap=4;

tbButtons[5].idCommand=ID_HELP;

tbButtons[5].fsState=TBSTATE_ENABLED;

tbButtons[5].fsStyle=TBSTYLE_BUTTON;

tbButtons[5].dwData=0L;

tbButtons[5].iString=0;

}

Пример Создание растрового изображения для панели инструментов окна таковой программки показан на рис. 10.3.

В последующей главе речь вновь пойдет об общих элементах управления, поддер­живаемых в Windows: мы разглядим спин (up-down control, spin control), ползунок (track bar) и индикатор (progress bar).


Рис. 10.3. Диалог с панелью инструментов и подсказками


sozdanie-opc-servera-dlya-svyazi-apparatnih-modu-lej-s-kanalami-uzlov-proekta-v-scada-sisteme.html
sozdanie-otcheta-v-rezhime-konstruktora.html
sozdanie-otchyotov-vivod-informacii-iz-bazi-dannih.html