Guest User

Text Editor

a guest
Oct 5th, 2011
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.56 KB | None | 0 0
  1. #include <Windows.h>
  2.  
  3. #define BUFFER(x, y) *(pBuffer + y * cxBuffer + x)
  4.  
  5. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  6.  
  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  8. {
  9.     static TCHAR szAppName[] = TEXT("Typer");
  10.     HWND hwnd;
  11.     MSG msg;
  12.     WNDCLASS wc;
  13.  
  14.     wc.style = CS_HREDRAW | CS_VREDRAW;
  15.     wc.lpfnWndProc = WndProc;
  16.     wc.cbClsExtra = 0;
  17.     wc.cbWndExtra = 0;
  18.     wc.hInstance = hInstance;
  19.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  20.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  21.     wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  22.     wc.lpszMenuName = NULL;
  23.     wc.lpszClassName = szAppName;
  24.  
  25.     if(!RegisterClass(&wc))
  26.     {
  27.         MessageBox(NULL, TEXT("Uh oh! Something went wrong! Our developers will fix it ASAP!"), szAppName, MB_ICONERROR);
  28.         return 0;
  29.     }
  30.  
  31.     hwnd = CreateWindow(szAppName, TEXT("Typing Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,
  32.         NULL, hInstance, NULL);
  33.  
  34.     ShowWindow(hwnd, iCmdShow);
  35.     UpdateWindow(hwnd);
  36.  
  37.     while(GetMessage(&msg, NULL, 0, 0))
  38.     {
  39.         TranslateMessage(&msg);
  40.         DispatchMessage(&msg);
  41.     }
  42.  
  43.     return msg.wParam;
  44. }
  45.  
  46. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, 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(message)
  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:
  73.             if(message == WM_SIZE)
  74.             {
  75.                 cxClient = LOWORD(lParam);
  76.                 cyClient = HIWORD(lParam);
  77.             }
  78.  
  79.             cxBuffer = max(1, cxClient / cxChar);
  80.             cyBuffer = max(1, cyClient / cyChar);
  81.  
  82.             if(pBuffer != NULL)
  83.                 free(pBuffer);
  84.            
  85.             pBuffer = (TCHAR *) malloc(cxBuffer * cyBuffer * sizeof(TCHAR));
  86.  
  87.             for(y = 0; y < cyBuffer; y++)
  88.                 for(x = 0; x < cxBuffer; x++)
  89.                     BUFFER(x, y) = ' ';
  90.  
  91.             xCaret = 0;
  92.             yCaret = 0;
  93.  
  94.             if(hwnd == GetFocus())
  95.                 SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  96.  
  97.             InvalidateRect(hwnd, NULL, TRUE);
  98.             return 0;
  99.  
  100.         case WM_SETFOCUS:
  101.             CreateCaret(hwnd, NULL, cxChar, cyChar);
  102.             SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  103.             ShowCaret(hwnd);
  104.             return 0;
  105.  
  106.         case WM_KILLFOCUS:
  107.             HideCaret(hwnd);
  108.             DestroyCaret();
  109.             return 0;
  110.  
  111.         case WM_KEYDOWN:
  112.             switch(wParam)
  113.             {
  114.                 case VK_HOME:
  115.                     xCaret = 0;
  116.                     break;
  117.                 case VK_END:
  118.                     xCaret - cxBuffer - 1;
  119.                     break;
  120.                 case VK_PRIOR:
  121.                     yCaret = 0;
  122.                     break;
  123.                 case VK_NEXT:
  124.                     yCaret = cyBuffer - 1;
  125.                     break;
  126.                 case VK_LEFT:
  127.                     xCaret - max(xCaret - 1, 0);
  128.                     break;
  129.                 case VK_RIGHT:
  130.                     xCaret - min(xCaret + 1, cxBuffer - 1);
  131.                     break;
  132.                 case VK_UP:
  133.                     yCaret - max(yCaret - 1, 0);
  134.                     break;
  135.                 case VK_DOWN:
  136.                     yCaret = min(yCaret + 1, cyBuffer - 1);
  137.                     break;
  138.                 case VK_DELETE:
  139.                     for(x = xCaret; x < cxBuffer - 1; x++)
  140.                         BUFFER(x, yCaret) = BUFFER(x + 1, yCaret);
  141.                     HideCaret(hwnd);
  142.                     hdc = GetDC(hwnd);
  143.                     SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FIXED_PITCH, NULL));
  144.                     TextOut(hdc, xCaret * cxChar, yCaret * cyChar, & BUFFER(xCaret, yCaret), cxBuffer - xCaret);
  145.                     DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  146.                     ReleaseDC(hwnd, hdc);
  147.                     ShowCaret(hwnd);
  148.                     break;
  149.             }
  150.             SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  151.             return 0;
  152.  
  153.         case WM_CHAR:
  154.             for(i = 0; i < (int) LOWORD(lParam); i++)
  155.             {
  156.                 switch(wParam)
  157.                 {
  158.                     case '\b':
  159.                         if(xCaret > 0)
  160.                         {
  161.                             xCaret--;
  162.                             SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1);
  163.                         }
  164.                         break;
  165.  
  166.                     case '\t':
  167.                         do
  168.                         {
  169.                             SendMessage(hwnd, WM_CHAR, '    ', 1);
  170.                         }
  171.                         while(xCaret % 8 != 0);
  172.                         break;
  173.                    
  174.                     case '\r':
  175.                         xCaret = 0;
  176.                         if(++yCaret == cyBuffer)
  177.                             yCaret = 0;
  178.                         break;
  179.  
  180.                     case '\x1B':
  181.                         for(y = 0; y < cyBuffer; y++)
  182.                             for(x = 0; x < cxBuffer; x++)
  183.                                 BUFFER(x, y) = ' ';
  184.                         xCaret = 0;
  185.                         yCaret = 0;
  186.                         InvalidateRect(hwnd, NULL, FALSE);
  187.                         break;
  188.  
  189.                     default:
  190.                         BUFFER(xCaret, yCaret) = (TCHAR) wParam;
  191.  
  192.                         HideCaret(hwnd);
  193.                         hdc = GetDC(hwnd);
  194.  
  195.                         SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  196.                         TextOut(hdc, xCaret * cxChar, yCaret * cyChar, & BUFFER(xCaret, yCaret), 1);
  197.                         DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  198.                         ReleaseDC(hwnd, hdc);
  199.                         ShowCaret(hwnd);
  200.  
  201.                         if(++xCaret == cxBuffer)
  202.                         {
  203.                             xCaret = 0;
  204.                            
  205.                             if(++yCaret == cyBuffer)
  206.                                 yCaret = 0;
  207.                         }
  208.                        
  209.                         break;
  210.                 }
  211.             }
  212.  
  213.             SetCaretPos(xCaret * cxChar, yCaret * cyChar);
  214.             return 0;
  215.  
  216.         case WM_PAINT:
  217.             hdc = BeginPaint(hwnd, &ps);
  218.  
  219.             SelectObject(hdc, CreateFont(0, 0, 0, 0, 0, 0, 0, 0, dwCharSet, 0, 0, 0, FIXED_PITCH, NULL));
  220.  
  221.             for(y = 0; y < cyBuffer; y++)
  222.                 TextOut(hdc, 0, y * cyChar, & BUFFER(0, y), cxBuffer);
  223.  
  224.             DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
  225.             EndPaint(hwnd, &ps);
  226.             return 0;
  227.  
  228.         case WM_DESTROY:
  229.             PostQuitMessage(0);
  230.             return 0;
  231.     }
  232.  
  233.     return DefWindowProc(hwnd, message, wParam, lParam);
  234. }
  235.  
Advertisement
Add Comment
Please, Sign In to add comment