Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 128

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 204 >> Следующая

Изменение формы указателя
Изменим программу так, чтобы форма указателя изменялась на крестообразную внутри области рисунка (это означает, что линию можно рисовать) и восстанавливалась в прежнем виде вне области рисунка (линия не может быть нарисована). Добавьте переменную m_HArrow в определение класса CMiniDrawView в файле Mini Draw View. h.
class CMiniDrawView : public CScrollView
{
protected:
CString m__ClassName; int m_Dragging; HCURSOR m_HArrow;
HCURSOR m_HCross; CPoint m_Point01d; CPoint m_PointOrigin;
// остальная часть определения класса CMiniDrawView ...
}
Инициализируйте переменную m_HArrow внутри конструктора класса CMiniDrawView в файле MiniDrawView.cpp следующим образом.
/////////////////////////////////////////////////////////////// // Конструктор/деструктор класса CMiniDrawView
CMiniDrawView::CMiniDrawView {)
// ТСЮО: Здесь добавьте код конструктора т_Огаддхпд = 0;
т_НАгго1г = А?х(Зе'ЬАрр () ->Ьоас18Ъапс1агс1Сигвог (:ГОС_А1ЖО№) ;
т_НСгозз = А?хСеЪАрр () ->Ьоас^апс1агс1Сигзог (ЮС_СК033);
}
Здесь переменной т_НАггоы присваивается дескриптор стандартного указателя мыши в форме стрелки.
Рисунок меньше окна представления:
\ і Игііііісгі МіпіОіли

^ИІіаІіШіІІв^РШ ¦*
ь $л»1* а- г"- &• »—¦ ) і \ і і
-*]
«1 ШШх.
Указатель ограничен частью окна представления с рисунком
Рисунок больше окна представления:1
К* ЧШШ - НШчт ШШ О
Рисунок
Указатель ограничен частью рисунка в окне представления
Рис. 13.5. Область перемещения указателя в случаях, когда рисунок меньше окна представления и больше него (область пересечения окна представления и рисунка затенена)
Затем в функции OnMouseMove в файле Mini Draw View, срр переместите объявление объекта ClientDC и вызовы методов OnPrepareDC и DPtoLP в начало функции и добавьте строки, отмеченные полужирным шрифтом:
void CMiniDrawView::OnMouseMove(UINT nFlags, CPoint point) {
// TODO: Здесь добавьте собственный код обработчика
// и/или вызов стандартного обработчика
CClientDC ClientDC (this); OnPrepareDC (SClientDC); ClientDC.DPtoLP (Spoint);
CSize ScrollSize « GetTotalSize ();
CRect ScrollRect (0, 0, ScrollSize.cx, ScrollSize.cy); if (ScrollRect.PtlnRect (point))
::SetCursor (m_HCross); else
::SetCursor (m_HArrow);
if (m_Dragging) (
ClientDC.SetROP2 (R2_NOT); ClientDC.MoveTo (m_PointOrigin) ; ClientDC.LineTo (m_Point01d) ; ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (point); m_Point01d = point; )
CScrollView::OnMouseMove(nFlags, point);
)
Вместо постоянного отображения крестообразного указателя обработчик OnMouseMove показывает его только внутри области рисунка (ScrollRect) и отображает указатель-стрелку, когда указатель находится вне этой области.
На рис. 13.6 проиллюстрирована работа программы MiniDraw в случае, когда рисунок меньше окна представления, и показаны линии, обозначающие границы рисунка. Обратите внимание: рисунок полностью помещается внутри окна представления, поэтому MFC скрывает полосы прокрутки. Они появятся вновь, если размер окна уменьшить таким образом, чтобы рисунок не помещался внутри него.
Перед изучением следующего параграфа можете построить и выполнить программу MiniDraw, чтобы проверить работу новых добавленных функций.
Рис. 13.6. Программа MiniDraw с рисунком, помещающимся в окне представления
Добавление
средств разделения окна_
В этом параграфе к окну программы MiniDraw будет добавлена вешка разбивки, позволяющая разделить окно представления на два отдельных, называемых также панелями. Границу между двумя панелями называют линией разбивки. Два окна представления отображают один рисунок, а прокручиваются независимо друг от друга, отображая различные его части. Чтобы разделить окно, выполните двойной щелчок на вешке разбивки (чтобы разделить окно на две равные панели) или перетащите линию разбивки в требуемую позицию. Когда окно разделено на два, вертикальная полоса прокрутки является для них общей, однако каждая панель имеет собственную горизонтальную полосу прокрутки. В горизонтальном направлении панели прокручиваются независимо друг от друга (рис. 13.7).
Чтобы добавить в программу средства разделения, измените класс главного окна. Добавьте объявление объекта mSplitterWnd в начало определения класса CMainFrame в файле MainFrm.h.
class CMainFrame : public CFrameWnd {
protected: CSplitterWnd m_SplitterWnd;
protected: // используются при сериализации CMainFrame();
DECLARE DYNCREATE{CMainFrame)
// остальная часть определения класса CMainFrame
Перед разделением окна:
., І1пШІе<і МішПіаи
0» Е* И*
Вешка разбивки
Сразу после разделения окна:
?(* ?Л Нф
Линия разбивки
После прокрутки правой панели:
Рис. 13.7. Программа МтЮгет перед разделением окна представления, непосредственно после разделения и после прокрутки правой панели в горизонтальном направлении
Новый объект m_SplitterWnd — это экземпляр MFC-класса CSplitterWnd, порожденного от класса CWnd. Он служит для создания и управления разделенным окном.
Следующий шаг состоит в переопределении виртуальной функции OnCreateClient как функции-члена класса CMainFrame. Используйте мастер ClassWizard для создания минимального определения функции. В диалоговом окне мастера откройте вкладку Message Map, выберите класс CMainFrame в списках Class Name и Object Ids, а затем задайте виртуальную функцию OnCreateClient в списке Messages. После добавления функции и щелчка на кнопке Edit Code измените сгенерированную функцию, удалив вызов метода CFrameWnd: : OnCreateClient и добавив выделенные строки.
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100