// EDMaze.cpp : Defines the entry point for the application. // #define _CRT_SECURE_NO_WARNINGS #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif #include "framework.h" #include "resource.h" #include #include #include #include using namespace std; #define BUFF_SIZE (MAX_PATH * 4) //era 100 #define MAX_LOADSTRING MAX_PATH // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name // Forward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK cbkNew(HWND, UINT, WPARAM, LPARAM); void paint(HDC hdc,HWND hWnd); int FileOpen(char *sName); int FileSave(char *sName); void initGrid(int NewNR,int NewNC, bool borders); char *DlgOpenFile(HWND hWnd); char *DlgSaveAsFile(HWND hWnd); const int PEN_WIDTH = 6; const int IDM_N=1010; const int IDM_E=1020; const int IDM_S=1030; const int IDM_W=1040; HMENU hPopupMenu ; char **grid=NULL; int NR=0; int NC=0; int row=-1; int col=-1; char buff[MAX_PATH]; bool borders=false; char *sFile = NULL; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_EDMAZE, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EDMAZE); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage are only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_EDMAZE); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCTSTR)IDC_EDMAZE; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HANDLE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Analizzare le selezioni di menu: switch (wmId) { case ID_FILE_SAVE: { if(NULL != sFile) FileSave(sFile); } break; case ID_FILE_SAVEAS: { sFile=DlgSaveAsFile(hWnd); if (NULL != sFile) { FileSave(sFile); InvalidateRect(hWnd,NULL,true); } } break; case ID_FILE_OPEN: { sFile=DlgOpenFile(hWnd); if (NULL != sFile) { FileOpen(sFile); InvalidateRect(hWnd,NULL,true); } } break; case ID_FILE_NEW: { int dlgResult = DialogBox(hInst, MAKEINTRESOURCE(IDD_NEW), hWnd, (DLGPROC)cbkNew); if(ID_NEW_OK == dlgResult) //initGrid(NR,NC,borders); InvalidateRect(hWnd,NULL,true); } break; case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDM_N: { MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; mii.fMask = MIIM_STATE; GetMenuItemInfo(hPopupMenu, IDM_N, FALSE, &mii); mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hPopupMenu, IDM_N, FALSE, &mii); if(mii.fState==MFS_CHECKED) grid[row][col] |= 0x01 << 2; else grid[row][col] &= ~ (0x01 << 2); row=col=-1; InvalidateRect(hWnd,NULL,true); } break; case IDM_E: { MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; mii.fMask = MIIM_STATE; GetMenuItemInfo(hPopupMenu, IDM_E, FALSE, &mii); mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hPopupMenu, IDM_E, FALSE, &mii); if(mii.fState==MFS_CHECKED) grid[row][col] |= 0x01 << 0; else grid[row][col] &= ~ (0x01 << 0); //int v= grid[row][col]; row=col=-1; InvalidateRect(hWnd,NULL,true); } break; case IDM_S: { MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; mii.fMask = MIIM_STATE; GetMenuItemInfo(hPopupMenu, IDM_S, FALSE, &mii); mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hPopupMenu, IDM_S, FALSE, &mii); if(mii.fState==MFS_CHECKED) { int v=grid[row][col]; grid[row][col] |= 0x01 << 1; v=grid[row][col]; v=v; } else grid[row][col] &= ~ (0x01 << 1); row=col=-1; InvalidateRect(hWnd,NULL,true); } break; case IDM_W: { MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; mii.fMask = MIIM_STATE; GetMenuItemInfo(hPopupMenu, IDM_W, FALSE, &mii); mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hPopupMenu, IDM_W, FALSE, &mii); if(mii.fState==MFS_CHECKED) grid[row][col] |= 0x01 << 3; else grid[row][col] &= ~ (0x01 << 3); int v= grid[row][col]; row=col=-1; InvalidateRect(hWnd,NULL,true); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); // TODO: aggiungere qui il codice per il disegno... if (sFile) { WideCharToMultiByte(CP_ACP, 0, szTitle, lstrlen(szTitle), buff, BUFF_SIZE, NULL, NULL); string sTitle; sTitle.append(buff); sTitle.append(" - "); sTitle.append(sFile); SetWindowTextA(hWnd,sTitle.c_str()); } paint(hdc,hWnd); EndPaint(hWnd, &ps); } break; //case WM_RBUTTONDOWN: case WM_CONTEXTMENU: { POINT p; p.x=LOWORD(lParam); p.y=HIWORD(lParam); RECT rcCli; GetClientRect(hWnd,&rcCli); int CW=(rcCli.right -rcCli.left)/NC; int CH=(rcCli.bottom-rcCli.top)/NR; CW=CH; ScreenToClient(hWnd,&p); col=p.x / CW; row= p.y / CH ; if (p.x < (NC+0)*CW){ if (NULL == hPopupMenu) { hPopupMenu = CreatePopupMenu(); InsertMenuA(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, IDM_N, "N"); InsertMenuA(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, IDM_E, "E"); InsertMenuA(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, IDM_S, "S"); InsertMenuA(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, IDM_W, "W"); } bool bCheck = false; // int v=grid[row][col]; bCheck = grid[row][col] & 0x04; CheckMenuItem( hPopupMenu, IDM_N, (bCheck) ? MF_CHECKED : MF_UNCHECKED ); bCheck = grid[row][col] & 0x01; CheckMenuItem( hPopupMenu, IDM_E, (bCheck) ? MF_CHECKED : MF_UNCHECKED ); bCheck = grid[row][col] & 0x02; CheckMenuItem( hPopupMenu, IDM_S, (bCheck) ? MF_CHECKED : MF_UNCHECKED ); bCheck = grid[row][col] & 0x08; CheckMenuItem( hPopupMenu, IDM_W, (bCheck) ? MF_CHECKED : MF_UNCHECKED ); SetForegroundWindow(hWnd); //ScreenToClient(hWnd,&p); ClientToScreen(hWnd, &p);//TPM_BOTTOMALIGN | TPM_LEFTALIGN TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, 0, hWnd, NULL); } } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_CREATE: { //initGrid(NR,NC); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Gestore dei messaggi della finestra Informazioni su. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } LRESULT CALLBACK cbkNew(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: { SetDlgItemTextA(hDlg,IDC_NROWS,_itoa(NR,buff,10)); SetDlgItemTextA(hDlg,IDC_NCOLS,_itoa(NC,buff,10)); SendDlgItemMessageA(hDlg, IDC_BORDERS, BM_SETCHECK, (borders? BST_CHECKED:BST_UNCHECKED), 0); } return (INT_PTR)TRUE; case WM_COMMAND: { if(LOWORD(wParam) == ID_NEW_OK || LOWORD(wParam) == ID_NEW_CANCEL) { if (LOWORD(wParam) == ID_NEW_OK) { int newNR,newNC; GetDlgItemTextA(hDlg,IDC_NROWS,buff,sizeof(buff)); newNR = atoi(buff); GetDlgItemTextA(hDlg,IDC_NCOLS,buff,sizeof(buff)); newNC = atoi(buff); LRESULT chkState = SendDlgItemMessage(hDlg, IDC_BORDERS, BM_GETCHECK, 0, 0); borders=(chkState == BST_CHECKED ? true:false); initGrid(newNR,newNC,borders); } EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } } break; } return (INT_PTR)FALSE; } char *DlgOpenFile(HWND hWnd) { OPENFILENAMEA ofn; char szFile[MAX_PATH]; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileNameA(&ofn)==TRUE) { char * sTmp; sTmp = (char *)malloc((strlen(ofn.lpstrFile)+1)*sizeof(char)); strcpy(sTmp, ofn.lpstrFile); return sTmp; } return NULL; } char *DlgSaveAsFile(HWND hWnd) { OPENFILENAMEA ofn; char szFile[MAX_PATH]; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags =OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT; if (GetSaveFileNameA(&ofn)==TRUE) { char * sTmp; sTmp = (char *)malloc((strlen(ofn.lpstrFile)+1)*sizeof(char)); strcpy(sTmp, ofn.lpstrFile); return sTmp; } return NULL; } void initGrid(int NewNR,int NewNC, bool borders) { if(NewNR < 0 || NewNC < 0) return; if (NULL != grid) { for(int i = 0; i < NR; ++i) { delete [] grid[i]; } delete [] grid; grid=NULL; } NR = NewNR; NC = NewNC; grid = new char*[NR]; for(int i = 0; i < NR; ++i) { grid[i] = new char[NC]; for(int j=0; j < NC; j++) { grid[i][j] = 0; if(borders) { if(0==j){ grid[i][j] |= 0x08; //grid[i][j] |= 0x01; //grid[i][j] |= 0x04; } if (0==i) { //grid[i][j] |= 0x08; //grid[i][j] |= 0x01; grid[i][j] |= 0x04; } //if(0==j) // grid[i][j] |= 0x04; //0x08 if(NC-1==j) grid[i][j] |= 0x01;//0x02 if(NR-1==i) grid[i][j] |= 0x02;//0x04 } } } } int FileSave(char *sName) { if (NULL==grid) return 0; ofstream myfile; myfile.open (sName); for (int i=0; i < NR; i++) { for(int j=0; j < NC; j++) { //for (int k=4; k >0; k--) for (int k=0; k < 4; k++) { //int g=grid[i][j]; myfile << (grid[i][j] & (0x01 << (4-1 - k))? '1':'0'); } } myfile << endl; } myfile.close(); return 1; } int FileOpen(char *sName) { ifstream myfile; myfile.open (sName); string mystr; NR=0; NC=0; while(myfile >> mystr) { NR++; NC = mystr.length()/4; } initGrid(NR,NC,false); myfile.clear(); myfile.seekg(0, ios::beg); int i=0; int d; while(myfile >> mystr) { for (int j=0; j < NC; j++) { d=0; char c=NULL; for(int k=0; k < 4; k++) { c= mystr.at(j*4+k); if('1' == c) grid[i][j] |= 0x01 << (4-k-1); d=grid[i][j]; } } i++; } myfile.close(); return 1; } void paint(HDC hdc,HWND hWnd) { if(NR <=0 || NC <=0) return; RECT rcCli; GetClientRect(hWnd,&rcCli); int CW=(rcCli.right -rcCli.left)/NC; int CH=(rcCli.bottom-rcCli.top)/NR; CW=CH; for(int i=0; i < NR; i++) for(int j=0; j < NC; j++) { Rectangle(hdc,j*CW,i*CH,(j+1)*CW,(i+1)*CH); if(grid && (grid[i][j] & 0x04))//N1 { HPEN hPenOri,hPen; hPen = CreatePen(PS_SOLID,PEN_WIDTH,RGB(255,0,0)); hPenOri = (HPEN)SelectObject(hdc, hPen); MoveToEx(hdc,j*CW,i*CH,NULL); LineTo(hdc,(j+1)*CW,(i)*CH); SelectObject(hdc, hPenOri); DeleteObject(hPen); } if(grid && (grid[i][j] & 0x01)) //E2 { HPEN hPenOri,hPen; hPen = CreatePen(PS_SOLID,PEN_WIDTH,RGB(255,0,0)); hPenOri = (HPEN)SelectObject(hdc, hPen); MoveToEx(hdc,(j+1)*CH,i*CW,NULL); LineTo(hdc,(j+1)*CH,(i+1)*CW); SelectObject(hdc, hPenOri); DeleteObject(hPen); } if(grid && (grid[i][j] & 0x02)) //S4 { HPEN hPenOri,hPen; hPen = CreatePen(PS_SOLID,PEN_WIDTH,RGB(255,0,0)); hPenOri = (HPEN)SelectObject(hdc, hPen); MoveToEx(hdc,j*CW,(i+1)*CH,NULL); LineTo(hdc,(j+1)*CW,(i+1)*CH); SelectObject(hdc, hPenOri); DeleteObject(hPen); } if(grid && (grid[i][j] & 0x08)) //W { HPEN hPenOri,hPen; hPen = CreatePen(PS_SOLID,PEN_WIDTH,RGB(255,0,0)); hPenOri = (HPEN)SelectObject(hdc, hPen); MoveToEx(hdc,j*CH,(i)*CW,NULL); LineTo(hdc,(j)*CH,(i+1)*CW); SelectObject(hdc, hPenOri); DeleteObject(hPen); } } }