Reactos
1/*
2 * PROJECT: PAINT for ReactOS
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Window procedure of the main window and all children apart from
5 * hPalWin, hToolSettings and hSelection
6 * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net>
7 * Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
8 */
9
10#include "precomp.h"
11
12CMiniatureWindow miniature;
13
14/* FUNCTIONS ********************************************************/
15
16CMiniatureWindow::CMiniatureWindow()
17 : m_hbmCached(NULL)
18{
19}
20
21CMiniatureWindow::~CMiniatureWindow()
22{
23 if (m_hbmCached)
24 ::DeleteObject(m_hbmCached);
25}
26
27HWND CMiniatureWindow::DoCreate(HWND hwndParent)
28{
29 if (m_hWnd)
30 return m_hWnd;
31
32 RECT rc =
33 {
34 (LONG)registrySettings.ThumbXPos, (LONG)registrySettings.ThumbYPos,
35 (LONG)(registrySettings.ThumbXPos + registrySettings.ThumbWidth),
36 (LONG)(registrySettings.ThumbYPos + registrySettings.ThumbHeight)
37 };
38
39 WCHAR strTitle[100];
40 ::LoadStringW(g_hinstExe, IDS_MINIATURETITLE, strTitle, _countof(strTitle));
41
42 DWORD style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME;
43 return Create(hwndParent, rc, strTitle, style, WS_EX_PALETTEWINDOW);
44}
45
46LRESULT CMiniatureWindow::OnMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
47{
48 if (IsWindowVisible() && !IsIconic() && !IsZoomed())
49 {
50 CRect rc;
51 GetWindowRect(&rc);
52 registrySettings.ThumbXPos = rc.left;
53 registrySettings.ThumbYPos = rc.top;
54 }
55 return 0;
56}
57
58LRESULT CMiniatureWindow::OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
59{
60 if (IsWindowVisible() && !IsIconic() && !IsZoomed())
61 {
62 CRect rc;
63 GetWindowRect(&rc);
64 registrySettings.ThumbWidth = rc.Width();
65 registrySettings.ThumbHeight = rc.Height();
66 }
67 return 0;
68}
69
70LRESULT CMiniatureWindow::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
71{
72 ShowWindow(SW_HIDE);
73 registrySettings.ShowThumbnail = FALSE;
74 return 0;
75}
76
77LRESULT CMiniatureWindow::OnEraseBkgnd(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
78{
79 return TRUE; /* Avoid flickering */
80}
81
82LRESULT CMiniatureWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
83{
84 RECT rc;
85 GetClientRect(&rc);
86
87 // Start painting
88 PAINTSTRUCT ps;
89 HDC hDC = BeginPaint(&ps);
90 if (!hDC)
91 return 0;
92
93 // Use a memory bitmap to reduce flickering
94 HDC hdcMem = ::CreateCompatibleDC(hDC);
95 m_hbmCached = CachedBufferDIB(m_hbmCached, rc.right, rc.bottom);
96 HGDIOBJ hbmOld = ::SelectObject(hdcMem, m_hbmCached);
97
98 // FIXME: Consider aspect ratio
99
100 // Fill the background
101 ::FillRect(hdcMem, &rc, (HBRUSH)(COLOR_BTNFACE + 1));
102
103 // Draw the image (hdcMem <-- imageModel)
104 int cxImage = imageModel.GetWidth();
105 int cyImage = imageModel.GetHeight();
106 ::StretchBlt(hdcMem, 0, 0, rc.right, rc.bottom,
107 imageModel.GetDC(), 0, 0, cxImage, cyImage,
108 SRCCOPY);
109
110 // Move the image (hDC <-- hdcMem)
111 ::BitBlt(hDC, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY);
112
113 // Clean up
114 ::SelectObject(hdcMem, hbmOld);
115 ::DeleteDC(hdcMem);
116
117 EndPaint(&ps);
118 return 0;
119}
120
121LRESULT CMiniatureWindow::OnGetMinMaxInfo(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
122{
123 // Avoid too small
124 LPMINMAXINFO pInfo = (LPMINMAXINFO)lParam;
125 pInfo->ptMinTrackSize = { 100, 75 };
126 return 0;
127}