Advertisement
vovan333

Win32Project1/main.cpp

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