Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АОПИ. Старое / Щупак Ю. А. Win32 API. Эффективная разработка приложений

.pdf
Скачиваний:
443
Добавлен:
10.09.2019
Размер:
49.57 Mб
Скачать

Примеры

программ

153

• •

doc.UpdateHscroll(hWnd,

xlnc):

 

 

 

break:

 

 

 

 

 

 

 

 

 

case

WM_PAINT:

 

&ps):

 

 

 

 

 

hDC =

BeginPaint(hWnd,

 

 

 

 

 

doc.PutText(hWnd, hDC):

 

 

 

 

 

 

 

EndPaint(hWnd, &ps):

 

 

 

 

 

 

 

 

break:

 

 

 

 

 

 

 

 

 

case

WM

DESTROY:

 

 

 

 

 

 

 

 

PostQuitMessage(O):

 

 

 

 

 

 

 

 

break:

 

 

 

 

 

 

 

 

 

default:

 

DefWindowProc(hWnd. uMsg, wParam, lParam):

 

return

 

}

 

 

 

 

 

 

 

 

 

 

 

return О:

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

II///I///////////I///I/I/II//////I//////////////I/////I/I/////////////

Обратите

внимание на следующие особенности реализации класса KDocument:

Для хранения текстового

документа используется член класса Lines, который

объявлен

как вектор строк типа string.

 

 

В методе

Open заданный

входной файл читается по строкам. Предполагается,

что строки

разделяются

символом \n. Каждая прочитанная строка добавляет­

ся в конец

вектора Lines.

Затем

в цикле for вычисляется максимальная длина

строки LineLenMax с учетом

возможного присутствия символов табуляции. При­

сутствие символа табуляции в

строке Lines[i] проверяется методом find класса

string,

который возвращает позицию обнаруженного символа \t или значение

-1, если символ табуляции

не

обнаружен. В

методе

ScroLLSettings величина

LineLenMax используется для

установки максимального

значения диапазона го­

ризонтальной полосы прокрутки.

 

 

В методе InitiaLize вычисляются

размеры «единиц данных» для скроллинга. Ве­

личина cxChar задает шаг изменения в горизонтальном

измерении, а величина

yStep -

шаг изменения в

вертикальном измерении. Для вычислений исполь­

зуются метрики текста, полученные в параметре tm.

 

Метод ScroLLSettings предназначен для установки параметров вертикальной и

горизонтальной полос прокрутки при заданных ширине width и высоте height

клиентской области окна.

 

 

 

 

 

 

 

Метод UpdateVscroLL выполняет

итоговую обработку всех сообщений от верти­

кальной полосы прокрутки.

В

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

окна при

помощи функции ScroLLWindow, обновление положения движка с по­

мощью SetScroШnfo и обновление клиентской

области

при помощи функции

UpdateWindow. Более подробные

комментарии

по этому этапу можно найти

в разделе

«Полосы прокрутки

и

вывод текста».

 

Обратите особое внимание

на

первые две инструкции в теле функции. Они

предваряются комментариями

«ограничение на положительное приращение»

и «ограничение на отрицательное приращение». Первая инструкция обеспе-

Примеры

программ

int int for

xMin

= tMin

*

nPixPerMs;

 

хМах

= tMax

*

nPixPerMs:

{

(i nt

i = О:

i

< 9: ++i)

у= u * nPixPerVolt:

NULL):

MoveToEx(hdc.

xMin. у,

LineTo(hdc.

хМах. у):

у+8. yMark[iJ.

TextOut(hdc.

 

xMin-40.

u += uGridStep:

 

strlen(yMark[i])):

int int int for

 

t =

tMin:

 

*

nPixPerVolt:

 

 

yMin

=

uMin

 

 

уМах

= uMax

*

nPixPerVolt:

 

 

(i = О:

i

<

9;

++i) {

 

 

х

= t

*

nPixPerMs:

NULL);

MoveToEx(hdc,

х. yMin.

LineTo(hdc.

х.

уМах);

 

xMark[iJ.

TextOut(hdc.

х-6. yMin-10.

t

+=

tGridStep:

 

 

 

strlen(xMark[i]));

// Ось

"х"

 

CreatePen(PS

SOLID.

3.

RGB(O.

 

 

 

 

HPEN hPenl =

О.

О));

 

SelectObject(hdc.

hPenl):-

LineTo(hdc.

 

 

 

 

 

MoveToEx(hdc.

О.

О.

NULL):

хМах.

О):

 

 

static

LOGFONT

lf:

=

FIXED

PITCH

FF_MODERN;

 

 

lf.lfPitchAndFamily

 

 

lf.lfltalic

= TRUE;

 

 

 

 

-

 

 

 

 

 

 

 

 

lf.lfWeight

=

FW

BOLD;

 

 

 

 

 

 

 

 

 

 

 

lf.lfHeight

= 20;

 

 

 

CHARSET;

 

 

 

 

 

 

 

lf.lfCharSet

 

= DEFAULT

"Ari al"

) :

 

 

 

 

l strcpy(

(LPSTR)&l f. lfFaceName.

 

 

 

 

HFONT

hFontO

 

= CreateFontlndirect(&lf);

 

hFontO):

 

HFONT

hOldFont

=

(HFONT)SelectObject(hdc.

 

SetTextColor(hdc.

RGB(O.

О.

200));

 

 

 

 

 

 

TextOut(hdc.

 

xMax+lO.

 

10.

"t

(ms)".

6);

 

 

 

 

 

// Ось

"у"

 

 

 

yMin.

NULL):

LineTo(hdc.

 

 

 

 

MoveToEx(hdc.

 

О.

О.

уМах):

 

TextOut(hdc.

 

-10.

уМах+ЗО.

"u

(V)".

5):

 

 

 

 

 

// График

 

 

CreatePen(PS

SOLID.

5.

RGB(200.

 

100));

 

HPEN hPen2 =

О.

 

SelectObject(hdc.

hPen2):-

 

 

 

 

 

 

 

 

 

int tStep

=

1:

 

 

 

2 *

Pi

/

20:

 

 

 

 

 

 

douЫe

radianPerMs

=

//

volt

 

 

 

const

douЫe

uAmplit

= 311.17:

 

 

 

 

t = tMin:

 

 

 

 

 

NULL);

 

 

 

 

 

 

 

 

 

MoveToEx(hdc.

 

О.

О.

 

 

 

 

 

 

 

 

 

wh i l е

(t

<=

tMa х)

{

 

t * radianPerMs):

 

 

 

 

 

u = uAmplit

* sin(

 

 

 

 

 

 

LineTo(hdc.

t

*

nPixPerMs.

u * nPixPerVolt);

 

 

t += tStep;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// Заголовок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

char*

title

=

"Диаграмма

напряжения

переменного

электр.

тока";

159

продолжение

..Р