Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include "StdAfx.h"
- #include "strsafe.h"
- #include <Commdlg.h>
- #include <strsafe.h>
- #pragma comment(lib, "strsafe.lib")
- #define ID_FILE_EXIT 9001
- #define ID_STUFF_GO 9002
- #define ID_FIRSTNAME 303
- #define ID_LASTNAME 304
- #define ID_NAME 305
- #define ID_DEVSTAT 306
- #define ID_LEARNFORM 307
- #define ID_GROUP 308
- #define FONT 309
- #define BUFSIZE 65535
- #define SHIFTED 0x8000
- HGDIOBJ g_hfFont = GetStockObject(GRAY_BRUSH);
- COLORREF g_rgbText = RGB(0, 0, 0);
- HFONT hf;
- int lfHeight;
- //LRESULT CALLBACK
- LRESULT CALLBACK MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc; // дескриптор контекста устройства
- TEXTMETRIC tm; // структура для текстовой метрики
- static DWORD dwCharX; // средняя ширина символа
- static DWORD dwCharY; // высота символа
- static DWORD dwClientX; // ширина рабочей области
- static DWORD dwClientY; // высота рабочей области
- static DWORD dwLineLen; // длина строки
- static DWORD dwLines; // строки текста в рабочей области
- static int nCaretPosX = 0; // горизонтальная позиция каретки
- static int nCaretPosY = 0; // вертикальная позиция каретки
- static int nCharWidth = 0; // ширина символа
- static int cch = 0; // символы в буфере
- static int nCurChar = 0; // индекс текущего символа
- static PTCHAR pchInputBuf; // буфер ввода
- int i, j; // цикл счета
- int cCR = 0; // счетчик переводов каретки
- int nCRIndex = 0; // индекс последнего перевода каретки
- int nVirtKey; // код виртуальной клавиши
- TCHAR szBuf[128]; // временный буфер
- TCHAR ch; // текущий символ
- PAINTSTRUCT ps; // требуется для BeginPaint
- RECT rc; // прямоугольник вывода для DrawText
- SIZE sz; // размеры строк
- COLORREF crPrevText; // предыдущий цвет текста
- COLORREF crPrevBk; // предыдущий цвет фона
- size_t * pcch;
- HRESULT hResult;
- switch (uMsg)
- {
- case WM_CREATE:
- hdc = GetDC(hwndMain);
- lfHeight = -MulDiv(16, GetDeviceCaps(hdc, LOGPIXELSY), 72);
- hf = CreateFont(lfHeight, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0, TEXT("Tahoma"));
- // Получим метрику текущего шрифта.
- GetTextMetrics(hdc, &tm);
- ReleaseDC(hwndMain, hdc);
- // Сохраним среднюю ширину и высоту символа.
- dwCharX = tm.tmAveCharWidth;
- dwCharY = tm.tmHeight;
- // Назначим в памяти буфер для ввода информации с клавиатуры.
- pchInputBuf = (LPTSTR) GlobalAlloc(GPTR,
- BUFSIZE * sizeof(TCHAR));
- HMENU hMenu, hSubMenu;
- hMenu = CreateMenu();
- hSubMenu = CreatePopupMenu();
- AppendMenu(hSubMenu, MF_STRING, ID_FIRSTNAME , "FirstName");
- AppendMenu(hSubMenu, MF_STRING, ID_LASTNAME , "LastName");
- AppendMenu(hSubMenu, MF_STRING, ID_NAME , "Name");
- AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&FIO");
- hSubMenu = CreatePopupMenu();
- AppendMenu(hSubMenu, MF_STRING, ID_DEVSTAT , "DeveloperStatus");
- AppendMenu(hSubMenu, MF_STRING, ID_LEARNFORM , "LearningForm");
- AppendMenu(hSubMenu, MF_STRING, ID_GROUP , "Group");
- AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&INFO");
- AppendMenu(hSubMenu, MF_STRING, FONT, "Шрифт");
- //AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Шрифт");
- SetMenu(hwndMain, hMenu);
- return 0;
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case FONT:
- HFONT DoSelectFont(HWND,HFONT);
- hf=DoSelectFont(hwndMain,hf);
- break;
- }
- case WM_SIZE:
- // Сохраним новую ширину и высоту рабочей области.
- dwClientX = LOWORD(lParam);
- dwClientY = HIWORD(lParam);
- // Вычислим максимальную ширину строки и
- // максимальное число строк в рабочей области.
- dwLineLen = dwClientX - dwCharX;
- dwLines = dwClientY / dwCharY;
- break;
- case WM_SETFOCUS:
- // Создадим, позиционируем и отобразим каретку в окне,
- // которое получило фокус ввода клавиатуры.
- CreateCaret(hwndMain, (HBITMAP) 1, 3, dwCharY);
- SetCaretPos(nCaretPosX, nCaretPosY * dwCharY);
- ShowCaret(hwndMain);
- break;
- case WM_KILLFOCUS:
- // Скроем и разрушим каретку,
- // когда окно теряет фокус ввода с клавиатуры.
- HideCaret(hwndMain);
- DestroyCaret();
- break;
- case WM_CHAR:
- // проверяем, если текущее место достаточно близко
- // к концу буфера, что может привести к переполнению
- // его. Если это так, то добавляем нуль и показываем
- // содержимое.
- if (cch > BUFSIZE-5)
- {
- pchInputBuf[cch] = 0x00;
- SendMessage(hwndMain, WM_PAINT, 0, 0);
- }
- switch (wParam)
- {
- case 0x08: // возврат каретки
- case 0x0A: // перевод строки
- case 0x1B: // escape
- MessageBeep((UINT) -1);
- return 0;
- case 0x09: // табуляция
- // Преобразование табуляции в четыре последовательных пробела.
- for (i = 0; i < 4; i++)
- SendMessage(hwndMain, WM_CHAR, 0x20, 0);
- return 0;
- case 0x0D: // возврат каретки
- // Запись перевода каретки и позиции
- // каретки в начале новой строки.
- pchInputBuf[cch++] = 0x0D;
- nCaretPosX = 0;
- nCaretPosY += 1;
- break;
- default: // отображаемый символ
- ch = (TCHAR) wParam;
- HideCaret(hwndMain);
- // Извлечение данных о ширине
- // символа и вывод символа.
- hdc = GetDC(hwndMain);
- GetCharWidth32(hdc, (UINT) wParam, (UINT) wParam,
- &nCharWidth);
- DrawText(hdc, pchInputBuf, -1, &rc, DT_LEFT);
- InvalidateRect(hwndMain,NULL,true);
- //TextOut(hdc, nCaretPosX, nCaretPosY * dwCharY,
- // &ch, 1);
- SendMessage(hwndMain,WM_PAINT,NULL,NULL);
- ReleaseDC(hwndMain, hdc);
- // Сохранение символа в буфере.
- pchInputBuf[cch++] = ch;
- // Вычисление новой горизонтальной позиции каретки.
- // Если позиция превышает максимум, вставьте перевод
- // каретки, и переместите каретку в начало
- // следующей строки.
- nCaretPosX += nCharWidth;
- if ((DWORD) nCaretPosX > dwLineLen)
- {
- nCaretPosX = 0;
- pchInputBuf[cch++] = 0x0D;
- ++nCaretPosY;
- }
- nCurChar = cch;
- ShowCaret(hwndMain);
- break;
- }
- SetCaretPos(nCaretPosX, nCaretPosY * dwCharY);
- break;
- case WM_KEYDOWN:
- switch (wParam)
- {
- case VK_LEFT: // LEFT ARROW
- // Каретка может перемещаться только в начало
- // текущей строки.
- if (nCaretPosX > 0)
- {
- HideCaret(hwndMain);
- // Извлекает данные о символе слева от каретки,
- // вычисляет ширину символа, а затем вычитает
- // ширину из текущей горизонтальной позиции
- // каретки, чтобы получить
- // новую позицию.
- ch = pchInputBuf[--nCurChar];
- hdc = GetDC(hwndMain);
- GetCharWidth32(hdc, ch, ch, &nCharWidth);
- ReleaseDC(hwndMain, hdc);
- nCaretPosX = max(nCaretPosX - nCharWidth,
- 0);
- ShowCaret(hwndMain);
- }
- break;
- case VK_RIGHT: // Клавиша RIGHT ARROW (стрелка вправо)
- // Каретка перемещается вправо или, когда
- // определяется перевод каретки, чтобы
- // начать следующую строку.
- if (nCurChar < cch)
- {
- HideCaret(hwndMain);
- // Извлекаем данные о символе справа
- // от каретки. Если они являются переводом
- // каретки, каретка позиционируется
- // в начале следующей строки.
- ch = pchInputBuf[nCurChar];
- if (ch == 0x0D)
- {
- nCaretPosX = 0;
- nCaretPosY++;
- }
- // Если символ не является переводом каретки,
- // возвращаемся, проверяем, не нажата ли
- // клавиша SHIFT. Если она нажата,
- // инвертируем цвет текста и выводим символ.
- else
- {
- hdc = GetDC(hwndMain);
- nVirtKey = GetKeyState(VK_SHIFT);
- if (nVirtKey & SHIFTED)
- {
- crPrevText = SetTextColor(hdc,
- RGB(255, 255, 255));
- crPrevBk = SetBkColor(hdc,
- RGB(0,0,0));
- TextOut(hdc, nCaretPosX,
- nCaretPosY * dwCharY,
- &ch, 1);
- SetTextColor(hdc, crPrevText);
- SetBkColor(hdc, crPrevBk);
- }
- // Получаем ширину символа и
- // вычисляем новую горизонтальную
- // позицию каретки.
- GetCharWidth32(hdc, ch, ch, &nCharWidth);
- ReleaseDC(hwndMain, hdc);
- nCaretPosX = nCaretPosX + nCharWidth;
- }
- nCurChar++;
- ShowCaret(hwndMain);
- break;
- }
- break;
- case VK_UP: // Клавиша UP ARROW
- case VK_DOWN: // Клавиша DOWN ARROW
- MessageBeep((UINT) -1);
- return 0;
- case VK_HOME: // Клавиша HOME
- // Устанавливаем позицию каретки в верхнем левом
- // углу рабочей области.
- nCaretPosX = nCaretPosY = 0;
- nCurChar = 0;
- break;
- case VK_END: // Клавиша END
- // Перемещаем каретку в конец текста.
- for (i=0; i < cch; i++)
- {
- // Считаем число переводов каретки и
- // сохраняем индекс последнего счета.
- if (pchInputBuf[i] == 0x0D)
- {
- cCR++;
- nCRIndex = i + 1;
- }
- }
- nCaretPosY = cCR;
- // Копируем весь текст между последним переводом
- // каретки и концом из буфера
- // ввода с клавиатуры во временный буфер.
- for (i = nCRIndex, j = 0; i < cch; i++, j++)
- szBuf[j] = pchInputBuf[i];
- szBuf[j] = TEXT('\0');
- // Извлекаем данные о протяженности текста
- // и используем их, чтобы установить
- // горизонтальную позицию каретки.
- //hdc = GetDC(hwndMain);
- GetTextExtentPoint32(hdc, szBuf, lstrlen(szBuf),&sz);
- nCaretPosX = sz.cx;
- ReleaseDC(hwndMain, hdc);
- nCurChar = cch;
- break;
- default:
- break;
- }
- SetCaretPos(nCaretPosX, nCaretPosY * dwCharY);
- break;
- case WM_PAINT:
- if (cch == 0) // в буфере ввода ничего нет
- break;
- hdc = BeginPaint(hwndMain, &ps);
- HideCaret(hwndMain);
- // Установим прямоугольник отсечения, а затем
- // пропишем текст внутри него.
- SelectObject(hdc, hf);
- SetRect(&rc, 0, 0, dwLineLen, dwClientY);
- DrawText(hdc, pchInputBuf, -1, &rc, DT_LEFT);
- ShowCaret(hwndMain);
- EndPaint(hwndMain, &ps);
- break;
- // Обработка других сообщений.
- case WM_DESTROY:
- PostQuitMessage(0);
- // Освобождаем буфер ввода.
- GlobalFree((HGLOBAL) pchInputBuf);
- UnregisterHotKey(hwndMain, 0xAAAA);
- break;
- default:
- return DefWindowProc(hwndMain, uMsg, wParam, lParam);
- }
- return NULL;
- }
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- WNDCLASSEX wc;
- const char g_szClassName[] = "laba1Class";
- HWND hwnd;
- MSG msg;
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.style = CS_VREDRAW | CS_HREDRAW;
- wc.lpfnWndProc=MainWndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = g_szClassName;
- wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
- if(!RegisterClassEx(&wc))
- {
- MessageBox(NULL, "Window Registration Failed! ", "Error!", MB_ICONEXCLAMATION | MB_OK);
- return 0;
- }
- hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, g_szClassName, "Берман И., Антипин А.",
- WS_OVERLAPPEDWINDOW&~WS_THICKFRAME , 200, 100, 800, 600, NULL, NULL,
- hInstance, NULL);
- if(hwnd == NULL)
- {
- MessageBox(NULL, "Window Creation Failed! ", "Error!", MB_ICONEXCLAMATION | MB_OK);
- return 0;
- }
- ShowWindow(hwnd, nCmdShow);
- UpdateWindow(hwnd);
- while(GetMessage(&msg, NULL, 0, 0) > 0)
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 500 /*width*/, 500 /*height*/, SWP_NOMOVE);
- }
- return msg.wParam;
- }
- /* HMENU hMenu, hSubMenu;
- HICON hIcon, hIconSm;
- hMenu = CreateMenu();
- hSubMenu = CreatePopupMenu();
- AppendMenu(hSubMenu, MF_STRING, ID_FIO_FIRST, "FirstName");
- AppendMenu(hSubMenu, MF_STRING, ID_FIO_LAST, "SecondName");
- AppendMenu(hSubMenu, MF_STRING, ID_FIO_NAME, "Name");
- AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "FIO");
- hSubMenu = CreatePopupMenu();
- AppendMenu(hSubMenu, MF_STRING, ID_INFO_DEV, "DeveloperStatus");
- AppendMenu(hSubMenu, MF_STRING, ID_INFO_FORM, "LearningForm");
- AppendMenu(hSubMenu, MF_STRING, ID_INFO_GROUP, "Group");
- AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "INFO");
- SetMenu(hwndMain, hMenu);
- hIcon = (HICON)LoadImage(NULL, "my_icon.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
- if(hIcon)
- SendMessage(hwndMain, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
- else
- MessageBox(hwndMain, "Could not load large icon!", "Error", MB_OK | MB_ICONERROR);
- hIconSm = (HICON)LoadImage(NULL, "my_icon.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
- if(hIconSm)
- SendMessage(hwndMain, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
- else
- MessageBox(hwndMain, "Could not load small icon!", "Error", MB_OK | MB_ICONERROR);
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case ID_INFO_DEV:
- MessageBox(NULL, "Статус разработчиков - студенты", "Статус", 0);
- break;
- case ID_INFO_FORM:
- MessageBox(hwndMain, "Бакалавриат", "Антипин, Берман", 0);
- break;
- case ID_INFO_GROUP:
- MessageBox(hwndMain, "3143", "Антипин,Берман", 0);
- break;
- case ID_FIO_FIRST:
- MessageBox(hwndMain, "Артём, Иван", "Антипин, Берман", 0);
- break;
- case ID_FIO_LAST:
- MessageBox(hwndMain, "Антипин и Берман", "Антипин, Берман", 0);
- break;
- case ID_FIO_NAME:
- MessageBox(hwndMain, "Артём и Иван", "Антипин, Берман", 0);
- break;
- default:
- break;
- }
- break;*/
- /* // for( i = nCurChar, j = n; i < cch; i++, j++)
- // Res[j] = pchInputBuf[i];
- // n = j;
- //cch = nCurChar;
- pchInputBuf[cch++] = ch;
- // ;//nCurChar++
- // for(i = nCurChar, j = 0; j < n; i++, j++)
- // pchInputBuf[i] = Res[j];
- //}
- //else
- //pchInputBuf[cch++] = ch;
- for (i = nCRIndex, j = 0; i < cch; i++, j++)
- szBuf[j] = pchInputBuf[i];
- szBuf[j] = TEXT('\0');
- // Извлекаем данные о протяженности текста
- // и используем их, чтобы установить
- // горизонтальную позицию каретки.
- //hdc = GetDC(hwndMain);
- GetTextExtentPoint32(hdc, szBuf, lstrlen(szBuf),&sz);
- nCaretPosX = sz.cx;
- ReleaseDC(hwndMain, hdc);
- nCurChar = cch;
- break; */
- HFONT DoSelectFont(HWND hwnd, HFONT mhf)
- {
- CHOOSEFONT cf;
- LOGFONT lf;
- GetObject(mhf, sizeof(LOGFONT), &lf);
- cf.lStructSize = sizeof(CHOOSEFONT);
- cf.Flags = CF_EFFECTS | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
- cf.hwndOwner = hwnd;
- cf.lpLogFont = &lf;
- //cf.rgbColors = RGB(10, 20, 100);
- if (ChooseFont(&cf))
- {
- mhf = CreateFontIndirect(&lf);
- if (!mhf)
- {
- MessageBox(hwnd, TEXT("Font creation failed!"), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION);
- }
- }
- hf=mhf;
- return mhf;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement