А И Легалов - Применение Windows API
Название: | Применение Windows API | |
Автор: | А И Легалов | |
Жанр: | Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Windows, Программирование: прочее, Windows API | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | 2002 | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Применение Windows API"
Аннотация к этой книге отсутствует.
Читаем онлайн "Применение Windows API". [Страница - 27]
В заключение. Вы можете загрузить исходный текст примера, который иллюстрирует применение этих методов.
Далее: Создание разделителя окон (сплиттера).
(обратно)
Как разделить окно на части
Разделительная полоска (сплиттер)
Перевод А. И. ЛегаловаАнглоязычный оригинал находится на сервере компании Reliable Software
Разделительная полоска — полезный элемент, который не входит в состав элементову правления Windows. Насколько трудной его реализовать? Не столь трудно, как это кажется, если Вы знаете хотя бы основы Windows API. Представленное описание может в начале показаться сложным, но вы изучите несколько очень важных методов, которые могут многократно использоваться в различных местах. Работа с дочерними окнами, сбор данных от мыши, рисование с использованием xor (исключающего или) режима — вот только некоторые из них.
Сплиттер — это окно. Точнее — это дочернее окно. Оно позиционировано между двумя другими дочерними окнами — мы назовем их левым и правым подокном, соответственно (или верхним и нижним для горизонтального расщепителя). Должно также быть основное окно, явялющееся родителем для трех дочерних.
Без дальнейшей суеты приведем код WinMain, который осуществляет начальные установки.
// Create top window class
TopWinClassMaker topWinClass(WndProcMain, ID_MAIN, hInst, ID_MAIN);
topWinClass.Register();
// Create child pane classes
WinClassMaker paneClass(WndProcPane, IDC_PANE, hInst);
paneClass.SetSysCursor(IDC_IBEAM);
paneClass.SetDblClicks();
paneClass.Register();
Splitter::RegisterClass(hInst);
// Create top window
ResString caption(hInst, ID_CAPTION);
TopWinMaker topWin(caption, ID_MAIN, hInst);
topWin.Create();
topWin.Show(cmdShow);
В начале мы регистрируем классы. Верхний оконный класс связан с его оконной процедурой WndProcMain, которую мы рассмотрим через мгновение. Два дочерних подокна совместно используют тот же самый класс окна, связанный с WndProcPane. Затем регистрируется наш собственный класс сплиттера (мы скоро увидем его код). В заключение, создается и отображается верхнее окно. Дочерние окна создаются динамически во время инициализации родительского окна.
Приведем оконную процедуру верхнего окна.
LRESULT CALLBACK WndProcMain(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
Controller* pCtrl = GetWinLong<Controller *>(hwnd);
switch (message) {
case WM_CREATE:
try {
pCtrl = new Controller(hwnd, reinterpret_cast<CREATESTRUCT *>(lParam));
SetWinLong<Controller*>(hwnd, pCtrl);
} catch (char const* msg) {
MessageBox(hwnd, msg, "Initialization", MB_ICONEXCLAMATION | MB_OK);
return -1;
} catch (...) {
MessageBox(hwnd, "Unknown Error", "Initialization", MB_ICONEXCLAMATION | MB_OK);
return -1;
}
return 0;
case WM_SIZE:
pCtrl->Size(LOWORD(lParam), HIWORD(lParam));
return 0;
case MSG_MOVESPLITTER:
pCtrl->MoveSplitter(wParam);
return 0;
case WM_DESTROY:
SetWinLong<Controller*>(hwnd, 0);
delete pCtrl;
return 0;
}
return ::DefWindowProc(hwnd, message, wParam, lParam);
}
Имеем обычную оконную процедуру за исключением одного сообщения: MSG_MOVESPLITTER. Это — наше собственное, определяемое пользователем сообщение, которое послано сплиттером его родительскому окну. Но сначала давайте взглянем на контроллер главного окна.
class Controller {
public:
Controller(HWND hwnd, CREATESTRUCT* pCreat);
~Controller();
void Size(int cx, int cy);
void MoveSplitter(int x);
private:
enum { splitWidth = 8 }; // width of splitter
// User Interface
HWnd _hwnd;
//Main controller window
HWnd _leftWin;
HWnd _rightWin;
HWnd _splitter;
int _splitRatio; // in per cent
int _cx;
int _cy;
};
Контроллер содержит дескриптор своего окна, двух дочерних подокон, и окна сплиттера. Он также сохраняет текущий коэффициент разбиения, в процентах.
Конструктор контроллера отвечает за создание дочерних окон.
Controller::Controller(HWND hwnd, CREATESTRUCT * pCreat) : _hwnd (hwnd), _leftWin (0), _rightWin (0), _splitter (0), _splitRatio (50) {
// Create child windows
{
ChildWinMaker leftWinMaker(IDC_PANE, _hwnd, ID_LEFT_WINDOW);
leftWinMaker.Create();
_leftWin.Init(leftWinMaker);
leftWinMaker.Show();
}
{
ChildWinMaker rightWinMaker(IDC_PANE, _hwnd, ID_RIGHT_WINDOW);
rightWinMaker.Create();
_rightWin.Init(rightWinMaker);
rightWinMaker.Show();
}
Splitter::MakeWindow(_splitter, _hwnd, ID_SPLITTER);
}
--">Книги схожие с «Применение Windows API» по жанру, серии, автору или названию:
В. В. Штыков - Fortran & Win32 API. Создание программного интерфейса для Windows средствами современного Фортрана Жанр: Учебники и самоучители по компьютеру Год издания: 2000 |
Елена Геннадьевна Васнецова - Полная энциклопедия домашнего хозяйства Жанр: Современные российские издания Год издания: 2012 |
Брайан Уорд - Внутреннее устройство Linux Жанр: Современные российские издания Год издания: 2015 |