Advertisement
vovan333

jobanije okupanti

Jan 3rd, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <CommCtrl.h>
  4. #include <gdiplus.h>
  5. #include <string>
  6. #include <vector>
  7. #include "enums.h"
  8.  
  9. using namespace std;
  10. using namespace Gdiplus;
  11.  
  12. namespace D3DTest1
  13. {
  14.     HWND hMainWindow;
  15.     HWND hMainWindowStatusBar;
  16.     LPCWSTR openImageFilename;
  17.     Image* pOpenImage;
  18.     vector<HMENU> ddMenuHandles(255);
  19.     int clientAreaWidth = 800;
  20.     int clientAreaHeight = 600;
  21.     UINT windowStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU;
  22.     HANDLE hConsoleOutput;
  23.     Point prevMousePos;
  24.     Point curMousePos;
  25.     Color color = Color::Black;
  26.     Tool tool = Tool::Brush;
  27.     BOOL isImageLoaded = FALSE;
  28.     BOOL debug = TRUE;
  29.     BOOL isDrawing = FALSE;
  30.  
  31.     OPENFILENAME CreateOFN(HWND hOwnerWindow = hMainWindow)
  32.     {
  33.         OPENFILENAME ofn;
  34.         WCHAR filename[MAX_PATH];
  35.         ZeroMemory(&ofn, sizeof(ofn));
  36.  
  37.         ofn.lStructSize = sizeof(ofn);
  38.         ofn.hwndOwner = hOwnerWindow;
  39.         ofn.lpstrFile = filename;
  40.         ofn.lpstrFile[0] = '\0';
  41.         ofn.nMaxFile = sizeof(filename);
  42.         ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
  43.         ofn.nFilterIndex = 1;
  44.         ofn.lpstrFileTitle = NULL;
  45.         ofn.nMaxFileTitle = 0;
  46.         ofn.lpstrInitialDir = NULL;
  47.         ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  48.  
  49.         return ofn;
  50.     }
  51.  
  52.     CHOOSECOLOR CreateCC(HWND hOwnerWindow = hMainWindow)
  53.     {
  54.         CHOOSECOLOR cc;
  55.         COLORREF cr[16];
  56.         ZeroMemory(&cc, sizeof(CHOOSECOLOR));
  57.  
  58.         cc.lStructSize = sizeof(CHOOSECOLOR);
  59.         cc.hwndOwner = hOwnerWindow;
  60.         cc.rgbResult = RGB(255, 255, 255);
  61.         cc.lpCustColors = cr;
  62.         cc.Flags = CC_RGBINIT | CC_FULLOPEN;
  63.  
  64.         return cc;
  65.     }
  66.  
  67.     int MessageBox(LPCWSTR text, LPCWSTR caption = L"Alert", long type = MB_OK, HWND hWnd = hMainWindow)
  68.     {
  69.         return MessageBox(hWnd, text, caption, type);
  70.     }
  71.  
  72.     void SetAppState(LPCWSTR state = L"Ready")
  73.     {
  74.         SendMessage(hMainWindowStatusBar, SB_SETTEXT, 0, (LPARAM)state);
  75.     }
  76.  
  77.     void OnKeyDown(WPARAM virtualKeyCode)
  78.     {
  79.         wstring yptfk = L"You pressed the following key: \n";
  80.         int charCode = MapVirtualKey(virtualKeyCode, MAPVK_VK_TO_CHAR);
  81.         WCHAR key = (WCHAR)charCode;
  82.         wstring text = yptfk + L"Character: \"" + key + L"\"\nCharcode: " + to_wstring(charCode);
  83.         MessageBox(text.c_str());
  84.     }
  85.  
  86.     Point GetWindowPos(HWND hWnd = hMainWindow)
  87.     {
  88.         RECT wr;
  89.         GetWindowRect(hWnd, &wr);
  90.         return Point(wr.left, wr.top);
  91.     }
  92.  
  93.     Size AdjustWindowSize(int clientAreaWidth, int clientAreaHeight)
  94.     {
  95.         RECT wr = { 0, 0, clientAreaWidth, clientAreaHeight };
  96.         AdjustWindowRect(&wr, windowStyle, FALSE);
  97.         return Size(wr.right - wr.left, wr.bottom - wr.top);
  98.     }
  99.  
  100.     void SetClientAreaSize(int width, int height, HWND hWnd = hMainWindow)
  101.     {
  102.         clientAreaWidth = width;
  103.         clientAreaHeight = height;
  104.         Size wndSize = AdjustWindowSize(width, height);
  105.         Point wndPos = GetWindowPos();
  106.         MoveWindow(hWnd, wndPos.X, wndPos.Y, wndSize.Width, wndSize.Height, TRUE);
  107.     }
  108.  
  109.     // Not tested yet.
  110.  
  111.     void SetWindowBackgroundImage(LPCWSTR filename, HWND hWnd = hMainWindow)
  112.     {
  113.         HBITMAP hImage = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  114.         SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage);
  115.     }
  116.  
  117.     void RefreshWindow(HWND hWnd = hMainWindow)
  118.     {
  119.         if (isImageLoaded)
  120.         {
  121.             Graphics gc(GetDC(hWnd));
  122.             Rect clientArea(0, 0, clientAreaWidth, clientAreaHeight);
  123.             gc.DrawImage(pOpenImage, clientArea);
  124.         }
  125.         SendMessage(hMainWindowStatusBar, WM_SIZE, NULL, NULL);
  126.     }
  127.  
  128.     ImageCodecInfo* GetICIs()
  129.     {
  130.         UINT numOfEncoders = 0;
  131.         UINT iciBufferSize = 0;
  132.         GetImageEncodersSize(&numOfEncoders, &iciBufferSize);
  133.         ImageCodecInfo* iciBuffer = new ImageCodecInfo[iciBufferSize];
  134.         GetImageEncoders(numOfEncoders, iciBufferSize, iciBuffer);
  135.         return iciBuffer;
  136.     }
  137.  
  138.     CLSID GetEncoderClassIDByMimeType(LPCWSTR mimeType)
  139.     {
  140.         CLSID requestedClsid;
  141.         ImageCodecInfo* icis = GetICIs();
  142.         for (int i = 0; i != sizeof(icis); i++)
  143.         {
  144.             if (icis[i].MimeType == mimeType)
  145.             {
  146.                 requestedClsid == icis[i].Clsid;
  147.             }
  148.         }
  149.         return requestedClsid;
  150.     }
  151.  
  152.     void SaveFile(LPCWSTR filename)
  153.     {
  154.         const CLSID bmpEncoder = GetEncoderClassIDByMimeType(L"image/bmp");
  155.         pOpenImage->Save(filename, &bmpEncoder, NULL);
  156.     }
  157.  
  158.     void LoadFile(LPCWSTR filename)
  159.     {
  160.         EnableMenuItem(ddMenuHandles[Tbi::FileMenu], Tbi::File_Save, MF_BYCOMMAND);
  161.         openImageFilename = filename;
  162.         pOpenImage = Image::FromFile(filename);
  163.         isImageLoaded = TRUE;
  164.         int width = pOpenImage->GetWidth();
  165.         int height = pOpenImage->GetHeight();
  166.         SetClientAreaSize(width, height);
  167.         RefreshWindow();
  168.         SetAppState(L"Loaded image");
  169.     }
  170.  
  171.     void WriteFileA(HANDLE hFile, LPCSTR data)
  172.     {
  173.         WriteFile(hFile, data, strlen(data), 0, NULL);
  174.     }
  175.  
  176.     LPCSTR ToString(int number)
  177.     {
  178.         LPSTR string = "";
  179.         strcpy(string, to_string(number).c_str());
  180.         return string;
  181.     }
  182.  
  183.     void Log(LPCSTR data)
  184.     {
  185.         if (debug)
  186.         {
  187.             WriteFileA(hConsoleOutput, data);
  188.             WriteFileA(hConsoleOutput, "\n");
  189.         }
  190.     }
  191.  
  192.     void Log(int data)
  193.     {
  194.         Log(ToString(data));
  195.     }
  196.  
  197.     LPWSTR GetFilenameToOpen()
  198.     {
  199.         OPENFILENAME ofn = CreateOFN();
  200.         GetOpenFileName(&ofn);
  201.         LPWSTR filename = new WCHAR[MAX_PATH];
  202.         wcscpy(filename, ofn.lpstrFile);
  203.         return filename;
  204.     }
  205.  
  206.     LPWSTR GetFilenameToSave()
  207.     {
  208.         OPENFILENAME ofn = CreateOFN();
  209.         GetSaveFileName(&ofn);
  210.         LPWSTR filename = new WCHAR[MAX_PATH];
  211.         wcscpy(filename, ofn.lpstrFile);
  212.         return filename;
  213.     }
  214.  
  215.     void DrawLine(Point pt1 = prevMousePos, Point pt2 = curMousePos)
  216.     {
  217.         Graphics gc(pOpenImage);
  218.         Pen pen(color, 10);
  219.         gc.DrawLine(&pen, pt1, pt2);
  220.         RefreshWindow();
  221.     }
  222.  
  223.     Point GetMousePos(LPARAM lParam)
  224.     {
  225.         Point mousePos;
  226.         mousePos.X = GET_X_LPARAM(lParam);
  227.         mousePos.Y = GET_Y_LPARAM(lParam);
  228.         return mousePos;
  229.     }
  230.  
  231.     void FlipMousePositions(LPARAM lParam)
  232.     {
  233.         prevMousePos = curMousePos;
  234.         curMousePos = GetMousePos(lParam);
  235.     }
  236.  
  237.     void LogMousePos(Point pos)
  238.     {
  239.         Log("X:");
  240.         Log(pos.X);
  241.         Log("Y:");
  242.         Log(pos.Y);
  243.     }
  244.  
  245.     void PickAColor()
  246.     {
  247.         CHOOSECOLOR cc = CreateCC();
  248.         ChooseColor(&cc);
  249.         COLORREF cr = cc.rgbResult;
  250.         BYTE R = GetRValue(cr);
  251.         BYTE G = GetGValue(cr);
  252.         BYTE B = GetBValue(cr);
  253.         color = Color(R, G, B);
  254.     }
  255.  
  256.     void UncheckAllTbis(Tbi container)
  257.     {
  258.         for (int i = 0; i != 50; i++)
  259.         {
  260.             CheckMenuItem(ddMenuHandles[container], i, MF_BYPOSITION | MF_UNCHECKED);
  261.         }
  262.     }
  263.  
  264.     void CheckTbi(Tbi container, Tbi target)
  265.     {
  266.         UncheckAllTbis(container);
  267.         CheckMenuItem(ddMenuHandles[container], target, MF_BYCOMMAND | MF_CHECKED);
  268.     }
  269.  
  270.     LRESULT CALLBACK OnWindowMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  271.     {
  272.         int mbResult;
  273.         switch (message)
  274.         {
  275.             case WM_CLOSE:
  276.                 if (isImageLoaded)
  277.                 {
  278.                     mbResult = MessageBox(L"Save changes before exiting?", L"Exit", MB_YESNOCANCEL | MB_ICONWARNING);
  279.                     if (mbResult == IDYES)
  280.                     {
  281.                         SaveFile(GetFilenameToSave());
  282.                     }
  283.                     else if(mbResult == IDNO)
  284.                     {
  285.                         DestroyWindow(hWnd);
  286.                     }
  287.                 }
  288.                 else
  289.                 {
  290.                     DestroyWindow(hWnd);
  291.                 }
  292.                 return 0;
  293.             break;
  294.  
  295.             case WM_DESTROY:
  296.                 PostQuitMessage(0);
  297.                 return 0;
  298.             break;
  299.  
  300.             case WM_KEYDOWN:
  301.                 OnKeyDown(wParam);
  302.             break;
  303.  
  304.             case WM_PAINT:
  305.                 RefreshWindow();
  306.             break;
  307.  
  308.             case WM_COMMAND:
  309.                 switch (Tbi tbi = (Tbi)LOWORD(wParam))
  310.                 {
  311.                     case Tbi::File_Open:
  312.                         LoadFile(GetFilenameToOpen());
  313.                     break;
  314.  
  315.                     case Tbi::File_Save:
  316.                         SaveFile(GetFilenameToSave());
  317.                     break;
  318.  
  319.                     case Tbi::Tool_Brush:
  320.                         tool = Tool::Brush;
  321.                         CheckTbi(Tbi::ToolMenu, Tbi::Tool_Brush);
  322.                     break;
  323.  
  324.                     case Tbi::Tool_Line:
  325.                         tool = Tool::Line;
  326.                         CheckTbi(Tbi::ToolMenu, Tbi::Tool_Line);
  327.                     break;
  328.  
  329.                     case Tbi::Tool_ColorPicker:
  330.                         PickAColor();
  331.                     break;
  332.                 }
  333.             break;
  334.            
  335.             case WM_MOUSEMOVE:
  336.                 if (isDrawing)
  337.                 {
  338.                     switch (tool)
  339.                     {
  340.                         case Tool::Brush:
  341.                             FlipMousePositions(lParam);
  342.                             DrawLine();
  343.                         break;
  344.                     }
  345.                 }
  346.             break;
  347.  
  348.             case WM_LBUTTONDOWN:
  349.                 switch (tool)
  350.                 {
  351.                     case Tool::Brush:
  352.                         isDrawing = TRUE;
  353.                         curMousePos = GetMousePos(lParam);
  354.                     break;
  355.  
  356.                     case Tool::Line:
  357.                         isDrawing = TRUE;
  358.                         curMousePos = GetMousePos(lParam);
  359.                     break;
  360.                 }
  361.             break;
  362.  
  363.             case WM_LBUTTONUP:
  364.                 switch (tool)
  365.                 {
  366.                     case Tool::Brush:
  367.                         isDrawing = FALSE;
  368.                     break;
  369.  
  370.                     case Tool::Line:
  371.                         isDrawing = FALSE;
  372.                         FlipMousePositions(lParam);
  373.                         DrawLine();
  374.                     break;
  375.                 }
  376.             break;
  377.         }
  378.         return DefWindowProc(hWnd, message, wParam, lParam);
  379.     }
  380.  
  381.     HWND CreateStatusBar(HWND hParentWindow, int id, LPCWSTR text = L"Ready")
  382.     {
  383.         return CreateStatusWindow(WS_CHILD | WS_VISIBLE, text, hParentWindow, id);
  384.     }
  385.  
  386.     HMENU CreateMainWindowToolbar()
  387.     {
  388.         HMENU hToolbar = CreateMenu();
  389.  
  390.         HMENU hFileMenu = CreatePopupMenu();
  391.         AppendMenu(hFileMenu, MF_STRING, Tbi::File_Open, L"Open");
  392.         AppendMenu(hFileMenu, MF_STRING, Tbi::File_New, L"New");
  393.         AppendMenu(hFileMenu, MF_STRING | MF_DISABLED, Tbi::File_Save, L"Save");
  394.         AppendMenu(hFileMenu, MF_STRING, Tbi::File_Close, L"Close");
  395.  
  396.         HMENU hToolMenu = CreatePopupMenu();
  397.         AppendMenu(hToolMenu, MF_STRING, Tbi::Tool_Line, L"Line");
  398.         AppendMenu(hToolMenu, MF_STRING, Tbi::Tool_Brush, L"Brush");
  399.         AppendMenu(hToolMenu, MF_STRING, Tbi::Tool_ColorPicker, L"Color Picker");
  400.        
  401.         AppendMenu(hToolbar, MF_POPUP, (UINT_PTR)hFileMenu, L"File");
  402.         AppendMenu(hToolbar, MF_POPUP, (UINT_PTR)hToolMenu, L"Tool");
  403.  
  404.         ddMenuHandles.at(Tbi::FileMenu) = hFileMenu;
  405.         ddMenuHandles.at(Tbi::ToolMenu) = hToolMenu;
  406.  
  407.         return hToolbar;
  408.     }
  409.  
  410.     void LoadConsole()
  411.     {
  412.         AllocConsole();
  413.         hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  414.     }
  415.  
  416.     int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  417.     {
  418.         if (debug)
  419.         {
  420.             LoadConsole();
  421.         }
  422.  
  423.         WNDCLASSEX wc;
  424.         ZeroMemory(&wc, sizeof(wc));
  425.  
  426.         wc.cbSize = sizeof(WNDCLASSEX);
  427.         wc.style = CS_HREDRAW | CS_VREDRAW;
  428.         wc.lpfnWndProc = OnWindowMessage;
  429.         wc.hInstance = hInstance;
  430.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  431.         wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  432.         wc.lpszClassName = L"WC_Default";
  433.  
  434.         RegisterClassEx(&wc);
  435.  
  436.         Size sz = AdjustWindowSize(clientAreaWidth, clientAreaHeight);
  437.         HMENU hMainWindowMenu = CreateMainWindowToolbar();
  438.  
  439.         GdiplusStartupInput gdipsi;
  440.         ULONG_PTR gdipToken;
  441.         GdiplusStartup(&gdipToken, &gdipsi, NULL);
  442.  
  443.         hMainWindow = CreateWindowEx
  444.         (
  445.             NULL,
  446.             L"WC_Default",
  447.             L"D3DTest1 Main Window",
  448.             windowStyle,
  449.             300,
  450.             300,
  451.             sz.Width,
  452.             sz.Height,
  453.             NULL,
  454.             hMainWindowMenu,
  455.             hInstance,
  456.             NULL
  457.         );
  458.  
  459.         hMainWindowStatusBar = CreateStatusBar(hMainWindow, 0);
  460.         ShowWindow(hMainWindow, nShowCmd);
  461.  
  462.         MSG message;
  463.         while (GetMessage(&message, NULL, 0, 0))
  464.         {
  465.             TranslateMessage(&message);
  466.             DispatchMessage(&message);
  467.         }
  468.  
  469.         GdiplusShutdown(gdipToken);
  470.  
  471.         return 0;
  472.     }
  473. }
  474.  
  475. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  476. {
  477.     D3DTest1::WinMain(hInstance, hPrevInstance, lpCmdLine, nShowCmd);
  478. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement