Advertisement
peterzig

[PIU] Simple Text Editor

Nov 19th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.71 KB | None | 0 0
  1. #include <windows.h>
  2. #define BUFFER(x,y) *(pBuffer + y * cxBuffer + x)
  3.  
  4. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  5.  
  6. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  7. {
  8.     static TCHAR szAppName[] = TEXT("Typer");
  9.     HWND hwnd;
  10.     MSG msg;
  11.     WNDCLASS wndclass;
  12.  
  13.     wndclass.style = CS_HREDRAW | CS_VREDRAW;
  14.     wndclass.lpfnWndProc = WndProc;
  15.     wndclass.cbClsExtra = 0;
  16.     wndclass.cbWndExtra = 0;
  17.     wndclass.hInstance = hInstance;
  18.     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  19.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  20.     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  21.     wndclass.lpszMenuName = NULL;
  22.     wndclass.lpszClassName = szAppName;
  23.  
  24.     if (!RegisterClass(&wndclass))
  25.     {
  26.         MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"), szAppName, MB_ICONERROR);
  27.         return 0;
  28.     }
  29.  
  30.     hwnd = CreateWindow(szAppName, TEXT("Simple Text Editor"),
  31.         WS_OVERLAPPEDWINDOW,
  32.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  33.         NULL, NULL, hInstance, NULL);
  34.  
  35.     ShowWindow(hwnd, iCmdShow);
  36.     UpdateWindow(hwnd);
  37.  
  38.     while (GetMessage(&msg, NULL, 0, 0))
  39.     {
  40.         TranslateMessage(&msg);
  41.         DispatchMessage(&msg);
  42.     }
  43.     return msg.wParam;
  44. }
  45.  
  46. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  47. {
  48.     static DWORD dwCharSet = DEFAULT_CHARSET;
  49.     static int cxChar, cyChar, cxClient, cyClient, cxBuffer, cyBuffer, xCaret, yCaret;
  50.     static TCHAR * pBuffer = NULL;
  51.     HDC hdc;
  52.     int x, y, i;
  53.     PAINTSTRUCT ps;
  54.     TEXTMETRIC tm;
  55.  
  56.     switch (msg)
  57.     {
  58.     case WM_INPUTLANGCHANGE:
  59.         dwCharSet = wParam;
  60.  
  61.     case WM_CREATE:
  62.         hdc = GetDC(hwnd);
  63.         SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  64.  
  65.         GetTextMetrics(hdc, &tm);
  66.         cxChar = tm.tmAveCharWidth;
  67.         cyChar = tm.tmHeight;
  68.  
  69.         DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  70.         ReleaseDC(hwnd, hdc);
  71.  
  72.     case WM_SIZE: //pobierz rozmiar okna w pikselach
  73.  
  74.         if (msg == WM_SIZE)
  75.         {
  76.             cxClient = LOWORD(lParam);
  77.             cyClient = HIWORD(lParam);
  78.         }
  79.  
  80.         cxBuffer = max(1, cxClient / cxChar);
  81.         cyBuffer = max(1, cyClient / cyChar);
  82.  
  83.         //przydziel pamięć na bufor i wykasuj ją
  84.  
  85.         if (pBuffer != NULL)
  86.             free(pBuffer);
  87.  
  88.         pBuffer = (TCHAR *) malloc(cxBuffer * cyBuffer * sizeof(TCHAR));
  89.  
  90.         for (y = 0; y < cyBuffer; y++)
  91.             for (x = 0; x < cxBuffer; x++)
  92.                 BUFFER(x, y) = ' ';
  93.  
  94.         xCaret = 0;
  95.         yCaret = 0;
  96.  
  97.         if (hwnd == GetFocus())
  98.             SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  99.  
  100.         InvalidateRect(hwnd, NULL, TRUE);
  101.         return 0;
  102.  
  103.     case WM_SETFOCUS: //stwórz i wyświetl karetkę
  104.  
  105.         CreateCaret(hwnd, NULL, cxChar, cyChar);
  106.         SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  107.         ShowCaret(hwnd);
  108.         return 0;
  109.  
  110.     case WM_KILLFOCUS: // ukryj i usuń karetkę
  111.  
  112.         HideCaret(hwnd);
  113.         DestroyCaret();
  114.         return 0;
  115.  
  116.     case WM_KEYDOWN:
  117.         switch (wParam)
  118.         {
  119.         case VK_HOME:
  120.             xCaret = 0;
  121.             break;
  122.  
  123.         case VK_END:
  124.             xCaret = cxBuffer - 1;
  125.             break;
  126.  
  127.         case VK_PRIOR:
  128.             yCaret = 0;
  129.             break;
  130.  
  131.         case VK_NEXT:
  132.             yCaret = cyBuffer - 1;
  133.             break;
  134.  
  135.         case VK_LEFT:
  136.             yCaret = max(xCaret - 1, 0);
  137.             break;
  138.  
  139.         case VK_RIGHT:
  140.             xCaret = max(xCaret + 1, cxBuffer - 1);
  141.             break;
  142.  
  143.         case VK_UP:
  144.             yCaret = max(yCaret - 1, 0);
  145.             break;
  146.  
  147.         case VK_DOWN:
  148.             yCaret = min(yCaret + 1, cyBuffer - 1);
  149.             break;
  150.  
  151.         case VK_DELETE:
  152.             for (x = xCaret; x < cxBuffer - 1; x++)
  153.                 BUFFER(x, yCaret) = BUFFER(x + 1, yCaret);
  154.  
  155.             BUFFER(cxBuffer - 1, yCaret) = ' ';
  156.  
  157.             HideCaret(hwnd);
  158.             hdc = GetDC(hwnd);
  159.  
  160.             SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  161.  
  162.             TextOut(hdc, xCaret * cxChar, yCaret *cyChar, &BUFFER(xCaret, yCaret), cxBuffer - xCaret);
  163.  
  164.             DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  165.             ReleaseDC(hwnd, hdc);
  166.             ShowCaret(hwnd);
  167.             break;
  168.         }
  169.  
  170.         SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  171.         return 0;
  172.  
  173.     case WM_CHAR:
  174.         for (i = 0; i < (int)LOWORD(lParam); i++)
  175.         {
  176.             switch (wParam)
  177.             {
  178.             case '\b': //backspace
  179.                 if (xCaret > 0)
  180.                 {
  181.                     xCaret--;
  182.                     SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1);
  183.                 }
  184.                 break;
  185.  
  186.             case '\t': // tab
  187.                 do {
  188.                     SendMessage(hwnd, WM_CHAR, ' ', 1);
  189.                 } while (xCaret % 8 != 0);
  190.                 break;
  191.  
  192.             case '\n': //new line
  193.                 if (++yCaret == cyBuffer)
  194.                     yCaret = 0;
  195.                 break;
  196.  
  197.             case '\r': // powrót karetki
  198.                 xCaret = 0;
  199.  
  200.                 if (++yCaret == cyBuffer)
  201.                     yCaret = 0;
  202.                 break;
  203.  
  204.             case '\x1B': //esc key
  205.                 for (y = 0; y< cyBuffer; y++)
  206.                     for (x = 0; x< cxBuffer; x++)
  207.                         BUFFER(x, y) = ' ';
  208.  
  209.                 xCaret = 0;
  210.                 yCaret = 0;
  211.  
  212.                 InvalidateRect(hwnd, NULL, FALSE);
  213.                 break;
  214.  
  215.             default:
  216.                 BUFFER(xCaret, yCaret) = (TCHAR)wParam;
  217.  
  218.                 HideCaret(hwnd);
  219.                 hdc = GetDC(hwnd);
  220.  
  221.                 SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  222.  
  223.                 TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), 1);
  224.                 DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  225.                 ReleaseDC(hwnd, hdc);
  226.                 ShowCaret(hwnd);
  227.  
  228.                 if (++xCaret == cxBuffer)
  229.                 {
  230.                     xCaret = 0;
  231.  
  232.                     if (++yCaret == cyBuffer)
  233.                         yCaret = 0;
  234.                 }
  235.                 break;
  236.             }
  237.         }
  238.  
  239.         SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  240.         return 0;
  241.  
  242.     case WM_PAINT:
  243.  
  244.         hdc = BeginPaint(hwnd, &ps);
  245.         SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  246.  
  247.         for (y = 0; y< cyBuffer; y++)
  248.             TextOut(hdc, 0, y * cyChar, &BUFFER(0, y), cxBuffer);
  249.  
  250.         DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  251.         EndPaint(hwnd, &ps);
  252.         return 0;
  253.  
  254.     case WM_DESTROY:
  255.         PostQuitMessage(0);
  256.         return 0;
  257.     }
  258.     return DefWindowProc(hwnd, msg, wParam, lParam);
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement