АОПИ. Старое / Щупак Ю. А. Win32 API. Эффективная разработка приложений
.pdfПримеры
программ
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
продолжение |
..Р |