xref: /reactos/base/applications/mspaint/main.cpp (revision bf13ebda)
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