Студопедия — Тема: Просмотр текста в окне
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Тема: Просмотр текста в окне

Лабораторная работа № 2

ПО ДИСЦИПЛИНЕ:

" ПРОГРАММИРОВАНИЕ ПОД WINDOWS "

Тема: Просмотр текста в окне

 

Выполнил:

Студент группы КСоз-11

Внуков А.С.

Проверил:

Теплинский С.В.

 

 

ДонНТУ

2012 г.

Листинг программы:

#include "WinAPI_Lab3.h"

 

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

char szAppName[] = "WinAPI_Lab3";

HWND hwnd;

MSG msg;

WNDCLASSEX wndclass;

 

wndclass.cbSize = sizeof (wndclass);

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO);

wndclass.hCursor = LoadCursor (NULL, IDC_WAIT);

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = szAppName;

wndclass.hIconSm = LoadIcon (NULL, IDI_WINLOGO);

 

RegisterClassEx (&wndclass);

 

hwnd = CreateWindow (szAppName, "WinAPI Lab #3 Sample",

WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL);

 

ShowWindow (hwnd, iCmdShow);

UpdateWindow (hwnd);

 

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

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

return msg.wParam;

}

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static int cxChar, cxCaps, cyChar, cxClient, cyClient,

iVscrollPos, iVscrollMax, iHscrollPos, iHscrollMax,

iMaxWidth, // максимальная длина строчки вывода

iBufLines; // общее количество строчек текста для вывода

HDC hdc;

int i, i2 = 0, x, y, iPaintBeg, iPaintEnd, iVscrollInc, iHscrollInc;

int cur_len = 0, max_len = 0;

FILE *stream = NULL;

char *szBuf, *szClipboard = NULL;

PAINTSTRUCT ps;

TEXTMETRIC tm;

 

switch (iMsg)

{

case WM_CREATE:

hdc = GetDC (hwnd);

 

GetTextMetrics (hdc, &tm);

cxChar = tm.tmAveCharWidth;

cxCaps = (tm.tmPitchAndFamily & 1? 3: 2) * cxChar / 2;

cyChar = tm.tmHeight + tm.tmExternalLeading;

 

iBufLines = iMaxWidth = 0;

 

// установка параметров для примера вывода sysmetrics

#ifdef VAR0

 

iBufLines = NUMLINES;

iMaxWidth = 40 * cxChar + 22 * cxCaps;

 

// установка параметров для вывода содержимого текстового файла

#elif defined VAR1

 

// считаем файл в буфер

if ((stream = fopen("test.txt", "rt")) == NULL)

{

MessageBox(hwnd, "Невозможно открыть файл 'test.txt'!", "Ошибка!", MB_OK | MB_ICONERROR);

}

else

{

max_len = 0;

while (!feof(stream))

{

// считываем строку из файла

szBuf = new char[80];

if (fgets(szBuf, 80, stream)!= NULL)

{

cur_len = strlen(szBuf);

 

// забиваем символ конца строки

if ((cur_len > 0) && (szBuf[cur_len - 1] == '\n'))

szBuf[--cur_len] = 0;

 

// определяем максимальную длину строки в файле

if (cur_len > max_len)

max_len = cur_len;

 

// заносим строку в буфер

fileBuf.push_back(szBuf);

}

else

delete[] szBuf;

}

// закрываем файл

fclose(stream);

 

iBufLines = fileBuf.size();

iMaxWidth = (int)(max_len / 1.3) * cxChar + (max_len >> 1 + 2) * cxCaps;

}

 

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

#elif defined VAR2

 

// начинаем работу с буфером обмена

if (OpenClipboard(hwnd)!= NULL)

{

// считываем содержимое буфера обмена как текст

szClipboard = (char*)GetClipboardData(CF_TEXT);

if (szClipboard!= NULL)

{

i = i2 = max_len = 0;

// разделяем текст буфера обмена на подстроки

while (i2 < strlen(szClipboard))

{

if ((szClipboard[i2] == '\n') || (i2 == (strlen(szClipboard) - 1)))

{

if (szClipboard[i2] == '\n')

cur_len = i2 - i;

else

cur_len = i2 - i + 2;

szBuf = new char[cur_len];

strncpy(szBuf, &szClipboard[i], cur_len - 1);

szBuf[cur_len - 1] = 0;

clipBuf.push_back(szBuf);

i = i2 + 1;

 

// определяем максимальную длину строки в буфере обмена

if (cur_len > max_len)

max_len = cur_len;

}

i2++;

}

 

iBufLines = clipBuf.size();

iMaxWidth = (int)(max_len / 1.3) * cxChar + (max_len >> 1 + 2) * cxCaps;

}

 

// заканчиваем работу с буфером обмена

CloseClipboard();

}

 

#endif

 

ReleaseDC (hwnd, hdc);

 

return 0;

 

case WM_SIZE:

cxClient = LOWORD (lParam);

cyClient = HIWORD (lParam);

 

iVscrollMax = max (0, iBufLines + 2 - cyClient / cyChar);

iVscrollPos = min (iVscrollPos, iVscrollMax);

 

SetScrollRange (hwnd, SB_VERT, 0, iVscrollMax, FALSE);

SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE);

 

iHscrollMax = max (0, 2 + (iMaxWidth - cxClient) / cxChar);

iHscrollPos = min (iHscrollPos, iHscrollMax);

 

SetScrollRange (hwnd, SB_HORZ, 0, iHscrollMax, FALSE);

SetScrollPos (hwnd, SB_HORZ, iHscrollPos, TRUE);

 

return 0;

 

case WM_VSCROLL:

switch (LOWORD (wParam))

{

case SB_TOP:

iVscrollInc = -iVscrollPos;

break;

 

case SB_BOTTOM:

iVscrollInc = iVscrollMax - iVscrollPos;

break;

 

case SB_LINEUP:

iVscrollInc = -1;

break;

 

case SB_LINEDOWN:

iVscrollInc = 1;

break;

 

case SB_PAGEUP:

iVscrollInc = min (-1, -cyClient / cyChar);

break;

 

case SB_PAGEDOWN:

iVscrollInc = max (1, cyClient / cyChar);

break;

 

case SB_THUMBTRACK:

iVscrollInc = HIWORD (wParam) - iVscrollPos;

break;

 

default:

iVscrollInc = 0;

}

iVscrollInc = max (-iVscrollPos,

min (iVscrollInc, iVscrollMax - iVscrollPos));

 

if (iVscrollInc!= 0)

{

iVscrollPos += iVscrollInc;

ScrollWindow (hwnd, 0, -cyChar * iVscrollInc, NULL, NULL);

SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE);

UpdateWindow (hwnd);

}

return 0;

 

case WM_HSCROLL:

switch (LOWORD (wParam))

{

case SB_LINEUP:

iHscrollInc = -1;

break;

 

case SB_LINEDOWN:

iHscrollInc = 1;

break;

 

case SB_PAGEUP:

iHscrollInc = -8;

break;

 

case SB_PAGEDOWN:

iHscrollInc = 8;

break;

 

case SB_THUMBPOSITION:

iHscrollInc = HIWORD (wParam) - iHscrollPos;

break;

 

default:

iHscrollInc = 0;

}

iHscrollInc = max (-iHscrollPos,

min (iHscrollInc, iHscrollMax - iHscrollPos));

 

if (iHscrollInc!= 0)

{

iHscrollPos += iHscrollInc;

ScrollWindow (hwnd, -cxChar * iHscrollInc, 0, NULL, NULL);

SetScrollPos (hwnd, SB_HORZ, iHscrollPos, TRUE);

}

return 0;

 

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps);

 

iPaintBeg = max (0, iVscrollPos + ps.rcPaint.top / cyChar - 1);

iPaintEnd = min (iBufLines, iVscrollPos + ps.rcPaint.bottom / cyChar);

 

for (i = iPaintBeg; i < iPaintEnd; i++)

{

x = cxChar * (1 - iHscrollPos);

y = cyChar * (1 - iVscrollPos + i);

 

// вывод строчки из sysmetrics

#ifdef VAR0

 

szBuf = new char[80];

 

SetTextAlign (hdc, TA_LEFT | TA_TOP);

TextOut (hdc, x, y,

sysmetrics[i].szLabel,

strlen (sysmetrics[i].szLabel));

TextOut (hdc, x + 22 * cxCaps, y,

sysmetrics[i].szDesc,

strlen (sysmetrics[i].szDesc));

SetTextAlign (hdc, TA_RIGHT | TA_TOP);

TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y,

szBuf, wsprintf (szBuf, "%5d",

GetSystemMetrics (sysmetrics[i].iIndex)));

 

delete szBuf;

 

// вывод строчки из буферированного текстового файла

#elif defined VAR1

 

SetTextAlign (hdc, TA_LEFT | TA_TOP);

TextOut (hdc, x, y, fileBuf[i], strlen(fileBuf[i]));

 

// вывод строчки из буфера обмена

#elif defined VAR2

 

SetTextAlign (hdc, TA_LEFT | TA_TOP);

TextOut (hdc, x, y, clipBuf[i], strlen(clipBuf[i]));

 

#endif

}

 

EndPaint (hwnd, &ps);

return 0;

 

case WM_DESTROY:

// удаляем содержимое вектора буфера файла

#ifdef VAR1

for (i = 0; i < fileBuf.size(); i++)

delete[] fileBuf[i];

fileBuf.clear();

 

// удаляем содержимое вектора строчек буфера обмена

#elif defined VAR2

for (i = 0; i < clipBuf.size(); i++)

delete[] clipBuf[i];

clipBuf.clear();

 

#endif

 

PostQuitMessage (0);

return 0;

}

 

return DefWindowProc (hwnd, iMsg, wParam, lParam);

}


 

#include <windows.h>

#include <stdio.h>

#include <vector>

using namespace std;

// выбор варианта лабораторной: VAR0 - пример (вывод массива sysmetrics)

// VAR1 - вывод содержимого текстового файла

// VAR2 - вывод содержимого буфера обмена

#define VAR2

#ifdef VAR0

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

struct

{

int iIndex;

char *szLabel;

char *szDesc;

}

sysmetrics [] =

{

SM_CXSCREEN, "SM_CXSCREEN", "Screen width in pixels",

SM_CYSCREEN, "SM_CYSCREEN", "Screen height in pixels",

SM_CXVSCROLL, "SM_CXVSCROLL", "Vertical scroll arrow width",

SM_CYHSCROLL, "SM_CYHSCROLL", "Horizontal scroll arrow height",

SM_CYCAPTION, "SM_CYCAPTION", "Caption bar height",

SM_CXBORDER, "SM_CXBORDER", "Window border width",

SM_CYBORDER, "SM_CYBORDER", "Window border height",

SM_CXDLGFRAME, "SM_CXDLGFRAME", "Dialog window frame width",

SM_CYDLGFRAME, "SM_CYDLGFRAME", "Dialog window frame height",

SM_CYVTHUMB, "SM_CYVTHUMB", "Vertical scroll thumb height",

SM_CXHTHUMB, "SM_CXHTHUMB", "Horizontal scroll thumb width",

SM_CXICON, "SM_CXICON", "Icon width",

SM_CYICON, "SM_CYICON", "Icon height",

SM_CXCURSOR, "SM_CXCURSOR", "Cursor width",

SM_CYCURSOR, "SM_CYCURSOR", "Cursor height",

SM_CYMENU, "SM_CYMENU", "Menu bar height",

SM_CXFULLSCREEN, "SM_CXFULLSCREEN", "Full screen client area width",

SM_CYFULLSCREEN, "SM_CYFULLSCREEN", "Full screen client area height",

SM_CYKANJIWINDOW, "SM_CYKANJIWINDOW", "Kanji window height",

SM_MOUSEPRESENT, "SM_MOUSEPRESENT", "Mouse present flag",

SM_CYVSCROLL, "SM_CYVSCROLL", "Vertical scroll arrow height",

SM_CXHSCROLL, "SM_CXHSCROLL", "Horizontal scroll arrow width",

SM_DEBUG, "SM_DEBUG", "Debug version flag",

SM_SWAPBUTTON, "SM_SWAPBUTTON", "Mouse buttons swapped flag",

SM_RESERVED1, "SM_RESERVED1", "Reserved",

SM_RESERVED2, "SM_RESERVED2", "Reserved",

SM_RESERVED3, "SM_RESERVED3", "Reserved",

SM_RESERVED4, "SM_RESERVED4", "Reserved",

SM_CXMIN, "SM_CXMIN", "Minimum window width",

SM_CYMIN, "SM_CYMIN", "Minimum window height",

SM_CXSIZE, "SM_CXSIZE", "Minimize/Maximize icon width",

SM_CYSIZE, "SM_CYSIZE", "Minimize/Maximize icon height",

SM_CXFRAME, "SM_CXFRAME", "Window frame width",

SM_CYFRAME, "SM_CYFRAME", "Window frame height",

SM_CXMINTRACK, "SM_CXMINTRACK", "Minimum window tracking width",

SM_CYMINTRACK, "SM_CYMINTRACK", "Minimum window tracking height",

SM_CXDOUBLECLK, "SM_CXDOUBLECLK", "Double click x tolerance",

SM_CYDOUBLECLK, "SM_CYDOUBLECLK", "Double click y tolerance",

SM_CXICONSPACING, "SM_CXICONSPACING", "Horizontal icon spacing",

SM_CYICONSPACING, "SM_CYICONSPACING", "Vertical icon spacing",

SM_MENUDROPALIGNMENT, "SM_MENUDROPALIGNMENT", "Left or right menu drop",

SM_PENWINDOWS, "SM_PENWINDOWS", "Pen extensions installed",

SM_DBCSENABLED, "SM_DBCSENABLED", "Double-Byte Char Set enabled",

SM_CMOUSEBUTTONS, "SM_CMOUSEBUTTONS", "Number of mouse buttons",

SM_SHOWSOUNDS, "SM_SHOWSOUNDS", "Present sounds visually"

};

#elif defined VAR1

vector<char*> fileBuf;

#elif defined VAR2

vector<char*> clipBuf;

#endif

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

Результат:




<== предыдущая лекция | следующая лекция ==>
Приложение 6. Образец оформления плана | ГЛАВА ДЕВЯТНАДЦАТАЯ. Положение на фронте в августе 1915г

Дата добавления: 2015-08-12; просмотров: 342. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Закон Гука при растяжении и сжатии   Напряжения и деформации при растяжении и сжатии связаны между собой зависимостью, которая называется законом Гука, по имени установившего этот закон английского физика Роберта Гука в 1678 году...

Характерные черты официально-делового стиля Наиболее характерными чертами официально-делового стиля являются: • лаконичность...

Этапы и алгоритм решения педагогической задачи Технология решения педагогической задачи, так же как и любая другая педагогическая технология должна соответствовать критериям концептуальности, системности, эффективности и воспроизводимости...

Что такое пропорции? Это соотношение частей целого между собой. Что может являться частями в образе или в луке...

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

Studopedia.info - Студопедия - 2014-2024 год . (0.014 сек.) русская версия | украинская версия