1c2c66affSColin Finck /* 2c2c66affSColin Finck * PROJECT: PAINT for ReactOS 38f1f1c7aSStanislav Motylkov * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) 4*bf13ebdaSKatayama Hirofumi MZ * PURPOSE: The main window and wWinMain etc. 5f5200e6cSStanislav Motylkov * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> 6*bf13ebdaSKatayama Hirofumi MZ * Copyright 2017-2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 7*bf13ebdaSKatayama Hirofumi MZ * Copyright 2018 Stanislav Motylkov <x86corez@gmail.com> 8c2c66affSColin Finck */ 9c2c66affSColin Finck 10c2c66affSColin Finck #include "precomp.h" 11c2c66affSColin Finck 12d7ece626SKatayama Hirofumi MZ #include <dlgs.h> 13ba53f72aSKatayama Hirofumi MZ #include <mapi.h> 14*bf13ebdaSKatayama Hirofumi MZ #include <assert.h> 15ba53f72aSKatayama Hirofumi MZ 16e8c7e300SKatayama Hirofumi MZ BOOL g_askBeforeEnlarging = FALSE; // TODO: initialize from registry 17e8c7e300SKatayama Hirofumi MZ HINSTANCE g_hinstExe = NULL; 18640d67d1SKatayama Hirofumi MZ WCHAR g_szFileName[MAX_LONG_PATH] = { 0 }; 19ba53f72aSKatayama Hirofumi MZ WCHAR g_szMailTempFile[MAX_LONG_PATH] = { 0 }; 20e8c7e300SKatayama Hirofumi MZ BOOL g_isAFile = FALSE; 21e8c7e300SKatayama Hirofumi MZ BOOL g_imageSaved = FALSE; 22e8c7e300SKatayama Hirofumi MZ BOOL g_showGrid = FALSE; 23*bf13ebdaSKatayama Hirofumi MZ HWND g_hStatusBar = NULL; 24c2c66affSColin Finck 25c2c66affSColin Finck CMainWindow mainWindow; 2629e147beSKatayama Hirofumi MZ 27*bf13ebdaSKatayama Hirofumi MZ typedef HWND (WINAPI *FN_HtmlHelpW)(HWND, LPCWSTR, UINT, DWORD_PTR); 28*bf13ebdaSKatayama Hirofumi MZ 29*bf13ebdaSKatayama Hirofumi MZ static HINSTANCE s_hHHCTRL_OCX = NULL; // HtmlHelpW needs "hhctrl.ocx" 30*bf13ebdaSKatayama Hirofumi MZ static FN_HtmlHelpW s_pHtmlHelpW = NULL; 31*bf13ebdaSKatayama Hirofumi MZ 3229e147beSKatayama Hirofumi MZ /* FUNCTIONS ********************************************************/ 33c2c66affSColin Finck 34ab199cc1SKatayama Hirofumi MZ void ShowOutOfMemory(void) 35ab199cc1SKatayama Hirofumi MZ { 36ab199cc1SKatayama Hirofumi MZ WCHAR szText[256]; 37ab199cc1SKatayama Hirofumi MZ ::FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, 38ab199cc1SKatayama Hirofumi MZ NULL, 39ab199cc1SKatayama Hirofumi MZ ERROR_OUTOFMEMORY, 40ab199cc1SKatayama Hirofumi MZ 0, 41ab199cc1SKatayama Hirofumi MZ szText, _countof(szText), 42ab199cc1SKatayama Hirofumi MZ NULL); 43ab199cc1SKatayama Hirofumi MZ mainWindow.MessageBox(szText, NULL, MB_ICONERROR); 44ab199cc1SKatayama Hirofumi MZ } 45ab199cc1SKatayama Hirofumi MZ 46c2c66affSColin Finck // get file name extension from filter string 47c2c66affSColin Finck static BOOL 48640d67d1SKatayama Hirofumi MZ FileExtFromFilter(LPWSTR pExt, OPENFILENAME *pOFN) 49c2c66affSColin Finck { 50640d67d1SKatayama Hirofumi MZ LPWSTR pchExt = pExt; 51c2c66affSColin Finck *pchExt = 0; 52c2c66affSColin Finck 53c2c66affSColin Finck DWORD nIndex = 1; 54640d67d1SKatayama Hirofumi MZ for (LPCWSTR pch = pOFN->lpstrFilter; *pch; ++nIndex) 55c2c66affSColin Finck { 56c2c66affSColin Finck pch += lstrlen(pch) + 1; 57c2c66affSColin Finck if (pOFN->nFilterIndex == nIndex) 58c2c66affSColin Finck { 59640d67d1SKatayama Hirofumi MZ for (++pch; *pch && *pch != L';'; ++pch) 60c2c66affSColin Finck { 61c2c66affSColin Finck *pchExt++ = *pch; 62c2c66affSColin Finck } 63c2c66affSColin Finck *pchExt = 0; 64c2c66affSColin Finck CharLower(pExt); 65c2c66affSColin Finck return TRUE; 66c2c66affSColin Finck } 67d7ece626SKatayama Hirofumi MZ pch += wcslen(pch) + 1; 68c2c66affSColin Finck } 69c2c66affSColin Finck return FALSE; 70c2c66affSColin Finck } 71c2c66affSColin Finck 72c2c66affSColin Finck // Hook procedure for OPENFILENAME to change the file name extension 73c2c66affSColin Finck static UINT_PTR APIENTRY 74c2c66affSColin Finck OFNHookProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 75c2c66affSColin Finck { 76c2c66affSColin Finck HWND hParent; 77640d67d1SKatayama Hirofumi MZ OFNOTIFYW *pon; 78d7ece626SKatayama Hirofumi MZ WCHAR Path[MAX_PATH]; 79c2c66affSColin Finck switch (uMsg) 80c2c66affSColin Finck { 81c2c66affSColin Finck case WM_NOTIFY: 82640d67d1SKatayama Hirofumi MZ pon = (OFNOTIFYW *)lParam; 83c2c66affSColin Finck if (pon->hdr.code == CDN_TYPECHANGE) 84c2c66affSColin Finck { 85c2c66affSColin Finck hParent = GetParent(hwnd); 86d7ece626SKatayama Hirofumi MZ SendMessageW(hParent, CDM_GETFILEPATH, _countof(Path), (LPARAM)Path); 87d7ece626SKatayama Hirofumi MZ FileExtFromFilter(PathFindExtensionW(Path), pon->lpOFN); 88d7ece626SKatayama Hirofumi MZ SendMessageW(hParent, CDM_SETCONTROLTEXT, cmb13, (LPARAM)PathFindFileNameW(Path)); 89d7ece626SKatayama Hirofumi MZ StringCchCopyW(pon->lpOFN->lpstrFile, pon->lpOFN->nMaxFile, Path); 90c2c66affSColin Finck } 91c2c66affSColin Finck break; 92c2c66affSColin Finck } 93c2c66affSColin Finck return 0; 94c2c66affSColin Finck } 95c2c66affSColin Finck 96ba53f72aSKatayama Hirofumi MZ typedef ULONG (WINAPI *FN_MAPISendMail)(LHANDLE, ULONG_PTR, lpMapiMessage, FLAGS, ULONG); 97ba53f72aSKatayama Hirofumi MZ typedef ULONG (WINAPI *FN_MAPISendMailW)(LHANDLE, ULONG_PTR, lpMapiMessageW, FLAGS, ULONG); 98ba53f72aSKatayama Hirofumi MZ 99ba53f72aSKatayama Hirofumi MZ BOOL OpenMailer(HWND hWnd, LPCWSTR pszPathName) 100ba53f72aSKatayama Hirofumi MZ { 101ba53f72aSKatayama Hirofumi MZ // Delete the temporary file if any 102ba53f72aSKatayama Hirofumi MZ if (g_szMailTempFile[0]) 103ba53f72aSKatayama Hirofumi MZ { 104ba53f72aSKatayama Hirofumi MZ ::DeleteFileW(g_szMailTempFile); 105ba53f72aSKatayama Hirofumi MZ g_szMailTempFile[0] = UNICODE_NULL; 106ba53f72aSKatayama Hirofumi MZ } 107ba53f72aSKatayama Hirofumi MZ 108ba53f72aSKatayama Hirofumi MZ CStringW strFileTitle; 109ba53f72aSKatayama Hirofumi MZ if (PathFileExistsW(pszPathName) && imageModel.IsImageSaved()) 110ba53f72aSKatayama Hirofumi MZ { 111ba53f72aSKatayama Hirofumi MZ strFileTitle = PathFindFileNameW(pszPathName); 112ba53f72aSKatayama Hirofumi MZ } 113ba53f72aSKatayama Hirofumi MZ else // Not existing or not saved 114ba53f72aSKatayama Hirofumi MZ { 115ba53f72aSKatayama Hirofumi MZ // Get the name of a temporary file 116ba53f72aSKatayama Hirofumi MZ WCHAR szTempDir[MAX_PATH]; 117ba53f72aSKatayama Hirofumi MZ ::GetTempPathW(_countof(szTempDir), szTempDir); 118ba53f72aSKatayama Hirofumi MZ if (!::GetTempFileNameW(szTempDir, L"afx", 0, g_szMailTempFile)) 119ba53f72aSKatayama Hirofumi MZ return FALSE; // Failure 120ba53f72aSKatayama Hirofumi MZ 121ba53f72aSKatayama Hirofumi MZ if (PathFileExistsW(g_szFileName)) 122ba53f72aSKatayama Hirofumi MZ { 123ba53f72aSKatayama Hirofumi MZ // Set file title 124ba53f72aSKatayama Hirofumi MZ strFileTitle = PathFindFileNameW(g_szFileName); 125ba53f72aSKatayama Hirofumi MZ 126ba53f72aSKatayama Hirofumi MZ // Copy to the temporary file 127ba53f72aSKatayama Hirofumi MZ if (!::CopyFileW(g_szFileName, g_szMailTempFile, FALSE)) 128ba53f72aSKatayama Hirofumi MZ { 129ba53f72aSKatayama Hirofumi MZ g_szMailTempFile[0] = UNICODE_NULL; 130ba53f72aSKatayama Hirofumi MZ return FALSE; // Failure 131ba53f72aSKatayama Hirofumi MZ } 132ba53f72aSKatayama Hirofumi MZ } 133ba53f72aSKatayama Hirofumi MZ else 134ba53f72aSKatayama Hirofumi MZ { 135ba53f72aSKatayama Hirofumi MZ // Set file title 136ba53f72aSKatayama Hirofumi MZ strFileTitle.LoadString(IDS_DEFAULTFILENAME); 137ba53f72aSKatayama Hirofumi MZ strFileTitle += L".png"; 138ba53f72aSKatayama Hirofumi MZ 139ba53f72aSKatayama Hirofumi MZ // Save it to the temporary file 140bbb33a6eSKatayama Hirofumi MZ HBITMAP hbmLocked = imageModel.LockBitmap(); 141bbb33a6eSKatayama Hirofumi MZ BOOL ret = SaveDIBToFile(hbmLocked, g_szMailTempFile, FALSE, Gdiplus::ImageFormatPNG); 142bbb33a6eSKatayama Hirofumi MZ imageModel.UnlockBitmap(hbmLocked); 143ba53f72aSKatayama Hirofumi MZ if (!ret) 144ba53f72aSKatayama Hirofumi MZ { 145ba53f72aSKatayama Hirofumi MZ g_szMailTempFile[0] = UNICODE_NULL; 146ba53f72aSKatayama Hirofumi MZ return FALSE; // Failure 147ba53f72aSKatayama Hirofumi MZ } 148ba53f72aSKatayama Hirofumi MZ } 149ba53f72aSKatayama Hirofumi MZ 150ba53f72aSKatayama Hirofumi MZ // Use the temporary file 151ba53f72aSKatayama Hirofumi MZ pszPathName = g_szMailTempFile; 152ba53f72aSKatayama Hirofumi MZ } 153ba53f72aSKatayama Hirofumi MZ 154ba53f72aSKatayama Hirofumi MZ // Load "mapi32.dll" 155ba53f72aSKatayama Hirofumi MZ HINSTANCE hMAPI = LoadLibraryW(L"mapi32.dll"); 156ba53f72aSKatayama Hirofumi MZ if (!hMAPI) 157ba53f72aSKatayama Hirofumi MZ return FALSE; // Failure 158ba53f72aSKatayama Hirofumi MZ 159ba53f72aSKatayama Hirofumi MZ // Attachment 160ba53f72aSKatayama Hirofumi MZ MapiFileDescW attachmentW = { 0 }; 161ba53f72aSKatayama Hirofumi MZ attachmentW.nPosition = (ULONG)-1; 162ba53f72aSKatayama Hirofumi MZ attachmentW.lpszPathName = (LPWSTR)pszPathName; 163ba53f72aSKatayama Hirofumi MZ attachmentW.lpszFileName = (LPWSTR)(LPCWSTR)strFileTitle; 164ba53f72aSKatayama Hirofumi MZ 165ba53f72aSKatayama Hirofumi MZ // Message with attachment 166ba53f72aSKatayama Hirofumi MZ MapiMessageW messageW = { 0 }; 167ba53f72aSKatayama Hirofumi MZ messageW.lpszSubject = NULL; 168ba53f72aSKatayama Hirofumi MZ messageW.nFileCount = 1; 169ba53f72aSKatayama Hirofumi MZ messageW.lpFiles = &attachmentW; 170ba53f72aSKatayama Hirofumi MZ 171ba53f72aSKatayama Hirofumi MZ // First, try to open the mailer by the function of Unicode version 172ba53f72aSKatayama Hirofumi MZ FN_MAPISendMailW pMAPISendMailW = (FN_MAPISendMailW)::GetProcAddress(hMAPI, "MAPISendMailW"); 173ba53f72aSKatayama Hirofumi MZ if (pMAPISendMailW) 174ba53f72aSKatayama Hirofumi MZ { 175ba53f72aSKatayama Hirofumi MZ pMAPISendMailW(0, (ULONG_PTR)hWnd, &messageW, MAPI_DIALOG | MAPI_LOGON_UI, 0); 176ba53f72aSKatayama Hirofumi MZ ::FreeLibrary(hMAPI); 177ba53f72aSKatayama Hirofumi MZ return TRUE; // MAPISendMailW will show an error message on failure 178ba53f72aSKatayama Hirofumi MZ } 179ba53f72aSKatayama Hirofumi MZ 180ba53f72aSKatayama Hirofumi MZ // Convert to ANSI strings 181ba53f72aSKatayama Hirofumi MZ CStringA szPathNameA(pszPathName), szFileTitleA(strFileTitle); 182ba53f72aSKatayama Hirofumi MZ 183ba53f72aSKatayama Hirofumi MZ MapiFileDesc attachment = { 0 }; 184ba53f72aSKatayama Hirofumi MZ attachment.nPosition = (ULONG)-1; 185ba53f72aSKatayama Hirofumi MZ attachment.lpszPathName = (LPSTR)(LPCSTR)szPathNameA; 186ba53f72aSKatayama Hirofumi MZ attachment.lpszFileName = (LPSTR)(LPCSTR)szFileTitleA; 187ba53f72aSKatayama Hirofumi MZ 188ba53f72aSKatayama Hirofumi MZ MapiMessage message = { 0 }; 189ba53f72aSKatayama Hirofumi MZ message.lpszSubject = NULL; 190ba53f72aSKatayama Hirofumi MZ message.nFileCount = 1; 191ba53f72aSKatayama Hirofumi MZ message.lpFiles = &attachment; 192ba53f72aSKatayama Hirofumi MZ 193ba53f72aSKatayama Hirofumi MZ // Try again but in ANSI version 194ba53f72aSKatayama Hirofumi MZ FN_MAPISendMail pMAPISendMail = (FN_MAPISendMail)::GetProcAddress(hMAPI, "MAPISendMail"); 195ba53f72aSKatayama Hirofumi MZ if (pMAPISendMail) 196ba53f72aSKatayama Hirofumi MZ { 197ba53f72aSKatayama Hirofumi MZ pMAPISendMail(0, (ULONG_PTR)hWnd, &message, MAPI_DIALOG | MAPI_LOGON_UI, 0); 198ba53f72aSKatayama Hirofumi MZ ::FreeLibrary(hMAPI); 199ba53f72aSKatayama Hirofumi MZ return TRUE; // MAPISendMail will show an error message on failure 200ba53f72aSKatayama Hirofumi MZ } 201ba53f72aSKatayama Hirofumi MZ 202ba53f72aSKatayama Hirofumi MZ ::FreeLibrary(hMAPI); 203ba53f72aSKatayama Hirofumi MZ return FALSE; // Failure 204ba53f72aSKatayama Hirofumi MZ } 205ba53f72aSKatayama Hirofumi MZ 206640d67d1SKatayama Hirofumi MZ BOOL CMainWindow::GetOpenFileName(IN OUT LPWSTR pszFile, INT cchMaxFile) 207c2c66affSColin Finck { 208640d67d1SKatayama Hirofumi MZ static OPENFILENAMEW ofn = { 0 }; 209640d67d1SKatayama Hirofumi MZ static CStringW strFilter; 210c2c66affSColin Finck 21129e147beSKatayama Hirofumi MZ if (ofn.lStructSize == 0) 212c2c66affSColin Finck { 21329e147beSKatayama Hirofumi MZ // The "All Files" item text 214640d67d1SKatayama Hirofumi MZ CStringW strAllPictureFiles; 215e8c7e300SKatayama Hirofumi MZ strAllPictureFiles.LoadString(g_hinstExe, IDS_ALLPICTUREFILES); 21629e147beSKatayama Hirofumi MZ 21729e147beSKatayama Hirofumi MZ // Get the import filter 21829e147beSKatayama Hirofumi MZ CSimpleArray<GUID> aguidFileTypesI; 21929e147beSKatayama Hirofumi MZ CImage::GetImporterFilterString(strFilter, aguidFileTypesI, strAllPictureFiles, 220b69a7460SKatayama Hirofumi MZ CImage::excludeDefaultLoad, L'|'); 221b69a7460SKatayama Hirofumi MZ strFilter.Replace(L'|', UNICODE_NULL); 22229e147beSKatayama Hirofumi MZ 22329e147beSKatayama Hirofumi MZ // Initializing the OPENFILENAME structure for GetOpenFileName 22429e147beSKatayama Hirofumi MZ ZeroMemory(&ofn, sizeof(ofn)); 22529e147beSKatayama Hirofumi MZ ofn.lStructSize = sizeof(ofn); 22629e147beSKatayama Hirofumi MZ ofn.hwndOwner = m_hWnd; 227e8c7e300SKatayama Hirofumi MZ ofn.hInstance = g_hinstExe; 22829e147beSKatayama Hirofumi MZ ofn.lpstrFilter = strFilter; 229bebdfda8SKatayama Hirofumi MZ ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY; 2304e6e22e6SKatayama Hirofumi MZ ofn.lpstrDefExt = L"png"; 23129e147beSKatayama Hirofumi MZ } 232c2c66affSColin Finck 23329e147beSKatayama Hirofumi MZ ofn.lpstrFile = pszFile; 23429e147beSKatayama Hirofumi MZ ofn.nMaxFile = cchMaxFile; 235640d67d1SKatayama Hirofumi MZ return ::GetOpenFileNameW(&ofn); 23629e147beSKatayama Hirofumi MZ } 23729e147beSKatayama Hirofumi MZ 238640d67d1SKatayama Hirofumi MZ BOOL CMainWindow::GetSaveFileName(IN OUT LPWSTR pszFile, INT cchMaxFile) 23929e147beSKatayama Hirofumi MZ { 240640d67d1SKatayama Hirofumi MZ static OPENFILENAMEW sfn = { 0 }; 241640d67d1SKatayama Hirofumi MZ static CStringW strFilter; 24229e147beSKatayama Hirofumi MZ 24329e147beSKatayama Hirofumi MZ if (sfn.lStructSize == 0) 24429e147beSKatayama Hirofumi MZ { 24529e147beSKatayama Hirofumi MZ // Get the export filter 246c2c66affSColin Finck CSimpleArray<GUID> aguidFileTypesE; 24729e147beSKatayama Hirofumi MZ CImage::GetExporterFilterString(strFilter, aguidFileTypesE, NULL, 248b69a7460SKatayama Hirofumi MZ CImage::excludeDefaultSave, L'|'); 249b69a7460SKatayama Hirofumi MZ strFilter.Replace(L'|', UNICODE_NULL); 25029e147beSKatayama Hirofumi MZ 25129e147beSKatayama Hirofumi MZ // Initializing the OPENFILENAME structure for GetSaveFileName 25229e147beSKatayama Hirofumi MZ ZeroMemory(&sfn, sizeof(sfn)); 25329e147beSKatayama Hirofumi MZ sfn.lStructSize = sizeof(sfn); 25429e147beSKatayama Hirofumi MZ sfn.hwndOwner = m_hWnd; 255e8c7e300SKatayama Hirofumi MZ sfn.hInstance = g_hinstExe; 25629e147beSKatayama Hirofumi MZ sfn.lpstrFilter = strFilter; 25729e147beSKatayama Hirofumi MZ sfn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_ENABLEHOOK; 258c2c66affSColin Finck sfn.lpfnHook = OFNHookProc; 2594e6e22e6SKatayama Hirofumi MZ sfn.lpstrDefExt = L"png"; 26029e147beSKatayama Hirofumi MZ 26119d88628SKatayama Hirofumi MZ LPWSTR pchDotExt = PathFindExtensionW(pszFile); 26219d88628SKatayama Hirofumi MZ if (*pchDotExt == UNICODE_NULL) 26319d88628SKatayama Hirofumi MZ { 2644e6e22e6SKatayama Hirofumi MZ // Choose PNG 265d7ece626SKatayama Hirofumi MZ StringCchCatW(pszFile, cchMaxFile, L".png"); 2664e6e22e6SKatayama Hirofumi MZ for (INT i = 0; i < aguidFileTypesE.GetSize(); ++i) 2674e6e22e6SKatayama Hirofumi MZ { 2684e6e22e6SKatayama Hirofumi MZ if (aguidFileTypesE[i] == Gdiplus::ImageFormatPNG) 2694e6e22e6SKatayama Hirofumi MZ { 2704e6e22e6SKatayama Hirofumi MZ sfn.nFilterIndex = i + 1; 2714e6e22e6SKatayama Hirofumi MZ break; 2724e6e22e6SKatayama Hirofumi MZ } 2734e6e22e6SKatayama Hirofumi MZ } 274c2c66affSColin Finck } 27519d88628SKatayama Hirofumi MZ } 276c2c66affSColin Finck 27729e147beSKatayama Hirofumi MZ sfn.lpstrFile = pszFile; 27829e147beSKatayama Hirofumi MZ sfn.nMaxFile = cchMaxFile; 279640d67d1SKatayama Hirofumi MZ return ::GetSaveFileNameW(&sfn); 28029e147beSKatayama Hirofumi MZ } 28129e147beSKatayama Hirofumi MZ 28229e147beSKatayama Hirofumi MZ BOOL CMainWindow::ChooseColor(IN OUT COLORREF *prgbColor) 28329e147beSKatayama Hirofumi MZ { 28429e147beSKatayama Hirofumi MZ static CHOOSECOLOR choosecolor = { 0 }; 28529e147beSKatayama Hirofumi MZ static COLORREF custColors[16] = 28629e147beSKatayama Hirofumi MZ { 28729e147beSKatayama Hirofumi MZ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 28829e147beSKatayama Hirofumi MZ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff 28929e147beSKatayama Hirofumi MZ }; 29029e147beSKatayama Hirofumi MZ 29129e147beSKatayama Hirofumi MZ if (choosecolor.lStructSize == 0) 29229e147beSKatayama Hirofumi MZ { 29329e147beSKatayama Hirofumi MZ // Initializing the CHOOSECOLOR structure for ChooseColor 29429e147beSKatayama Hirofumi MZ ZeroMemory(&choosecolor, sizeof(choosecolor)); 29529e147beSKatayama Hirofumi MZ choosecolor.lStructSize = sizeof(choosecolor); 29629e147beSKatayama Hirofumi MZ choosecolor.hwndOwner = m_hWnd; 29729e147beSKatayama Hirofumi MZ choosecolor.lpCustColors = custColors; 29829e147beSKatayama Hirofumi MZ } 29929e147beSKatayama Hirofumi MZ 3000087ea65SKatayama Hirofumi MZ choosecolor.Flags = CC_RGBINIT; 30129e147beSKatayama Hirofumi MZ choosecolor.rgbResult = *prgbColor; 30229e147beSKatayama Hirofumi MZ if (!::ChooseColor(&choosecolor)) 30329e147beSKatayama Hirofumi MZ return FALSE; 30429e147beSKatayama Hirofumi MZ 30529e147beSKatayama Hirofumi MZ *prgbColor = choosecolor.rgbResult; 30629e147beSKatayama Hirofumi MZ return TRUE; 30729e147beSKatayama Hirofumi MZ } 30829e147beSKatayama Hirofumi MZ 30929e147beSKatayama Hirofumi MZ HWND CMainWindow::DoCreate() 31029e147beSKatayama Hirofumi MZ { 311640d67d1SKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_DEFAULTFILENAME, g_szFileName, _countof(g_szFileName)); 31229e147beSKatayama Hirofumi MZ 313640d67d1SKatayama Hirofumi MZ CStringW strTitle; 314e8c7e300SKatayama Hirofumi MZ strTitle.Format(IDS_WINDOWTITLE, PathFindFileName(g_szFileName)); 31529e147beSKatayama Hirofumi MZ 31629e147beSKatayama Hirofumi MZ RECT& rc = registrySettings.WindowPlacement.rcNormalPosition; 31729e147beSKatayama Hirofumi MZ return Create(HWND_DESKTOP, rc, strTitle, WS_OVERLAPPEDWINDOW, WS_EX_ACCEPTFILES); 31829e147beSKatayama Hirofumi MZ } 31929e147beSKatayama Hirofumi MZ 320*bf13ebdaSKatayama Hirofumi MZ // A wrapper function for HtmlHelpW 321*bf13ebdaSKatayama Hirofumi MZ static HWND DoHtmlHelpW(HWND hwndCaller, LPCWSTR pszFile, UINT uCommand, DWORD_PTR dwData) 322*bf13ebdaSKatayama Hirofumi MZ { 323*bf13ebdaSKatayama Hirofumi MZ WCHAR szPath[MAX_PATH]; 324*bf13ebdaSKatayama Hirofumi MZ 325*bf13ebdaSKatayama Hirofumi MZ if (!s_hHHCTRL_OCX && (uCommand != HH_CLOSE_ALL)) 326*bf13ebdaSKatayama Hirofumi MZ { 327*bf13ebdaSKatayama Hirofumi MZ // The function loads the system library, not local 328*bf13ebdaSKatayama Hirofumi MZ GetSystemDirectoryW(szPath, _countof(szPath)); 329*bf13ebdaSKatayama Hirofumi MZ StringCchCatW(szPath, _countof(szPath), L"\\hhctrl.ocx"); 330*bf13ebdaSKatayama Hirofumi MZ s_hHHCTRL_OCX = LoadLibraryW(szPath); 331*bf13ebdaSKatayama Hirofumi MZ if (s_hHHCTRL_OCX) 332*bf13ebdaSKatayama Hirofumi MZ s_pHtmlHelpW = (FN_HtmlHelpW)GetProcAddress(s_hHHCTRL_OCX, "HtmlHelpW"); 333*bf13ebdaSKatayama Hirofumi MZ } 334*bf13ebdaSKatayama Hirofumi MZ 335*bf13ebdaSKatayama Hirofumi MZ if (!s_pHtmlHelpW) 336*bf13ebdaSKatayama Hirofumi MZ return NULL; 337*bf13ebdaSKatayama Hirofumi MZ 338*bf13ebdaSKatayama Hirofumi MZ return s_pHtmlHelpW(hwndCaller, pszFile, uCommand, dwData); 339*bf13ebdaSKatayama Hirofumi MZ } 340*bf13ebdaSKatayama Hirofumi MZ 341*bf13ebdaSKatayama Hirofumi MZ void CMainWindow::alignChildrenToMainWindow() 342*bf13ebdaSKatayama Hirofumi MZ { 343*bf13ebdaSKatayama Hirofumi MZ RECT clientRect, rc; 344*bf13ebdaSKatayama Hirofumi MZ GetClientRect(&clientRect); 345*bf13ebdaSKatayama Hirofumi MZ RECT rcSpace = clientRect; 346*bf13ebdaSKatayama Hirofumi MZ const UINT uFlags = (SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREPOSITION | SWP_NOCOPYBITS); 347*bf13ebdaSKatayama Hirofumi MZ 348*bf13ebdaSKatayama Hirofumi MZ if (::IsWindowVisible(g_hStatusBar)) 349*bf13ebdaSKatayama Hirofumi MZ { 350*bf13ebdaSKatayama Hirofumi MZ ::GetWindowRect(g_hStatusBar, &rc); 351*bf13ebdaSKatayama Hirofumi MZ rcSpace.bottom -= rc.bottom - rc.top; 352*bf13ebdaSKatayama Hirofumi MZ } 353*bf13ebdaSKatayama Hirofumi MZ 354*bf13ebdaSKatayama Hirofumi MZ HDWP hDWP = ::BeginDeferWindowPos(3); 355*bf13ebdaSKatayama Hirofumi MZ 356*bf13ebdaSKatayama Hirofumi MZ if (::IsWindowVisible(toolBoxContainer)) 357*bf13ebdaSKatayama Hirofumi MZ { 358*bf13ebdaSKatayama Hirofumi MZ if (registrySettings.Bar2ID == BAR2ID_RIGHT) 359*bf13ebdaSKatayama Hirofumi MZ { 360*bf13ebdaSKatayama Hirofumi MZ hDWP = ::DeferWindowPos(hDWP, toolBoxContainer, NULL, 361*bf13ebdaSKatayama Hirofumi MZ rcSpace.right - CX_TOOLBAR, rcSpace.top, 362*bf13ebdaSKatayama Hirofumi MZ CX_TOOLBAR, rcSpace.bottom - rcSpace.top, 363*bf13ebdaSKatayama Hirofumi MZ uFlags); 364*bf13ebdaSKatayama Hirofumi MZ rcSpace.right -= CX_TOOLBAR; 365*bf13ebdaSKatayama Hirofumi MZ } 366*bf13ebdaSKatayama Hirofumi MZ else 367*bf13ebdaSKatayama Hirofumi MZ { 368*bf13ebdaSKatayama Hirofumi MZ hDWP = ::DeferWindowPos(hDWP, toolBoxContainer, NULL, 369*bf13ebdaSKatayama Hirofumi MZ rcSpace.left, rcSpace.top, 370*bf13ebdaSKatayama Hirofumi MZ CX_TOOLBAR, rcSpace.bottom - rcSpace.top, 371*bf13ebdaSKatayama Hirofumi MZ uFlags); 372*bf13ebdaSKatayama Hirofumi MZ rcSpace.left += CX_TOOLBAR; 373*bf13ebdaSKatayama Hirofumi MZ } 374*bf13ebdaSKatayama Hirofumi MZ } 375*bf13ebdaSKatayama Hirofumi MZ 376*bf13ebdaSKatayama Hirofumi MZ if (::IsWindowVisible(paletteWindow)) 377*bf13ebdaSKatayama Hirofumi MZ { 378*bf13ebdaSKatayama Hirofumi MZ if (registrySettings.Bar1ID == BAR1ID_BOTTOM) 379*bf13ebdaSKatayama Hirofumi MZ { 380*bf13ebdaSKatayama Hirofumi MZ hDWP = ::DeferWindowPos(hDWP, paletteWindow, NULL, 381*bf13ebdaSKatayama Hirofumi MZ rcSpace.left, rcSpace.bottom - CY_PALETTE, 382*bf13ebdaSKatayama Hirofumi MZ rcSpace.right - rcSpace.left, CY_PALETTE, 383*bf13ebdaSKatayama Hirofumi MZ uFlags); 384*bf13ebdaSKatayama Hirofumi MZ rcSpace.bottom -= CY_PALETTE; 385*bf13ebdaSKatayama Hirofumi MZ } 386*bf13ebdaSKatayama Hirofumi MZ else 387*bf13ebdaSKatayama Hirofumi MZ { 388*bf13ebdaSKatayama Hirofumi MZ hDWP = ::DeferWindowPos(hDWP, paletteWindow, NULL, 389*bf13ebdaSKatayama Hirofumi MZ rcSpace.left, rcSpace.top, 390*bf13ebdaSKatayama Hirofumi MZ rcSpace.right - rcSpace.left, CY_PALETTE, 391*bf13ebdaSKatayama Hirofumi MZ uFlags); 392*bf13ebdaSKatayama Hirofumi MZ rcSpace.top += CY_PALETTE; 393*bf13ebdaSKatayama Hirofumi MZ } 394*bf13ebdaSKatayama Hirofumi MZ } 395*bf13ebdaSKatayama Hirofumi MZ 396*bf13ebdaSKatayama Hirofumi MZ if (canvasWindow.IsWindow()) 397*bf13ebdaSKatayama Hirofumi MZ { 398*bf13ebdaSKatayama Hirofumi MZ hDWP = ::DeferWindowPos(hDWP, canvasWindow, NULL, 399*bf13ebdaSKatayama Hirofumi MZ rcSpace.left, rcSpace.top, 400*bf13ebdaSKatayama Hirofumi MZ rcSpace.right - rcSpace.left, rcSpace.bottom - rcSpace.top, 401*bf13ebdaSKatayama Hirofumi MZ uFlags); 402*bf13ebdaSKatayama Hirofumi MZ } 403*bf13ebdaSKatayama Hirofumi MZ 404*bf13ebdaSKatayama Hirofumi MZ ::EndDeferWindowPos(hDWP); 405*bf13ebdaSKatayama Hirofumi MZ } 406*bf13ebdaSKatayama Hirofumi MZ 407*bf13ebdaSKatayama Hirofumi MZ void CMainWindow::saveImage(BOOL overwrite) 408*bf13ebdaSKatayama Hirofumi MZ { 409*bf13ebdaSKatayama Hirofumi MZ canvasWindow.finishDrawing(); 410*bf13ebdaSKatayama Hirofumi MZ 411*bf13ebdaSKatayama Hirofumi MZ // Is the extension not supported? 412*bf13ebdaSKatayama Hirofumi MZ PWCHAR pchDotExt = PathFindExtensionW(g_szFileName); 413*bf13ebdaSKatayama Hirofumi MZ if (pchDotExt && *pchDotExt && !CImageDx::IsExtensionSupported(pchDotExt)) 414*bf13ebdaSKatayama Hirofumi MZ { 415*bf13ebdaSKatayama Hirofumi MZ // Remove the extension 416*bf13ebdaSKatayama Hirofumi MZ PathRemoveExtensionW(g_szFileName); 417*bf13ebdaSKatayama Hirofumi MZ // No overwrite 418*bf13ebdaSKatayama Hirofumi MZ overwrite = FALSE; 419*bf13ebdaSKatayama Hirofumi MZ } 420*bf13ebdaSKatayama Hirofumi MZ 421*bf13ebdaSKatayama Hirofumi MZ if (g_isAFile && overwrite) 422*bf13ebdaSKatayama Hirofumi MZ { 423*bf13ebdaSKatayama Hirofumi MZ imageModel.SaveImage(g_szFileName); 424*bf13ebdaSKatayama Hirofumi MZ } 425*bf13ebdaSKatayama Hirofumi MZ else if (GetSaveFileName(g_szFileName, _countof(g_szFileName))) 426*bf13ebdaSKatayama Hirofumi MZ { 427*bf13ebdaSKatayama Hirofumi MZ imageModel.SaveImage(g_szFileName); 428*bf13ebdaSKatayama Hirofumi MZ } 429*bf13ebdaSKatayama Hirofumi MZ } 430*bf13ebdaSKatayama Hirofumi MZ 431*bf13ebdaSKatayama Hirofumi MZ void CMainWindow::InsertSelectionFromHBITMAP(HBITMAP bitmap, HWND window) 432*bf13ebdaSKatayama Hirofumi MZ { 433*bf13ebdaSKatayama Hirofumi MZ int width = GetDIBWidth(bitmap); 434*bf13ebdaSKatayama Hirofumi MZ int height = GetDIBHeight(bitmap); 435*bf13ebdaSKatayama Hirofumi MZ int curWidth = imageModel.GetWidth(); 436*bf13ebdaSKatayama Hirofumi MZ int curHeight = imageModel.GetHeight(); 437*bf13ebdaSKatayama Hirofumi MZ 438*bf13ebdaSKatayama Hirofumi MZ if (width > curWidth || height > curHeight) 439*bf13ebdaSKatayama Hirofumi MZ { 440*bf13ebdaSKatayama Hirofumi MZ BOOL shouldEnlarge = TRUE; 441*bf13ebdaSKatayama Hirofumi MZ 442*bf13ebdaSKatayama Hirofumi MZ if (g_askBeforeEnlarging) 443*bf13ebdaSKatayama Hirofumi MZ { 444*bf13ebdaSKatayama Hirofumi MZ WCHAR programname[20]; 445*bf13ebdaSKatayama Hirofumi MZ WCHAR shouldEnlargePromptText[100]; 446*bf13ebdaSKatayama Hirofumi MZ 447*bf13ebdaSKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_PROGRAMNAME, programname, _countof(programname)); 448*bf13ebdaSKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_ENLARGEPROMPTTEXT, shouldEnlargePromptText, _countof(shouldEnlargePromptText)); 449*bf13ebdaSKatayama Hirofumi MZ 450*bf13ebdaSKatayama Hirofumi MZ switch (MessageBox(shouldEnlargePromptText, programname, MB_YESNOCANCEL | MB_ICONQUESTION)) 451*bf13ebdaSKatayama Hirofumi MZ { 452*bf13ebdaSKatayama Hirofumi MZ case IDYES: 453*bf13ebdaSKatayama Hirofumi MZ break; 454*bf13ebdaSKatayama Hirofumi MZ case IDNO: 455*bf13ebdaSKatayama Hirofumi MZ shouldEnlarge = FALSE; 456*bf13ebdaSKatayama Hirofumi MZ break; 457*bf13ebdaSKatayama Hirofumi MZ case IDCANCEL: 458*bf13ebdaSKatayama Hirofumi MZ return; 459*bf13ebdaSKatayama Hirofumi MZ } 460*bf13ebdaSKatayama Hirofumi MZ } 461*bf13ebdaSKatayama Hirofumi MZ 462*bf13ebdaSKatayama Hirofumi MZ if (shouldEnlarge) 463*bf13ebdaSKatayama Hirofumi MZ { 464*bf13ebdaSKatayama Hirofumi MZ if (width > curWidth) 465*bf13ebdaSKatayama Hirofumi MZ curWidth = width; 466*bf13ebdaSKatayama Hirofumi MZ 467*bf13ebdaSKatayama Hirofumi MZ if (height > curHeight) 468*bf13ebdaSKatayama Hirofumi MZ curHeight = height; 469*bf13ebdaSKatayama Hirofumi MZ 470*bf13ebdaSKatayama Hirofumi MZ imageModel.Crop(curWidth, curHeight, 0, 0); 471*bf13ebdaSKatayama Hirofumi MZ } 472*bf13ebdaSKatayama Hirofumi MZ } 473*bf13ebdaSKatayama Hirofumi MZ 474*bf13ebdaSKatayama Hirofumi MZ toolsModel.SetActiveTool(TOOL_RECTSEL); 475*bf13ebdaSKatayama Hirofumi MZ 476*bf13ebdaSKatayama Hirofumi MZ selectionModel.InsertFromHBITMAP(bitmap, 0, 0); 477*bf13ebdaSKatayama Hirofumi MZ selectionModel.m_bShow = TRUE; 478*bf13ebdaSKatayama Hirofumi MZ imageModel.NotifyImageChanged(); 479*bf13ebdaSKatayama Hirofumi MZ } 480*bf13ebdaSKatayama Hirofumi MZ 481*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnMouseWheel(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 482*bf13ebdaSKatayama Hirofumi MZ { 483*bf13ebdaSKatayama Hirofumi MZ INT zDelta = (SHORT)HIWORD(wParam); 484*bf13ebdaSKatayama Hirofumi MZ 485*bf13ebdaSKatayama Hirofumi MZ if (::GetKeyState(VK_CONTROL) < 0) // Ctrl+Wheel 486*bf13ebdaSKatayama Hirofumi MZ { 487*bf13ebdaSKatayama Hirofumi MZ if (zDelta < 0) 488*bf13ebdaSKatayama Hirofumi MZ { 489*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetZoom() > MIN_ZOOM) 490*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(toolsModel.GetZoom() / 2); 491*bf13ebdaSKatayama Hirofumi MZ } 492*bf13ebdaSKatayama Hirofumi MZ else if (zDelta > 0) 493*bf13ebdaSKatayama Hirofumi MZ { 494*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetZoom() < MAX_ZOOM) 495*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(toolsModel.GetZoom() * 2); 496*bf13ebdaSKatayama Hirofumi MZ } 497*bf13ebdaSKatayama Hirofumi MZ } 498*bf13ebdaSKatayama Hirofumi MZ else // Wheel only 499*bf13ebdaSKatayama Hirofumi MZ { 500*bf13ebdaSKatayama Hirofumi MZ UINT nCount = 3; 501*bf13ebdaSKatayama Hirofumi MZ if (::GetAsyncKeyState(VK_SHIFT) < 0) 502*bf13ebdaSKatayama Hirofumi MZ { 503*bf13ebdaSKatayama Hirofumi MZ #ifndef SPI_GETWHEELSCROLLCHARS 504*bf13ebdaSKatayama Hirofumi MZ #define SPI_GETWHEELSCROLLCHARS 0x006C // Needed for pre-NT6 PSDK 505*bf13ebdaSKatayama Hirofumi MZ #endif 506*bf13ebdaSKatayama Hirofumi MZ SystemParametersInfoW(SPI_GETWHEELSCROLLCHARS, 0, &nCount, 0); 507*bf13ebdaSKatayama Hirofumi MZ for (UINT i = 0; i < nCount; ++i) 508*bf13ebdaSKatayama Hirofumi MZ { 509*bf13ebdaSKatayama Hirofumi MZ if (zDelta < 0) 510*bf13ebdaSKatayama Hirofumi MZ ::PostMessageW(canvasWindow, WM_HSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); 511*bf13ebdaSKatayama Hirofumi MZ else if (zDelta > 0) 512*bf13ebdaSKatayama Hirofumi MZ ::PostMessageW(canvasWindow, WM_HSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); 513*bf13ebdaSKatayama Hirofumi MZ } 514*bf13ebdaSKatayama Hirofumi MZ } 515*bf13ebdaSKatayama Hirofumi MZ else 516*bf13ebdaSKatayama Hirofumi MZ { 517*bf13ebdaSKatayama Hirofumi MZ SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &nCount, 0); 518*bf13ebdaSKatayama Hirofumi MZ for (UINT i = 0; i < nCount; ++i) 519*bf13ebdaSKatayama Hirofumi MZ { 520*bf13ebdaSKatayama Hirofumi MZ if (zDelta < 0) 521*bf13ebdaSKatayama Hirofumi MZ ::PostMessageW(canvasWindow, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); 522*bf13ebdaSKatayama Hirofumi MZ else if (zDelta > 0) 523*bf13ebdaSKatayama Hirofumi MZ ::PostMessageW(canvasWindow, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); 524*bf13ebdaSKatayama Hirofumi MZ } 525*bf13ebdaSKatayama Hirofumi MZ } 526*bf13ebdaSKatayama Hirofumi MZ } 527*bf13ebdaSKatayama Hirofumi MZ 528*bf13ebdaSKatayama Hirofumi MZ return 0; 529*bf13ebdaSKatayama Hirofumi MZ } 530*bf13ebdaSKatayama Hirofumi MZ 531*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnDropFiles(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 532*bf13ebdaSKatayama Hirofumi MZ { 533*bf13ebdaSKatayama Hirofumi MZ WCHAR droppedfile[MAX_PATH]; 534*bf13ebdaSKatayama Hirofumi MZ 535*bf13ebdaSKatayama Hirofumi MZ HDROP hDrop = (HDROP)wParam; 536*bf13ebdaSKatayama Hirofumi MZ DragQueryFile(hDrop, 0, droppedfile, _countof(droppedfile)); 537*bf13ebdaSKatayama Hirofumi MZ DragFinish(hDrop); 538*bf13ebdaSKatayama Hirofumi MZ 539*bf13ebdaSKatayama Hirofumi MZ ConfirmSave() && DoLoadImageFile(m_hWnd, droppedfile, TRUE); 540*bf13ebdaSKatayama Hirofumi MZ 541*bf13ebdaSKatayama Hirofumi MZ return 0; 542*bf13ebdaSKatayama Hirofumi MZ } 543*bf13ebdaSKatayama Hirofumi MZ 544*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 545*bf13ebdaSKatayama Hirofumi MZ { 546*bf13ebdaSKatayama Hirofumi MZ // Loading and setting the window menu from resource 547*bf13ebdaSKatayama Hirofumi MZ m_hMenu = ::LoadMenuW(g_hinstExe, MAKEINTRESOURCEW(ID_MENU)); 548*bf13ebdaSKatayama Hirofumi MZ SetMenu(m_hMenu); 549*bf13ebdaSKatayama Hirofumi MZ 550*bf13ebdaSKatayama Hirofumi MZ // Create the status bar 551*bf13ebdaSKatayama Hirofumi MZ DWORD style = SBARS_SIZEGRIP | WS_CHILD | (registrySettings.ShowStatusBar ? WS_VISIBLE : 0); 552*bf13ebdaSKatayama Hirofumi MZ g_hStatusBar = ::CreateWindowExW(0, STATUSCLASSNAME, NULL, style, 0, 0, 0, 0, m_hWnd, 553*bf13ebdaSKatayama Hirofumi MZ NULL, g_hinstExe, NULL); 554*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(g_hStatusBar, SB_SETMINHEIGHT, 21, 0); 555*bf13ebdaSKatayama Hirofumi MZ 556*bf13ebdaSKatayama Hirofumi MZ // Create the tool box 557*bf13ebdaSKatayama Hirofumi MZ toolBoxContainer.DoCreate(m_hWnd); 558*bf13ebdaSKatayama Hirofumi MZ 559*bf13ebdaSKatayama Hirofumi MZ // Create the palette window 560*bf13ebdaSKatayama Hirofumi MZ RECT rcEmpty = { 0, 0, 0, 0 }; // Rely on WM_SIZE 561*bf13ebdaSKatayama Hirofumi MZ style = WS_CHILD | (registrySettings.ShowPalette ? WS_VISIBLE : 0); 562*bf13ebdaSKatayama Hirofumi MZ paletteWindow.Create(m_hWnd, rcEmpty, NULL, style, WS_EX_STATICEDGE); 563*bf13ebdaSKatayama Hirofumi MZ 564*bf13ebdaSKatayama Hirofumi MZ // Create the canvas 565*bf13ebdaSKatayama Hirofumi MZ style = WS_CHILD | WS_GROUP | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE; 566*bf13ebdaSKatayama Hirofumi MZ canvasWindow.Create(m_hWnd, rcEmpty, NULL, style, WS_EX_CLIENTEDGE); 567*bf13ebdaSKatayama Hirofumi MZ 568*bf13ebdaSKatayama Hirofumi MZ // Create and show the miniature if necessary 569*bf13ebdaSKatayama Hirofumi MZ if (registrySettings.ShowThumbnail) 570*bf13ebdaSKatayama Hirofumi MZ { 571*bf13ebdaSKatayama Hirofumi MZ miniature.DoCreate(m_hWnd); 572*bf13ebdaSKatayama Hirofumi MZ miniature.ShowWindow(SW_SHOWNOACTIVATE); 573*bf13ebdaSKatayama Hirofumi MZ } 574*bf13ebdaSKatayama Hirofumi MZ 575*bf13ebdaSKatayama Hirofumi MZ // Set icon 576*bf13ebdaSKatayama Hirofumi MZ SendMessage(WM_SETICON, ICON_BIG, (LPARAM)::LoadIconW(g_hinstExe, MAKEINTRESOURCEW(IDI_APPICON))); 577*bf13ebdaSKatayama Hirofumi MZ SendMessage(WM_SETICON, ICON_SMALL, (LPARAM)::LoadIconW(g_hinstExe, MAKEINTRESOURCEW(IDI_APPICON))); 578*bf13ebdaSKatayama Hirofumi MZ 579*bf13ebdaSKatayama Hirofumi MZ return 0; 580*bf13ebdaSKatayama Hirofumi MZ } 581*bf13ebdaSKatayama Hirofumi MZ 582*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 583*bf13ebdaSKatayama Hirofumi MZ { 584*bf13ebdaSKatayama Hirofumi MZ registrySettings.WindowPlacement.length = sizeof(WINDOWPLACEMENT); 585*bf13ebdaSKatayama Hirofumi MZ GetWindowPlacement(&(registrySettings.WindowPlacement)); 586*bf13ebdaSKatayama Hirofumi MZ 587*bf13ebdaSKatayama Hirofumi MZ DoHtmlHelpW(NULL, NULL, HH_CLOSE_ALL, 0); 588*bf13ebdaSKatayama Hirofumi MZ 589*bf13ebdaSKatayama Hirofumi MZ if (s_hHHCTRL_OCX) 590*bf13ebdaSKatayama Hirofumi MZ { 591*bf13ebdaSKatayama Hirofumi MZ FreeLibrary(s_hHHCTRL_OCX); 592*bf13ebdaSKatayama Hirofumi MZ s_hHHCTRL_OCX = NULL; 593*bf13ebdaSKatayama Hirofumi MZ s_pHtmlHelpW = NULL; 594*bf13ebdaSKatayama Hirofumi MZ } 595*bf13ebdaSKatayama Hirofumi MZ 596*bf13ebdaSKatayama Hirofumi MZ SetMenu(NULL); 597*bf13ebdaSKatayama Hirofumi MZ if (m_hMenu) 598*bf13ebdaSKatayama Hirofumi MZ { 599*bf13ebdaSKatayama Hirofumi MZ ::DestroyMenu(m_hMenu); 600*bf13ebdaSKatayama Hirofumi MZ m_hMenu = NULL; 601*bf13ebdaSKatayama Hirofumi MZ } 602*bf13ebdaSKatayama Hirofumi MZ 603*bf13ebdaSKatayama Hirofumi MZ PostQuitMessage(0); /* send a WM_QUIT to the message queue */ 604*bf13ebdaSKatayama Hirofumi MZ return 0; 605*bf13ebdaSKatayama Hirofumi MZ } 606*bf13ebdaSKatayama Hirofumi MZ 607*bf13ebdaSKatayama Hirofumi MZ BOOL CMainWindow::ConfirmSave() 608*bf13ebdaSKatayama Hirofumi MZ { 609*bf13ebdaSKatayama Hirofumi MZ canvasWindow.finishDrawing(); 610*bf13ebdaSKatayama Hirofumi MZ 611*bf13ebdaSKatayama Hirofumi MZ if (imageModel.IsImageSaved()) 612*bf13ebdaSKatayama Hirofumi MZ return TRUE; 613*bf13ebdaSKatayama Hirofumi MZ 614*bf13ebdaSKatayama Hirofumi MZ CStringW strProgramName; 615*bf13ebdaSKatayama Hirofumi MZ strProgramName.LoadString(IDS_PROGRAMNAME); 616*bf13ebdaSKatayama Hirofumi MZ 617*bf13ebdaSKatayama Hirofumi MZ CStringW strSavePromptText; 618*bf13ebdaSKatayama Hirofumi MZ strSavePromptText.Format(IDS_SAVEPROMPTTEXT, PathFindFileName(g_szFileName)); 619*bf13ebdaSKatayama Hirofumi MZ 620*bf13ebdaSKatayama Hirofumi MZ switch (MessageBox(strSavePromptText, strProgramName, MB_YESNOCANCEL | MB_ICONQUESTION)) 621*bf13ebdaSKatayama Hirofumi MZ { 622*bf13ebdaSKatayama Hirofumi MZ case IDYES: 623*bf13ebdaSKatayama Hirofumi MZ saveImage(TRUE); 624*bf13ebdaSKatayama Hirofumi MZ return imageModel.IsImageSaved(); 625*bf13ebdaSKatayama Hirofumi MZ case IDNO: 626*bf13ebdaSKatayama Hirofumi MZ return TRUE; 627*bf13ebdaSKatayama Hirofumi MZ case IDCANCEL: 628*bf13ebdaSKatayama Hirofumi MZ return FALSE; 629*bf13ebdaSKatayama Hirofumi MZ } 630*bf13ebdaSKatayama Hirofumi MZ 631*bf13ebdaSKatayama Hirofumi MZ return TRUE; 632*bf13ebdaSKatayama Hirofumi MZ } 633*bf13ebdaSKatayama Hirofumi MZ 634*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 635*bf13ebdaSKatayama Hirofumi MZ { 636*bf13ebdaSKatayama Hirofumi MZ if (ConfirmSave()) 637*bf13ebdaSKatayama Hirofumi MZ { 638*bf13ebdaSKatayama Hirofumi MZ DestroyWindow(); 639*bf13ebdaSKatayama Hirofumi MZ } 640*bf13ebdaSKatayama Hirofumi MZ return 0; 641*bf13ebdaSKatayama Hirofumi MZ } 642*bf13ebdaSKatayama Hirofumi MZ 643*bf13ebdaSKatayama Hirofumi MZ void CMainWindow::ProcessFileMenu(HMENU hPopupMenu) 644*bf13ebdaSKatayama Hirofumi MZ { 645*bf13ebdaSKatayama Hirofumi MZ LPCWSTR dotext = PathFindExtensionW(g_szFileName); 646*bf13ebdaSKatayama Hirofumi MZ BOOL isBMP = FALSE; 647*bf13ebdaSKatayama Hirofumi MZ if (_wcsicmp(dotext, L".bmp") == 0 || 648*bf13ebdaSKatayama Hirofumi MZ _wcsicmp(dotext, L".dib") == 0 || 649*bf13ebdaSKatayama Hirofumi MZ _wcsicmp(dotext, L".rle") == 0) 650*bf13ebdaSKatayama Hirofumi MZ { 651*bf13ebdaSKatayama Hirofumi MZ isBMP = TRUE; 652*bf13ebdaSKatayama Hirofumi MZ } 653*bf13ebdaSKatayama Hirofumi MZ 654*bf13ebdaSKatayama Hirofumi MZ UINT uWallpaperEnabled = ENABLED_IF(g_isAFile && isBMP && g_fileSize > 0); 655*bf13ebdaSKatayama Hirofumi MZ ::EnableMenuItem(hPopupMenu, IDM_FILEASWALLPAPERPLANE, uWallpaperEnabled); 656*bf13ebdaSKatayama Hirofumi MZ ::EnableMenuItem(hPopupMenu, IDM_FILEASWALLPAPERCENTERED, uWallpaperEnabled); 657*bf13ebdaSKatayama Hirofumi MZ ::EnableMenuItem(hPopupMenu, IDM_FILEASWALLPAPERSTRETCHED, uWallpaperEnabled); 658*bf13ebdaSKatayama Hirofumi MZ 659*bf13ebdaSKatayama Hirofumi MZ for (INT iItem = 0; iItem < MAX_RECENT_FILES; ++iItem) 660*bf13ebdaSKatayama Hirofumi MZ RemoveMenu(hPopupMenu, IDM_FILE1 + iItem, MF_BYCOMMAND); 661*bf13ebdaSKatayama Hirofumi MZ 662*bf13ebdaSKatayama Hirofumi MZ if (registrySettings.strFiles[0].IsEmpty()) 663*bf13ebdaSKatayama Hirofumi MZ return; 664*bf13ebdaSKatayama Hirofumi MZ 665*bf13ebdaSKatayama Hirofumi MZ RemoveMenu(hPopupMenu, IDM_FILEMOSTRECENTLYUSEDFILE, MF_BYCOMMAND); 666*bf13ebdaSKatayama Hirofumi MZ 667*bf13ebdaSKatayama Hirofumi MZ INT cMenuItems = GetMenuItemCount(hPopupMenu); 668*bf13ebdaSKatayama Hirofumi MZ 669*bf13ebdaSKatayama Hirofumi MZ for (INT iItem = 0; iItem < MAX_RECENT_FILES; ++iItem) 670*bf13ebdaSKatayama Hirofumi MZ { 671*bf13ebdaSKatayama Hirofumi MZ CStringW& strFile = registrySettings.strFiles[iItem]; 672*bf13ebdaSKatayama Hirofumi MZ if (strFile.IsEmpty()) 673*bf13ebdaSKatayama Hirofumi MZ break; 674*bf13ebdaSKatayama Hirofumi MZ 675*bf13ebdaSKatayama Hirofumi MZ // Condense the lengthy pathname by using '...' 676*bf13ebdaSKatayama Hirofumi MZ #define MAX_RECENT_PATHNAME_DISPLAY 30 677*bf13ebdaSKatayama Hirofumi MZ CPath pathFile(strFile); 678*bf13ebdaSKatayama Hirofumi MZ pathFile.CompactPathEx(MAX_RECENT_PATHNAME_DISPLAY); 679*bf13ebdaSKatayama Hirofumi MZ assert(wcslen((LPCWSTR)pathFile) <= MAX_RECENT_PATHNAME_DISPLAY); 680*bf13ebdaSKatayama Hirofumi MZ 681*bf13ebdaSKatayama Hirofumi MZ // Add an accelerator (by '&') to the item number for quick access 682*bf13ebdaSKatayama Hirofumi MZ WCHAR szText[4 + MAX_RECENT_PATHNAME_DISPLAY + 1]; 683*bf13ebdaSKatayama Hirofumi MZ StringCchPrintfW(szText, _countof(szText), L"&%u %s", iItem + 1, (LPCWSTR)pathFile); 684*bf13ebdaSKatayama Hirofumi MZ 685*bf13ebdaSKatayama Hirofumi MZ INT iMenuItem = (cMenuItems - 2) + iItem; 686*bf13ebdaSKatayama Hirofumi MZ InsertMenu(hPopupMenu, iMenuItem, MF_BYPOSITION | MF_STRING, IDM_FILE1 + iItem, szText); 687*bf13ebdaSKatayama Hirofumi MZ } 688*bf13ebdaSKatayama Hirofumi MZ } 689*bf13ebdaSKatayama Hirofumi MZ 690*bf13ebdaSKatayama Hirofumi MZ BOOL CMainWindow::CanUndo() const 691*bf13ebdaSKatayama Hirofumi MZ { 692*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)) 693*bf13ebdaSKatayama Hirofumi MZ return (BOOL)textEditWindow.SendMessage(EM_CANUNDO); 694*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow && toolsModel.IsSelection()) 695*bf13ebdaSKatayama Hirofumi MZ return TRUE; 696*bf13ebdaSKatayama Hirofumi MZ if (ToolBase::s_pointSP != 0) 697*bf13ebdaSKatayama Hirofumi MZ return TRUE; 698*bf13ebdaSKatayama Hirofumi MZ return imageModel.CanUndo(); 699*bf13ebdaSKatayama Hirofumi MZ } 700*bf13ebdaSKatayama Hirofumi MZ 701*bf13ebdaSKatayama Hirofumi MZ BOOL CMainWindow::CanRedo() const 702*bf13ebdaSKatayama Hirofumi MZ { 703*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)) 704*bf13ebdaSKatayama Hirofumi MZ return FALSE; // There is no "WM_REDO" in EDIT control 705*bf13ebdaSKatayama Hirofumi MZ if (ToolBase::s_pointSP != 0) 706*bf13ebdaSKatayama Hirofumi MZ return TRUE; 707*bf13ebdaSKatayama Hirofumi MZ return imageModel.CanRedo(); 708*bf13ebdaSKatayama Hirofumi MZ } 709*bf13ebdaSKatayama Hirofumi MZ 710*bf13ebdaSKatayama Hirofumi MZ BOOL CMainWindow::CanPaste() const 711*bf13ebdaSKatayama Hirofumi MZ { 712*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)) 713*bf13ebdaSKatayama Hirofumi MZ return ::IsClipboardFormatAvailable(CF_UNICODETEXT); 714*bf13ebdaSKatayama Hirofumi MZ 715*bf13ebdaSKatayama Hirofumi MZ return (::IsClipboardFormatAvailable(CF_ENHMETAFILE) || 716*bf13ebdaSKatayama Hirofumi MZ ::IsClipboardFormatAvailable(CF_DIB) || 717*bf13ebdaSKatayama Hirofumi MZ ::IsClipboardFormatAvailable(CF_BITMAP)); 718*bf13ebdaSKatayama Hirofumi MZ } 719*bf13ebdaSKatayama Hirofumi MZ 720*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnInitMenuPopup(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 721*bf13ebdaSKatayama Hirofumi MZ { 722*bf13ebdaSKatayama Hirofumi MZ HMENU menu = (HMENU)wParam; 723*bf13ebdaSKatayama Hirofumi MZ BOOL trueSelection = (selectionModel.m_bShow && toolsModel.IsSelection()); 724*bf13ebdaSKatayama Hirofumi MZ BOOL textShown = (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)); 725*bf13ebdaSKatayama Hirofumi MZ DWORD dwStart = 0, dwEnd = 0; 726*bf13ebdaSKatayama Hirofumi MZ if (textShown) 727*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); 728*bf13ebdaSKatayama Hirofumi MZ BOOL hasTextSel = (dwStart < dwEnd); 729*bf13ebdaSKatayama Hirofumi MZ 730*bf13ebdaSKatayama Hirofumi MZ // 731*bf13ebdaSKatayama Hirofumi MZ // File menu 732*bf13ebdaSKatayama Hirofumi MZ // 733*bf13ebdaSKatayama Hirofumi MZ if (::GetSubMenu(GetMenu(), 0) == menu) 734*bf13ebdaSKatayama Hirofumi MZ { 735*bf13ebdaSKatayama Hirofumi MZ ProcessFileMenu(menu); 736*bf13ebdaSKatayama Hirofumi MZ } 737*bf13ebdaSKatayama Hirofumi MZ 738*bf13ebdaSKatayama Hirofumi MZ // 739*bf13ebdaSKatayama Hirofumi MZ // Edit menu 740*bf13ebdaSKatayama Hirofumi MZ // 741*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITUNDO, ENABLED_IF(CanUndo())); 742*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITREDO, ENABLED_IF(CanRedo())); 743*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITCUT, ENABLED_IF(textShown ? hasTextSel : trueSelection)); 744*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITCOPY, ENABLED_IF(textShown ? hasTextSel : trueSelection)); 745*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITDELETESELECTION, 746*bf13ebdaSKatayama Hirofumi MZ ENABLED_IF(textShown ? hasTextSel : trueSelection)); 747*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITINVERTSELECTION, ENABLED_IF(trueSelection)); 748*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITCOPYTO, ENABLED_IF(trueSelection)); 749*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_EDITPASTE, ENABLED_IF(CanPaste())); 750*bf13ebdaSKatayama Hirofumi MZ 751*bf13ebdaSKatayama Hirofumi MZ // 752*bf13ebdaSKatayama Hirofumi MZ // View menu 753*bf13ebdaSKatayama Hirofumi MZ // 754*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWTOOLBOX, CHECKED_IF(::IsWindowVisible(toolBoxContainer))); 755*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWCOLORPALETTE, CHECKED_IF(::IsWindowVisible(paletteWindow))); 756*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWSTATUSBAR, CHECKED_IF(::IsWindowVisible(g_hStatusBar))); 757*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_FORMATICONBAR, CHECKED_IF(::IsWindowVisible(fontsDialog))); 758*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_FORMATICONBAR, ENABLED_IF(toolsModel.GetActiveTool() == TOOL_TEXT)); 759*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM125, CHECKED_IF(toolsModel.GetZoom() == 125)); 760*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM25, CHECKED_IF(toolsModel.GetZoom() == 250)); 761*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM50, CHECKED_IF(toolsModel.GetZoom() == 500)); 762*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM100, CHECKED_IF(toolsModel.GetZoom() == 1000)); 763*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM200, CHECKED_IF(toolsModel.GetZoom() == 2000)); 764*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM400, CHECKED_IF(toolsModel.GetZoom() == 4000)); 765*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWZOOM800, CHECKED_IF(toolsModel.GetZoom() == 8000)); 766*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWSHOWGRID, CHECKED_IF(g_showGrid)); 767*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_VIEWSHOWMINIATURE, CHECKED_IF(registrySettings.ShowThumbnail)); 768*bf13ebdaSKatayama Hirofumi MZ 769*bf13ebdaSKatayama Hirofumi MZ // 770*bf13ebdaSKatayama Hirofumi MZ // Image menu 771*bf13ebdaSKatayama Hirofumi MZ // 772*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_IMAGECROP, ENABLED_IF(selectionModel.m_bShow)); 773*bf13ebdaSKatayama Hirofumi MZ EnableMenuItem(menu, IDM_IMAGEDELETEIMAGE, ENABLED_IF(!selectionModel.m_bShow)); 774*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_IMAGEDRAWOPAQUE, CHECKED_IF(!toolsModel.IsBackgroundTransparent())); 775*bf13ebdaSKatayama Hirofumi MZ 776*bf13ebdaSKatayama Hirofumi MZ // 777*bf13ebdaSKatayama Hirofumi MZ // Palette menu 778*bf13ebdaSKatayama Hirofumi MZ // 779*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_COLORSMODERNPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == PAL_MODERN)); 780*bf13ebdaSKatayama Hirofumi MZ CheckMenuItem(menu, IDM_COLORSOLDPALETTE, CHECKED_IF(paletteModel.SelectedPalette() == PAL_OLDTYPE)); 781*bf13ebdaSKatayama Hirofumi MZ return 0; 782*bf13ebdaSKatayama Hirofumi MZ } 783*bf13ebdaSKatayama Hirofumi MZ 784*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 785*bf13ebdaSKatayama Hirofumi MZ { 786*bf13ebdaSKatayama Hirofumi MZ int test[] = { LOWORD(lParam) - 260, LOWORD(lParam) - 140, LOWORD(lParam) - 20 }; 787*bf13ebdaSKatayama Hirofumi MZ if (::IsWindow(g_hStatusBar)) 788*bf13ebdaSKatayama Hirofumi MZ { 789*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(g_hStatusBar, WM_SIZE, 0, 0); 790*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(g_hStatusBar, SB_SETPARTS, 3, (LPARAM)&test); 791*bf13ebdaSKatayama Hirofumi MZ } 792*bf13ebdaSKatayama Hirofumi MZ alignChildrenToMainWindow(); 793*bf13ebdaSKatayama Hirofumi MZ return 0; 794*bf13ebdaSKatayama Hirofumi MZ } 795*bf13ebdaSKatayama Hirofumi MZ 796*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnGetMinMaxInfo(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 797*bf13ebdaSKatayama Hirofumi MZ { 798*bf13ebdaSKatayama Hirofumi MZ MINMAXINFO *mm = (MINMAXINFO*)lParam; 799*bf13ebdaSKatayama Hirofumi MZ mm->ptMinTrackSize = { 330, 360 }; 800*bf13ebdaSKatayama Hirofumi MZ return 0; 801*bf13ebdaSKatayama Hirofumi MZ } 802*bf13ebdaSKatayama Hirofumi MZ 803*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 804*bf13ebdaSKatayama Hirofumi MZ { 805*bf13ebdaSKatayama Hirofumi MZ HWND hwndCapture; 806*bf13ebdaSKatayama Hirofumi MZ switch (wParam) 807*bf13ebdaSKatayama Hirofumi MZ { 808*bf13ebdaSKatayama Hirofumi MZ case VK_ESCAPE: 809*bf13ebdaSKatayama Hirofumi MZ hwndCapture = GetCapture(); 810*bf13ebdaSKatayama Hirofumi MZ if (hwndCapture) 811*bf13ebdaSKatayama Hirofumi MZ { 812*bf13ebdaSKatayama Hirofumi MZ if (canvasWindow.m_hWnd == hwndCapture || 813*bf13ebdaSKatayama Hirofumi MZ fullscreenWindow.m_hWnd == hwndCapture) 814*bf13ebdaSKatayama Hirofumi MZ { 815*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(hwndCapture, nMsg, wParam, lParam); 816*bf13ebdaSKatayama Hirofumi MZ } 817*bf13ebdaSKatayama Hirofumi MZ } 818*bf13ebdaSKatayama Hirofumi MZ else if (selectionModel.m_bShow) 819*bf13ebdaSKatayama Hirofumi MZ { 820*bf13ebdaSKatayama Hirofumi MZ selectionModel.HideSelection(); 821*bf13ebdaSKatayama Hirofumi MZ } 822*bf13ebdaSKatayama Hirofumi MZ else 823*bf13ebdaSKatayama Hirofumi MZ { 824*bf13ebdaSKatayama Hirofumi MZ canvasWindow.cancelDrawing(); 825*bf13ebdaSKatayama Hirofumi MZ } 826*bf13ebdaSKatayama Hirofumi MZ break; 827*bf13ebdaSKatayama Hirofumi MZ 828*bf13ebdaSKatayama Hirofumi MZ case VK_LEFT: 829*bf13ebdaSKatayama Hirofumi MZ selectionModel.moveSelection(-1, 0); 830*bf13ebdaSKatayama Hirofumi MZ break; 831*bf13ebdaSKatayama Hirofumi MZ case VK_RIGHT: 832*bf13ebdaSKatayama Hirofumi MZ selectionModel.moveSelection(+1, 0); 833*bf13ebdaSKatayama Hirofumi MZ break; 834*bf13ebdaSKatayama Hirofumi MZ case VK_UP: 835*bf13ebdaSKatayama Hirofumi MZ selectionModel.moveSelection(0, -1); 836*bf13ebdaSKatayama Hirofumi MZ break; 837*bf13ebdaSKatayama Hirofumi MZ case VK_DOWN: 838*bf13ebdaSKatayama Hirofumi MZ selectionModel.moveSelection(0, +1); 839*bf13ebdaSKatayama Hirofumi MZ break; 840*bf13ebdaSKatayama Hirofumi MZ default: 841*bf13ebdaSKatayama Hirofumi MZ break; 842*bf13ebdaSKatayama Hirofumi MZ } 843*bf13ebdaSKatayama Hirofumi MZ return 0; 844*bf13ebdaSKatayama Hirofumi MZ } 845*bf13ebdaSKatayama Hirofumi MZ 846*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnSysColorChange(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 847*bf13ebdaSKatayama Hirofumi MZ { 848*bf13ebdaSKatayama Hirofumi MZ /* Redirect message to common controls */ 849*bf13ebdaSKatayama Hirofumi MZ HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL); 850*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(hToolbar, WM_SYSCOLORCHANGE, 0, 0); 851*bf13ebdaSKatayama Hirofumi MZ return 0; 852*bf13ebdaSKatayama Hirofumi MZ } 853*bf13ebdaSKatayama Hirofumi MZ 854*bf13ebdaSKatayama Hirofumi MZ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 855*bf13ebdaSKatayama Hirofumi MZ { 856*bf13ebdaSKatayama Hirofumi MZ // Disable commands while dragging mouse 857*bf13ebdaSKatayama Hirofumi MZ if (canvasWindow.m_drawing && ::GetCapture()) 858*bf13ebdaSKatayama Hirofumi MZ { 859*bf13ebdaSKatayama Hirofumi MZ ATLTRACE("locking!\n"); 860*bf13ebdaSKatayama Hirofumi MZ return 0; 861*bf13ebdaSKatayama Hirofumi MZ } 862*bf13ebdaSKatayama Hirofumi MZ 863*bf13ebdaSKatayama Hirofumi MZ BOOL textShown = (toolsModel.GetActiveTool() == TOOL_TEXT && ::IsWindowVisible(textEditWindow)); 864*bf13ebdaSKatayama Hirofumi MZ switch (LOWORD(wParam)) 865*bf13ebdaSKatayama Hirofumi MZ { 866*bf13ebdaSKatayama Hirofumi MZ case IDM_HELPINFO: 867*bf13ebdaSKatayama Hirofumi MZ { 868*bf13ebdaSKatayama Hirofumi MZ WCHAR infotitle[100], infotext[200]; 869*bf13ebdaSKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_INFOTITLE, infotitle, _countof(infotitle)); 870*bf13ebdaSKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_INFOTEXT, infotext, _countof(infotext)); 871*bf13ebdaSKatayama Hirofumi MZ ::ShellAboutW(m_hWnd, infotitle, infotext, 872*bf13ebdaSKatayama Hirofumi MZ LoadIconW(g_hinstExe, MAKEINTRESOURCEW(IDI_APPICON))); 873*bf13ebdaSKatayama Hirofumi MZ break; 874*bf13ebdaSKatayama Hirofumi MZ } 875*bf13ebdaSKatayama Hirofumi MZ case IDM_HELPHELPTOPICS: 876*bf13ebdaSKatayama Hirofumi MZ DoHtmlHelpW(m_hWnd, L"%SystemRoot%\\Help\\mspaint.chm", HH_DISPLAY_TOPIC, 0); 877*bf13ebdaSKatayama Hirofumi MZ break; 878*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEEXIT: 879*bf13ebdaSKatayama Hirofumi MZ SendMessage(WM_CLOSE, wParam, lParam); 880*bf13ebdaSKatayama Hirofumi MZ break; 881*bf13ebdaSKatayama Hirofumi MZ case IDM_FILENEW: 882*bf13ebdaSKatayama Hirofumi MZ if (ConfirmSave()) 883*bf13ebdaSKatayama Hirofumi MZ { 884*bf13ebdaSKatayama Hirofumi MZ InitializeImage(NULL, NULL, FALSE); 885*bf13ebdaSKatayama Hirofumi MZ } 886*bf13ebdaSKatayama Hirofumi MZ break; 887*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEOPEN: 888*bf13ebdaSKatayama Hirofumi MZ { 889*bf13ebdaSKatayama Hirofumi MZ WCHAR szFileName[MAX_LONG_PATH] = L""; 890*bf13ebdaSKatayama Hirofumi MZ if (ConfirmSave() && GetOpenFileName(szFileName, _countof(szFileName))) 891*bf13ebdaSKatayama Hirofumi MZ { 892*bf13ebdaSKatayama Hirofumi MZ DoLoadImageFile(m_hWnd, szFileName, TRUE); 893*bf13ebdaSKatayama Hirofumi MZ } 894*bf13ebdaSKatayama Hirofumi MZ break; 895*bf13ebdaSKatayama Hirofumi MZ } 896*bf13ebdaSKatayama Hirofumi MZ case IDM_FILESAVE: 897*bf13ebdaSKatayama Hirofumi MZ saveImage(TRUE); 898*bf13ebdaSKatayama Hirofumi MZ break; 899*bf13ebdaSKatayama Hirofumi MZ case IDM_FILESAVEAS: 900*bf13ebdaSKatayama Hirofumi MZ saveImage(FALSE); 901*bf13ebdaSKatayama Hirofumi MZ break; 902*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEPAGESETUP: 903*bf13ebdaSKatayama Hirofumi MZ // DUMMY: Shows the dialog only, no functionality 904*bf13ebdaSKatayama Hirofumi MZ PAGESETUPDLG psd; 905*bf13ebdaSKatayama Hirofumi MZ ZeroMemory(&psd, sizeof(psd)); 906*bf13ebdaSKatayama Hirofumi MZ psd.lStructSize = sizeof(psd); 907*bf13ebdaSKatayama Hirofumi MZ psd.hwndOwner = m_hWnd; 908*bf13ebdaSKatayama Hirofumi MZ PageSetupDlg(&psd); 909*bf13ebdaSKatayama Hirofumi MZ break; 910*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEPRINT: 911*bf13ebdaSKatayama Hirofumi MZ // TODO: Test whether it actually works 912*bf13ebdaSKatayama Hirofumi MZ PRINTDLG pd; 913*bf13ebdaSKatayama Hirofumi MZ ZeroMemory(&pd, sizeof(pd)); 914*bf13ebdaSKatayama Hirofumi MZ pd.lStructSize = sizeof(pd); 915*bf13ebdaSKatayama Hirofumi MZ pd.hwndOwner = m_hWnd; 916*bf13ebdaSKatayama Hirofumi MZ pd.hDevMode = NULL; // freed by user 917*bf13ebdaSKatayama Hirofumi MZ pd.hDevNames = NULL; // freed by user 918*bf13ebdaSKatayama Hirofumi MZ pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC; 919*bf13ebdaSKatayama Hirofumi MZ pd.nCopies = 1; 920*bf13ebdaSKatayama Hirofumi MZ pd.nFromPage = 0xffff; 921*bf13ebdaSKatayama Hirofumi MZ pd.nToPage = 0xffff; 922*bf13ebdaSKatayama Hirofumi MZ pd.nMinPage = 1; 923*bf13ebdaSKatayama Hirofumi MZ pd.nMaxPage = 0xffff; 924*bf13ebdaSKatayama Hirofumi MZ if (PrintDlg(&pd) == TRUE) 925*bf13ebdaSKatayama Hirofumi MZ { 926*bf13ebdaSKatayama Hirofumi MZ ::BitBlt(pd.hDC, 0, 0, imageModel.GetWidth(), imageModel.GetHeight(), imageModel.GetDC(), 0, 0, SRCCOPY); 927*bf13ebdaSKatayama Hirofumi MZ DeleteDC(pd.hDC); 928*bf13ebdaSKatayama Hirofumi MZ } 929*bf13ebdaSKatayama Hirofumi MZ if (pd.hDevMode) 930*bf13ebdaSKatayama Hirofumi MZ GlobalFree(pd.hDevMode); 931*bf13ebdaSKatayama Hirofumi MZ if (pd.hDevNames) 932*bf13ebdaSKatayama Hirofumi MZ GlobalFree(pd.hDevNames); 933*bf13ebdaSKatayama Hirofumi MZ break; 934*bf13ebdaSKatayama Hirofumi MZ case IDM_FILESEND: 935*bf13ebdaSKatayama Hirofumi MZ canvasWindow.finishDrawing(); 936*bf13ebdaSKatayama Hirofumi MZ if (!OpenMailer(m_hWnd, g_szFileName)) 937*bf13ebdaSKatayama Hirofumi MZ { 938*bf13ebdaSKatayama Hirofumi MZ ShowError(IDS_CANTSENDMAIL); 939*bf13ebdaSKatayama Hirofumi MZ } 940*bf13ebdaSKatayama Hirofumi MZ break; 941*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEASWALLPAPERPLANE: 942*bf13ebdaSKatayama Hirofumi MZ RegistrySettings::SetWallpaper(g_szFileName, RegistrySettings::TILED); 943*bf13ebdaSKatayama Hirofumi MZ break; 944*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEASWALLPAPERCENTERED: 945*bf13ebdaSKatayama Hirofumi MZ RegistrySettings::SetWallpaper(g_szFileName, RegistrySettings::CENTERED); 946*bf13ebdaSKatayama Hirofumi MZ break; 947*bf13ebdaSKatayama Hirofumi MZ case IDM_FILEASWALLPAPERSTRETCHED: 948*bf13ebdaSKatayama Hirofumi MZ RegistrySettings::SetWallpaper(g_szFileName, RegistrySettings::STRETCHED); 949*bf13ebdaSKatayama Hirofumi MZ break; 950*bf13ebdaSKatayama Hirofumi MZ case IDM_FILE1: 951*bf13ebdaSKatayama Hirofumi MZ case IDM_FILE2: 952*bf13ebdaSKatayama Hirofumi MZ case IDM_FILE3: 953*bf13ebdaSKatayama Hirofumi MZ case IDM_FILE4: 954*bf13ebdaSKatayama Hirofumi MZ { 955*bf13ebdaSKatayama Hirofumi MZ INT iFile = LOWORD(wParam) - IDM_FILE1; 956*bf13ebdaSKatayama Hirofumi MZ if (ConfirmSave()) 957*bf13ebdaSKatayama Hirofumi MZ DoLoadImageFile(m_hWnd, registrySettings.strFiles[iFile], TRUE); 958*bf13ebdaSKatayama Hirofumi MZ break; 959*bf13ebdaSKatayama Hirofumi MZ } 960*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITUNDO: 961*bf13ebdaSKatayama Hirofumi MZ if (textShown) 962*bf13ebdaSKatayama Hirofumi MZ { 963*bf13ebdaSKatayama Hirofumi MZ textEditWindow.PostMessage(WM_UNDO, 0, 0); 964*bf13ebdaSKatayama Hirofumi MZ break; 965*bf13ebdaSKatayama Hirofumi MZ } 966*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 967*bf13ebdaSKatayama Hirofumi MZ { 968*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.IsSelection()) 969*bf13ebdaSKatayama Hirofumi MZ { 970*bf13ebdaSKatayama Hirofumi MZ canvasWindow.cancelDrawing(); 971*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetActiveTool() == TOOL_FREESEL || 972*bf13ebdaSKatayama Hirofumi MZ toolsModel.GetActiveTool() == TOOL_RECTSEL) 973*bf13ebdaSKatayama Hirofumi MZ { 974*bf13ebdaSKatayama Hirofumi MZ imageModel.Undo(); 975*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_nSelectionBrush == 2) // Selection Brush is drawn 976*bf13ebdaSKatayama Hirofumi MZ { 977*bf13ebdaSKatayama Hirofumi MZ imageModel.Undo(); 978*bf13ebdaSKatayama Hirofumi MZ selectionModel.m_nSelectionBrush = 0; 979*bf13ebdaSKatayama Hirofumi MZ } 980*bf13ebdaSKatayama Hirofumi MZ } 981*bf13ebdaSKatayama Hirofumi MZ break; 982*bf13ebdaSKatayama Hirofumi MZ } 983*bf13ebdaSKatayama Hirofumi MZ } 984*bf13ebdaSKatayama Hirofumi MZ if (ToolBase::s_pointSP != 0) // drawing something? 985*bf13ebdaSKatayama Hirofumi MZ { 986*bf13ebdaSKatayama Hirofumi MZ canvasWindow.cancelDrawing(); 987*bf13ebdaSKatayama Hirofumi MZ break; 988*bf13ebdaSKatayama Hirofumi MZ } 989*bf13ebdaSKatayama Hirofumi MZ imageModel.Undo(); 990*bf13ebdaSKatayama Hirofumi MZ break; 991*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITREDO: 992*bf13ebdaSKatayama Hirofumi MZ if (textShown) 993*bf13ebdaSKatayama Hirofumi MZ { 994*bf13ebdaSKatayama Hirofumi MZ // There is no "WM_REDO" in EDIT control 995*bf13ebdaSKatayama Hirofumi MZ break; 996*bf13ebdaSKatayama Hirofumi MZ } 997*bf13ebdaSKatayama Hirofumi MZ if (ToolBase::s_pointSP != 0) // drawing something? 998*bf13ebdaSKatayama Hirofumi MZ { 999*bf13ebdaSKatayama Hirofumi MZ canvasWindow.finishDrawing(); 1000*bf13ebdaSKatayama Hirofumi MZ break; 1001*bf13ebdaSKatayama Hirofumi MZ } 1002*bf13ebdaSKatayama Hirofumi MZ imageModel.Redo(); 1003*bf13ebdaSKatayama Hirofumi MZ break; 1004*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITCOPY: 1005*bf13ebdaSKatayama Hirofumi MZ if (textShown) 1006*bf13ebdaSKatayama Hirofumi MZ { 1007*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(WM_COPY); 1008*bf13ebdaSKatayama Hirofumi MZ break; 1009*bf13ebdaSKatayama Hirofumi MZ } 1010*bf13ebdaSKatayama Hirofumi MZ if (!selectionModel.m_bShow || !OpenClipboard()) 1011*bf13ebdaSKatayama Hirofumi MZ break; 1012*bf13ebdaSKatayama Hirofumi MZ 1013*bf13ebdaSKatayama Hirofumi MZ EmptyClipboard(); 1014*bf13ebdaSKatayama Hirofumi MZ 1015*bf13ebdaSKatayama Hirofumi MZ selectionModel.TakeOff(); 1016*bf13ebdaSKatayama Hirofumi MZ 1017*bf13ebdaSKatayama Hirofumi MZ { 1018*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbmCopy = selectionModel.GetSelectionContents(); 1019*bf13ebdaSKatayama Hirofumi MZ HGLOBAL hGlobal = BitmapToClipboardDIB(hbmCopy); 1020*bf13ebdaSKatayama Hirofumi MZ if (hGlobal) 1021*bf13ebdaSKatayama Hirofumi MZ ::SetClipboardData(CF_DIB, hGlobal); 1022*bf13ebdaSKatayama Hirofumi MZ else 1023*bf13ebdaSKatayama Hirofumi MZ ShowOutOfMemory(); 1024*bf13ebdaSKatayama Hirofumi MZ ::DeleteObject(hbmCopy); 1025*bf13ebdaSKatayama Hirofumi MZ } 1026*bf13ebdaSKatayama Hirofumi MZ 1027*bf13ebdaSKatayama Hirofumi MZ CloseClipboard(); 1028*bf13ebdaSKatayama Hirofumi MZ break; 1029*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITCUT: 1030*bf13ebdaSKatayama Hirofumi MZ if (textShown) 1031*bf13ebdaSKatayama Hirofumi MZ { 1032*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(WM_CUT); 1033*bf13ebdaSKatayama Hirofumi MZ break; 1034*bf13ebdaSKatayama Hirofumi MZ } 1035*bf13ebdaSKatayama Hirofumi MZ /* Copy */ 1036*bf13ebdaSKatayama Hirofumi MZ SendMessage(WM_COMMAND, IDM_EDITCOPY, 0); 1037*bf13ebdaSKatayama Hirofumi MZ /* Delete selection */ 1038*bf13ebdaSKatayama Hirofumi MZ SendMessage(WM_COMMAND, IDM_EDITDELETESELECTION, 0); 1039*bf13ebdaSKatayama Hirofumi MZ break; 1040*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITPASTE: 1041*bf13ebdaSKatayama Hirofumi MZ if (textShown) 1042*bf13ebdaSKatayama Hirofumi MZ { 1043*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(WM_PASTE); 1044*bf13ebdaSKatayama Hirofumi MZ break; 1045*bf13ebdaSKatayama Hirofumi MZ } 1046*bf13ebdaSKatayama Hirofumi MZ 1047*bf13ebdaSKatayama Hirofumi MZ if (!OpenClipboard()) 1048*bf13ebdaSKatayama Hirofumi MZ break; 1049*bf13ebdaSKatayama Hirofumi MZ 1050*bf13ebdaSKatayama Hirofumi MZ // In many cases, CF_ENHMETAFILE provides a better image than CF_DIB 1051*bf13ebdaSKatayama Hirofumi MZ if (::IsClipboardFormatAvailable(CF_ENHMETAFILE)) 1052*bf13ebdaSKatayama Hirofumi MZ { 1053*bf13ebdaSKatayama Hirofumi MZ HENHMETAFILE hEMF = (HENHMETAFILE)::GetClipboardData(CF_ENHMETAFILE); 1054*bf13ebdaSKatayama Hirofumi MZ if (hEMF) 1055*bf13ebdaSKatayama Hirofumi MZ { 1056*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbm = BitmapFromHEMF(hEMF); 1057*bf13ebdaSKatayama Hirofumi MZ ::DeleteEnhMetaFile(hEMF); 1058*bf13ebdaSKatayama Hirofumi MZ if (hbm) 1059*bf13ebdaSKatayama Hirofumi MZ { 1060*bf13ebdaSKatayama Hirofumi MZ InsertSelectionFromHBITMAP(hbm, m_hWnd); 1061*bf13ebdaSKatayama Hirofumi MZ CloseClipboard(); 1062*bf13ebdaSKatayama Hirofumi MZ break; 1063*bf13ebdaSKatayama Hirofumi MZ } 1064*bf13ebdaSKatayama Hirofumi MZ } 1065*bf13ebdaSKatayama Hirofumi MZ } 1066*bf13ebdaSKatayama Hirofumi MZ 1067*bf13ebdaSKatayama Hirofumi MZ // In many cases, CF_DIB provides a better image than CF_BITMAP 1068*bf13ebdaSKatayama Hirofumi MZ if (::IsClipboardFormatAvailable(CF_DIB)) 1069*bf13ebdaSKatayama Hirofumi MZ { 1070*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbm = BitmapFromClipboardDIB(::GetClipboardData(CF_DIB)); 1071*bf13ebdaSKatayama Hirofumi MZ if (hbm) 1072*bf13ebdaSKatayama Hirofumi MZ { 1073*bf13ebdaSKatayama Hirofumi MZ InsertSelectionFromHBITMAP(hbm, m_hWnd); 1074*bf13ebdaSKatayama Hirofumi MZ CloseClipboard(); 1075*bf13ebdaSKatayama Hirofumi MZ break; 1076*bf13ebdaSKatayama Hirofumi MZ } 1077*bf13ebdaSKatayama Hirofumi MZ } 1078*bf13ebdaSKatayama Hirofumi MZ 1079*bf13ebdaSKatayama Hirofumi MZ // The last resort 1080*bf13ebdaSKatayama Hirofumi MZ if (::IsClipboardFormatAvailable(CF_BITMAP)) 1081*bf13ebdaSKatayama Hirofumi MZ { 1082*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbm = (HBITMAP)::GetClipboardData(CF_BITMAP); 1083*bf13ebdaSKatayama Hirofumi MZ if (hbm) 1084*bf13ebdaSKatayama Hirofumi MZ { 1085*bf13ebdaSKatayama Hirofumi MZ InsertSelectionFromHBITMAP(hbm, m_hWnd); 1086*bf13ebdaSKatayama Hirofumi MZ CloseClipboard(); 1087*bf13ebdaSKatayama Hirofumi MZ break; 1088*bf13ebdaSKatayama Hirofumi MZ } 1089*bf13ebdaSKatayama Hirofumi MZ } 1090*bf13ebdaSKatayama Hirofumi MZ 1091*bf13ebdaSKatayama Hirofumi MZ // Failed to paste 1092*bf13ebdaSKatayama Hirofumi MZ { 1093*bf13ebdaSKatayama Hirofumi MZ CStringW strText, strTitle; 1094*bf13ebdaSKatayama Hirofumi MZ strText.LoadString(IDS_CANTPASTE); 1095*bf13ebdaSKatayama Hirofumi MZ strTitle.LoadString(IDS_PROGRAMNAME); 1096*bf13ebdaSKatayama Hirofumi MZ MessageBox(strText, strTitle, MB_ICONINFORMATION); 1097*bf13ebdaSKatayama Hirofumi MZ } 1098*bf13ebdaSKatayama Hirofumi MZ 1099*bf13ebdaSKatayama Hirofumi MZ CloseClipboard(); 1100*bf13ebdaSKatayama Hirofumi MZ break; 1101*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITDELETESELECTION: 1102*bf13ebdaSKatayama Hirofumi MZ { 1103*bf13ebdaSKatayama Hirofumi MZ if (textShown) 1104*bf13ebdaSKatayama Hirofumi MZ { 1105*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(WM_CLEAR); 1106*bf13ebdaSKatayama Hirofumi MZ break; 1107*bf13ebdaSKatayama Hirofumi MZ } 1108*bf13ebdaSKatayama Hirofumi MZ switch (toolsModel.GetActiveTool()) 1109*bf13ebdaSKatayama Hirofumi MZ { 1110*bf13ebdaSKatayama Hirofumi MZ case TOOL_FREESEL: 1111*bf13ebdaSKatayama Hirofumi MZ case TOOL_RECTSEL: 1112*bf13ebdaSKatayama Hirofumi MZ selectionModel.DeleteSelection(); 1113*bf13ebdaSKatayama Hirofumi MZ break; 1114*bf13ebdaSKatayama Hirofumi MZ 1115*bf13ebdaSKatayama Hirofumi MZ case TOOL_TEXT: 1116*bf13ebdaSKatayama Hirofumi MZ canvasWindow.cancelDrawing(); 1117*bf13ebdaSKatayama Hirofumi MZ break; 1118*bf13ebdaSKatayama Hirofumi MZ default: 1119*bf13ebdaSKatayama Hirofumi MZ break; 1120*bf13ebdaSKatayama Hirofumi MZ } 1121*bf13ebdaSKatayama Hirofumi MZ break; 1122*bf13ebdaSKatayama Hirofumi MZ } 1123*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITSELECTALL: 1124*bf13ebdaSKatayama Hirofumi MZ { 1125*bf13ebdaSKatayama Hirofumi MZ if (textShown) 1126*bf13ebdaSKatayama Hirofumi MZ { 1127*bf13ebdaSKatayama Hirofumi MZ textEditWindow.SendMessage(EM_SETSEL, 0, -1); 1128*bf13ebdaSKatayama Hirofumi MZ break; 1129*bf13ebdaSKatayama Hirofumi MZ } 1130*bf13ebdaSKatayama Hirofumi MZ HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL); 1131*bf13ebdaSKatayama Hirofumi MZ ::SendMessageW(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELPARAM(TRUE, 0)); 1132*bf13ebdaSKatayama Hirofumi MZ toolsModel.selectAll(); 1133*bf13ebdaSKatayama Hirofumi MZ canvasWindow.Invalidate(TRUE); 1134*bf13ebdaSKatayama Hirofumi MZ break; 1135*bf13ebdaSKatayama Hirofumi MZ } 1136*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITCOPYTO: 1137*bf13ebdaSKatayama Hirofumi MZ { 1138*bf13ebdaSKatayama Hirofumi MZ WCHAR szFileName[MAX_LONG_PATH]; 1139*bf13ebdaSKatayama Hirofumi MZ ::LoadStringW(g_hinstExe, IDS_DEFAULTFILENAME, szFileName, _countof(szFileName)); 1140*bf13ebdaSKatayama Hirofumi MZ if (GetSaveFileName(szFileName, _countof(szFileName))) 1141*bf13ebdaSKatayama Hirofumi MZ { 1142*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbmSelection = selectionModel.GetSelectionContents(); 1143*bf13ebdaSKatayama Hirofumi MZ if (!hbmSelection) 1144*bf13ebdaSKatayama Hirofumi MZ { 1145*bf13ebdaSKatayama Hirofumi MZ ShowOutOfMemory(); 1146*bf13ebdaSKatayama Hirofumi MZ break; 1147*bf13ebdaSKatayama Hirofumi MZ } 1148*bf13ebdaSKatayama Hirofumi MZ SaveDIBToFile(hbmSelection, szFileName, FALSE); 1149*bf13ebdaSKatayama Hirofumi MZ DeleteObject(hbmSelection); 1150*bf13ebdaSKatayama Hirofumi MZ } 1151*bf13ebdaSKatayama Hirofumi MZ break; 1152*bf13ebdaSKatayama Hirofumi MZ } 1153*bf13ebdaSKatayama Hirofumi MZ case IDM_EDITPASTEFROM: 1154*bf13ebdaSKatayama Hirofumi MZ { 1155*bf13ebdaSKatayama Hirofumi MZ WCHAR szFileName[MAX_LONG_PATH] = L""; 1156*bf13ebdaSKatayama Hirofumi MZ if (GetOpenFileName(szFileName, _countof(szFileName))) 1157*bf13ebdaSKatayama Hirofumi MZ { 1158*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbmNew = DoLoadImageFile(m_hWnd, szFileName, FALSE); 1159*bf13ebdaSKatayama Hirofumi MZ if (hbmNew) 1160*bf13ebdaSKatayama Hirofumi MZ InsertSelectionFromHBITMAP(hbmNew, m_hWnd); 1161*bf13ebdaSKatayama Hirofumi MZ } 1162*bf13ebdaSKatayama Hirofumi MZ break; 1163*bf13ebdaSKatayama Hirofumi MZ } 1164*bf13ebdaSKatayama Hirofumi MZ case IDM_COLORSEDITPALETTE: 1165*bf13ebdaSKatayama Hirofumi MZ { 1166*bf13ebdaSKatayama Hirofumi MZ COLORREF rgbColor = paletteModel.GetFgColor(); 1167*bf13ebdaSKatayama Hirofumi MZ if (ChooseColor(&rgbColor)) 1168*bf13ebdaSKatayama Hirofumi MZ paletteModel.SetFgColor(rgbColor); 1169*bf13ebdaSKatayama Hirofumi MZ break; 1170*bf13ebdaSKatayama Hirofumi MZ } 1171*bf13ebdaSKatayama Hirofumi MZ case IDM_COLORSMODERNPALETTE: 1172*bf13ebdaSKatayama Hirofumi MZ paletteModel.SelectPalette(PAL_MODERN); 1173*bf13ebdaSKatayama Hirofumi MZ break; 1174*bf13ebdaSKatayama Hirofumi MZ case IDM_COLORSOLDPALETTE: 1175*bf13ebdaSKatayama Hirofumi MZ paletteModel.SelectPalette(PAL_OLDTYPE); 1176*bf13ebdaSKatayama Hirofumi MZ break; 1177*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGEINVERTCOLORS: 1178*bf13ebdaSKatayama Hirofumi MZ { 1179*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1180*bf13ebdaSKatayama Hirofumi MZ selectionModel.InvertSelection(); 1181*bf13ebdaSKatayama Hirofumi MZ else 1182*bf13ebdaSKatayama Hirofumi MZ imageModel.InvertColors(); 1183*bf13ebdaSKatayama Hirofumi MZ break; 1184*bf13ebdaSKatayama Hirofumi MZ } 1185*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGEDELETEIMAGE: 1186*bf13ebdaSKatayama Hirofumi MZ imageModel.PushImageForUndo(); 1187*bf13ebdaSKatayama Hirofumi MZ Rect(imageModel.GetDC(), 0, 0, imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetBgColor(), paletteModel.GetBgColor(), 0, TRUE); 1188*bf13ebdaSKatayama Hirofumi MZ imageModel.NotifyImageChanged(); 1189*bf13ebdaSKatayama Hirofumi MZ break; 1190*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGEROTATEMIRROR: 1191*bf13ebdaSKatayama Hirofumi MZ { 1192*bf13ebdaSKatayama Hirofumi MZ CWaitCursor waitCursor; 1193*bf13ebdaSKatayama Hirofumi MZ canvasWindow.updateScrollPos(); 1194*bf13ebdaSKatayama Hirofumi MZ switch (mirrorRotateDialog.DoModal(mainWindow.m_hWnd)) 1195*bf13ebdaSKatayama Hirofumi MZ { 1196*bf13ebdaSKatayama Hirofumi MZ case 1: /* flip horizontally */ 1197*bf13ebdaSKatayama Hirofumi MZ { 1198*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1199*bf13ebdaSKatayama Hirofumi MZ selectionModel.FlipHorizontally(); 1200*bf13ebdaSKatayama Hirofumi MZ else 1201*bf13ebdaSKatayama Hirofumi MZ imageModel.FlipHorizontally(); 1202*bf13ebdaSKatayama Hirofumi MZ break; 1203*bf13ebdaSKatayama Hirofumi MZ } 1204*bf13ebdaSKatayama Hirofumi MZ case 2: /* flip vertically */ 1205*bf13ebdaSKatayama Hirofumi MZ { 1206*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1207*bf13ebdaSKatayama Hirofumi MZ selectionModel.FlipVertically(); 1208*bf13ebdaSKatayama Hirofumi MZ else 1209*bf13ebdaSKatayama Hirofumi MZ imageModel.FlipVertically(); 1210*bf13ebdaSKatayama Hirofumi MZ break; 1211*bf13ebdaSKatayama Hirofumi MZ } 1212*bf13ebdaSKatayama Hirofumi MZ case 3: /* rotate 90 degrees */ 1213*bf13ebdaSKatayama Hirofumi MZ { 1214*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1215*bf13ebdaSKatayama Hirofumi MZ selectionModel.RotateNTimes90Degrees(1); 1216*bf13ebdaSKatayama Hirofumi MZ else 1217*bf13ebdaSKatayama Hirofumi MZ imageModel.RotateNTimes90Degrees(1); 1218*bf13ebdaSKatayama Hirofumi MZ break; 1219*bf13ebdaSKatayama Hirofumi MZ } 1220*bf13ebdaSKatayama Hirofumi MZ case 4: /* rotate 180 degrees */ 1221*bf13ebdaSKatayama Hirofumi MZ { 1222*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1223*bf13ebdaSKatayama Hirofumi MZ selectionModel.RotateNTimes90Degrees(2); 1224*bf13ebdaSKatayama Hirofumi MZ else 1225*bf13ebdaSKatayama Hirofumi MZ imageModel.RotateNTimes90Degrees(2); 1226*bf13ebdaSKatayama Hirofumi MZ break; 1227*bf13ebdaSKatayama Hirofumi MZ } 1228*bf13ebdaSKatayama Hirofumi MZ case 5: /* rotate 270 degrees */ 1229*bf13ebdaSKatayama Hirofumi MZ { 1230*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1231*bf13ebdaSKatayama Hirofumi MZ selectionModel.RotateNTimes90Degrees(3); 1232*bf13ebdaSKatayama Hirofumi MZ else 1233*bf13ebdaSKatayama Hirofumi MZ imageModel.RotateNTimes90Degrees(3); 1234*bf13ebdaSKatayama Hirofumi MZ break; 1235*bf13ebdaSKatayama Hirofumi MZ } 1236*bf13ebdaSKatayama Hirofumi MZ } 1237*bf13ebdaSKatayama Hirofumi MZ } 1238*bf13ebdaSKatayama Hirofumi MZ break; 1239*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGEATTRIBUTES: 1240*bf13ebdaSKatayama Hirofumi MZ { 1241*bf13ebdaSKatayama Hirofumi MZ if (attributesDialog.DoModal(mainWindow.m_hWnd)) 1242*bf13ebdaSKatayama Hirofumi MZ { 1243*bf13ebdaSKatayama Hirofumi MZ CWaitCursor waitCursor; 1244*bf13ebdaSKatayama Hirofumi MZ if (attributesDialog.m_bBlackAndWhite && !imageModel.IsBlackAndWhite()) 1245*bf13ebdaSKatayama Hirofumi MZ { 1246*bf13ebdaSKatayama Hirofumi MZ CStringW strText(MAKEINTRESOURCEW(IDS_LOSECOLOR)); 1247*bf13ebdaSKatayama Hirofumi MZ CStringW strTitle(MAKEINTRESOURCEW(IDS_PROGRAMNAME)); 1248*bf13ebdaSKatayama Hirofumi MZ INT id = MessageBox(strText, strTitle, MB_ICONINFORMATION | MB_YESNOCANCEL); 1249*bf13ebdaSKatayama Hirofumi MZ if (id != IDYES) 1250*bf13ebdaSKatayama Hirofumi MZ break; 1251*bf13ebdaSKatayama Hirofumi MZ 1252*bf13ebdaSKatayama Hirofumi MZ imageModel.PushBlackAndWhite(); 1253*bf13ebdaSKatayama Hirofumi MZ } 1254*bf13ebdaSKatayama Hirofumi MZ 1255*bf13ebdaSKatayama Hirofumi MZ if (imageModel.GetWidth() != attributesDialog.newWidth || 1256*bf13ebdaSKatayama Hirofumi MZ imageModel.GetHeight() != attributesDialog.newHeight) 1257*bf13ebdaSKatayama Hirofumi MZ { 1258*bf13ebdaSKatayama Hirofumi MZ imageModel.Crop(attributesDialog.newWidth, attributesDialog.newHeight); 1259*bf13ebdaSKatayama Hirofumi MZ } 1260*bf13ebdaSKatayama Hirofumi MZ } 1261*bf13ebdaSKatayama Hirofumi MZ break; 1262*bf13ebdaSKatayama Hirofumi MZ } 1263*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGESTRETCHSKEW: 1264*bf13ebdaSKatayama Hirofumi MZ { 1265*bf13ebdaSKatayama Hirofumi MZ if (stretchSkewDialog.DoModal(mainWindow.m_hWnd)) 1266*bf13ebdaSKatayama Hirofumi MZ { 1267*bf13ebdaSKatayama Hirofumi MZ CWaitCursor waitCursor; 1268*bf13ebdaSKatayama Hirofumi MZ if (selectionModel.m_bShow) 1269*bf13ebdaSKatayama Hirofumi MZ { 1270*bf13ebdaSKatayama Hirofumi MZ selectionModel.StretchSkew(stretchSkewDialog.percentage.x, stretchSkewDialog.percentage.y, 1271*bf13ebdaSKatayama Hirofumi MZ stretchSkewDialog.angle.x, stretchSkewDialog.angle.y); 1272*bf13ebdaSKatayama Hirofumi MZ } 1273*bf13ebdaSKatayama Hirofumi MZ else 1274*bf13ebdaSKatayama Hirofumi MZ { 1275*bf13ebdaSKatayama Hirofumi MZ imageModel.StretchSkew(stretchSkewDialog.percentage.x, stretchSkewDialog.percentage.y, 1276*bf13ebdaSKatayama Hirofumi MZ stretchSkewDialog.angle.x, stretchSkewDialog.angle.y); 1277*bf13ebdaSKatayama Hirofumi MZ } 1278*bf13ebdaSKatayama Hirofumi MZ } 1279*bf13ebdaSKatayama Hirofumi MZ break; 1280*bf13ebdaSKatayama Hirofumi MZ } 1281*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGEDRAWOPAQUE: 1282*bf13ebdaSKatayama Hirofumi MZ toolsModel.SetBackgroundTransparent(!toolsModel.IsBackgroundTransparent()); 1283*bf13ebdaSKatayama Hirofumi MZ break; 1284*bf13ebdaSKatayama Hirofumi MZ case IDM_IMAGECROP: 1285*bf13ebdaSKatayama Hirofumi MZ { 1286*bf13ebdaSKatayama Hirofumi MZ HBITMAP hbmCopy = selectionModel.GetSelectionContents(); 1287*bf13ebdaSKatayama Hirofumi MZ imageModel.PushImageForUndo(hbmCopy); 1288*bf13ebdaSKatayama Hirofumi MZ selectionModel.HideSelection(); 1289*bf13ebdaSKatayama Hirofumi MZ break; 1290*bf13ebdaSKatayama Hirofumi MZ } 1291*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWTOOLBOX: 1292*bf13ebdaSKatayama Hirofumi MZ registrySettings.ShowToolBox = !toolBoxContainer.IsWindowVisible(); 1293*bf13ebdaSKatayama Hirofumi MZ toolBoxContainer.ShowWindow(registrySettings.ShowToolBox ? SW_SHOWNOACTIVATE : SW_HIDE); 1294*bf13ebdaSKatayama Hirofumi MZ alignChildrenToMainWindow(); 1295*bf13ebdaSKatayama Hirofumi MZ break; 1296*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWCOLORPALETTE: 1297*bf13ebdaSKatayama Hirofumi MZ registrySettings.ShowPalette = !paletteWindow.IsWindowVisible(); 1298*bf13ebdaSKatayama Hirofumi MZ paletteWindow.ShowWindow(registrySettings.ShowPalette ? SW_SHOWNOACTIVATE : SW_HIDE); 1299*bf13ebdaSKatayama Hirofumi MZ alignChildrenToMainWindow(); 1300*bf13ebdaSKatayama Hirofumi MZ break; 1301*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWSTATUSBAR: 1302*bf13ebdaSKatayama Hirofumi MZ registrySettings.ShowStatusBar = !::IsWindowVisible(g_hStatusBar); 1303*bf13ebdaSKatayama Hirofumi MZ ::ShowWindow(g_hStatusBar, (registrySettings.ShowStatusBar ? SW_SHOWNOACTIVATE : SW_HIDE)); 1304*bf13ebdaSKatayama Hirofumi MZ alignChildrenToMainWindow(); 1305*bf13ebdaSKatayama Hirofumi MZ break; 1306*bf13ebdaSKatayama Hirofumi MZ case IDM_FORMATICONBAR: 1307*bf13ebdaSKatayama Hirofumi MZ if (toolsModel.GetActiveTool() == TOOL_TEXT) 1308*bf13ebdaSKatayama Hirofumi MZ { 1309*bf13ebdaSKatayama Hirofumi MZ if (!fontsDialog.IsWindow()) 1310*bf13ebdaSKatayama Hirofumi MZ { 1311*bf13ebdaSKatayama Hirofumi MZ fontsDialog.Create(mainWindow); 1312*bf13ebdaSKatayama Hirofumi MZ } 1313*bf13ebdaSKatayama Hirofumi MZ registrySettings.ShowTextTool = !::IsWindowVisible(fontsDialog); 1314*bf13ebdaSKatayama Hirofumi MZ fontsDialog.ShowWindow(registrySettings.ShowTextTool ? SW_SHOW : SW_HIDE); 1315*bf13ebdaSKatayama Hirofumi MZ fontsDialog.SendMessage(DM_REPOSITION, 0, 0); 1316*bf13ebdaSKatayama Hirofumi MZ } 1317*bf13ebdaSKatayama Hirofumi MZ break; 1318*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWSHOWGRID: 1319*bf13ebdaSKatayama Hirofumi MZ g_showGrid = !g_showGrid; 1320*bf13ebdaSKatayama Hirofumi MZ canvasWindow.Invalidate(FALSE); 1321*bf13ebdaSKatayama Hirofumi MZ break; 1322*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWSHOWMINIATURE: 1323*bf13ebdaSKatayama Hirofumi MZ registrySettings.ShowThumbnail = !::IsWindowVisible(miniature); 1324*bf13ebdaSKatayama Hirofumi MZ miniature.DoCreate(m_hWnd); 1325*bf13ebdaSKatayama Hirofumi MZ miniature.ShowWindow(registrySettings.ShowThumbnail ? SW_SHOWNOACTIVATE : SW_HIDE); 1326*bf13ebdaSKatayama Hirofumi MZ break; 1327*bf13ebdaSKatayama Hirofumi MZ 1328*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM125: 1329*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(125); 1330*bf13ebdaSKatayama Hirofumi MZ break; 1331*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM25: 1332*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(250); 1333*bf13ebdaSKatayama Hirofumi MZ break; 1334*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM50: 1335*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(500); 1336*bf13ebdaSKatayama Hirofumi MZ break; 1337*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM100: 1338*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(1000); 1339*bf13ebdaSKatayama Hirofumi MZ break; 1340*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM200: 1341*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(2000); 1342*bf13ebdaSKatayama Hirofumi MZ break; 1343*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM400: 1344*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(4000); 1345*bf13ebdaSKatayama Hirofumi MZ break; 1346*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWZOOM800: 1347*bf13ebdaSKatayama Hirofumi MZ canvasWindow.zoomTo(8000); 1348*bf13ebdaSKatayama Hirofumi MZ break; 1349*bf13ebdaSKatayama Hirofumi MZ 1350*bf13ebdaSKatayama Hirofumi MZ case IDM_VIEWFULLSCREEN: 1351*bf13ebdaSKatayama Hirofumi MZ // Create and show the fullscreen window 1352*bf13ebdaSKatayama Hirofumi MZ fullscreenWindow.DoCreate(); 1353*bf13ebdaSKatayama Hirofumi MZ fullscreenWindow.ShowWindow(SW_SHOWMAXIMIZED); 1354*bf13ebdaSKatayama Hirofumi MZ break; 1355*bf13ebdaSKatayama Hirofumi MZ 1356*bf13ebdaSKatayama Hirofumi MZ case IDM_CTRL_PLUS: 1357*bf13ebdaSKatayama Hirofumi MZ toolsModel.SpecialTweak(FALSE); 1358*bf13ebdaSKatayama Hirofumi MZ break; 1359*bf13ebdaSKatayama Hirofumi MZ case IDM_CTRL_MINUS: 1360*bf13ebdaSKatayama Hirofumi MZ toolsModel.SpecialTweak(TRUE); 1361*bf13ebdaSKatayama Hirofumi MZ break; 1362*bf13ebdaSKatayama Hirofumi MZ } 1363*bf13ebdaSKatayama Hirofumi MZ return 0; 1364*bf13ebdaSKatayama Hirofumi MZ } 1365*bf13ebdaSKatayama Hirofumi MZ 1366*bf13ebdaSKatayama Hirofumi MZ VOID CMainWindow::TrackPopupMenu(POINT ptScreen, INT iSubMenu) 1367*bf13ebdaSKatayama Hirofumi MZ { 1368*bf13ebdaSKatayama Hirofumi MZ HMENU hMenu = ::LoadMenuW(g_hinstExe, MAKEINTRESOURCEW(ID_POPUPMENU)); 1369*bf13ebdaSKatayama Hirofumi MZ HMENU hSubMenu = ::GetSubMenu(hMenu, iSubMenu); 1370*bf13ebdaSKatayama Hirofumi MZ 1371*bf13ebdaSKatayama Hirofumi MZ ::SetForegroundWindow(m_hWnd); 1372*bf13ebdaSKatayama Hirofumi MZ INT_PTR id = ::TrackPopupMenu(hSubMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, 1373*bf13ebdaSKatayama Hirofumi MZ ptScreen.x, ptScreen.y, 0, m_hWnd, NULL); 1374*bf13ebdaSKatayama Hirofumi MZ PostMessage(WM_NULL); 1375*bf13ebdaSKatayama Hirofumi MZ if (id != 0) 1376*bf13ebdaSKatayama Hirofumi MZ PostMessage(WM_COMMAND, id); 1377*bf13ebdaSKatayama Hirofumi MZ 1378*bf13ebdaSKatayama Hirofumi MZ ::DestroyMenu(hMenu); 1379*bf13ebdaSKatayama Hirofumi MZ } 1380*bf13ebdaSKatayama Hirofumi MZ 138129e147beSKatayama Hirofumi MZ // entry point 138229e147beSKatayama Hirofumi MZ INT WINAPI 1383640d67d1SKatayama Hirofumi MZ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nCmdShow) 138429e147beSKatayama Hirofumi MZ { 1385e8c7e300SKatayama Hirofumi MZ g_hinstExe = hInstance; 138629e147beSKatayama Hirofumi MZ 138729e147beSKatayama Hirofumi MZ // Initialize common controls library 138829e147beSKatayama Hirofumi MZ INITCOMMONCONTROLSEX iccx; 138929e147beSKatayama Hirofumi MZ iccx.dwSize = sizeof(iccx); 139029e147beSKatayama Hirofumi MZ iccx.dwICC = ICC_STANDARD_CLASSES | ICC_USEREX_CLASSES | ICC_BAR_CLASSES; 139129e147beSKatayama Hirofumi MZ InitCommonControlsEx(&iccx); 139229e147beSKatayama Hirofumi MZ 139329e147beSKatayama Hirofumi MZ // Load settings from registry 139429e147beSKatayama Hirofumi MZ registrySettings.Load(nCmdShow); 139529e147beSKatayama Hirofumi MZ 139629e147beSKatayama Hirofumi MZ // Create the main window 139729e147beSKatayama Hirofumi MZ if (!mainWindow.DoCreate()) 139829e147beSKatayama Hirofumi MZ { 1399640d67d1SKatayama Hirofumi MZ MessageBox(NULL, L"Failed to create main window.", NULL, MB_ICONERROR); 140029e147beSKatayama Hirofumi MZ return 1; 140129e147beSKatayama Hirofumi MZ } 140229e147beSKatayama Hirofumi MZ 140329e147beSKatayama Hirofumi MZ // Initialize imageModel 14043e23cdf9SKatayama Hirofumi MZ if (__argc < 2 || !DoLoadImageFile(mainWindow, __targv[1], TRUE)) 14053e23cdf9SKatayama Hirofumi MZ InitializeImage(NULL, NULL, FALSE); 140629e147beSKatayama Hirofumi MZ 140729e147beSKatayama Hirofumi MZ // Make the window visible on the screen 140829e147beSKatayama Hirofumi MZ mainWindow.ShowWindow(registrySettings.WindowPlacement.showCmd); 140929e147beSKatayama Hirofumi MZ 141029e147beSKatayama Hirofumi MZ // Load the access keys 1411640d67d1SKatayama Hirofumi MZ HACCEL hAccel = ::LoadAcceleratorsW(hInstance, MAKEINTRESOURCEW(800)); 141229e147beSKatayama Hirofumi MZ 141329e147beSKatayama Hirofumi MZ // The message loop 141429e147beSKatayama Hirofumi MZ MSG msg; 141529e147beSKatayama Hirofumi MZ while (::GetMessage(&msg, NULL, 0, 0)) 141629e147beSKatayama Hirofumi MZ { 141729e147beSKatayama Hirofumi MZ if (fontsDialog.IsWindow() && fontsDialog.IsDialogMessage(&msg)) 141829e147beSKatayama Hirofumi MZ continue; 141929e147beSKatayama Hirofumi MZ 1420640d67d1SKatayama Hirofumi MZ if (::TranslateAcceleratorW(mainWindow, hAccel, &msg)) 142129e147beSKatayama Hirofumi MZ continue; 142229e147beSKatayama Hirofumi MZ 142329e147beSKatayama Hirofumi MZ ::TranslateMessage(&msg); 142429e147beSKatayama Hirofumi MZ ::DispatchMessage(&msg); 142529e147beSKatayama Hirofumi MZ } 142629e147beSKatayama Hirofumi MZ 142729e147beSKatayama Hirofumi MZ // Unload the access keys 142829e147beSKatayama Hirofumi MZ ::DestroyAcceleratorTable(hAccel); 142929e147beSKatayama Hirofumi MZ 143029e147beSKatayama Hirofumi MZ // Write back settings to registry 1431c2c66affSColin Finck registrySettings.Store(); 1432c2c66affSColin Finck 1433ba53f72aSKatayama Hirofumi MZ if (g_szMailTempFile[0]) 1434ba53f72aSKatayama Hirofumi MZ ::DeleteFileW(g_szMailTempFile); 1435ba53f72aSKatayama Hirofumi MZ 143629e147beSKatayama Hirofumi MZ // Return the value that PostQuitMessage() gave 143729e147beSKatayama Hirofumi MZ return (INT)msg.wParam; 1438c2c66affSColin Finck } 1439