2 * PROJECT: PAINT for ReactOS
4 * FILE: base/applications/paint/selection.c
5 * PURPOSE: Window procedure of the selection window
6 * PROGRAMMERS: Benedikt Freisen
9 /* INCLUDES *********************************************************/
14 #include "globalvar.h"
20 /* FUNCTIONS ********************************************************/
22 LPCTSTR cursors
[9] = { IDC_SIZEALL
, IDC_SIZENWSE
, IDC_SIZENS
, IDC_SIZENESW
,
23 IDC_SIZEWE
, IDC_SIZEWE
, IDC_SIZENESW
, IDC_SIZENS
, IDC_SIZENWSE
34 identifyCorner(short x
, short y
, short w
, short h
)
40 if ((x
< w
/ 2 + 2) && (x
>= w
/ 2 - 1))
45 if ((y
< h
/ 2 + 2) && (y
>= h
/ 2 - 1))
56 if ((x
< w
/ 2 + 2) && (x
>= w
/ 2 - 1))
65 SelectionWinProc(HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
73 HDC hDC
= GetDC(hwnd
);
74 DefWindowProc(hwnd
, message
, wParam
, lParam
);
75 SelectionFrame(hDC
, 1, 1, rectSel_dest
[2] * zoom
/ 1000 + 5,
76 rectSel_dest
[3] * zoom
/ 1000 + 5);
82 xPos
= LOWORD(lParam
);
83 yPos
= HIWORD(lParam
);
86 SetCursor(LoadCursor(NULL
, cursors
[action
]));
96 xFrac
+= (short)LOWORD(lParam
) - xPos
;
97 yFrac
+= (short)HIWORD(lParam
) - yPos
;
100 xDelta
= xFrac
* 1000 / zoom
;
102 yDelta
= yFrac
* 1000 / zoom
;
107 xDelta
= xFrac
* 1000 / zoom
;
108 xFrac
-= (xFrac
* 1000 / zoom
) * zoom
/ 1000;
109 yDelta
= yFrac
* 1000 / zoom
;
110 yFrac
-= (yFrac
* 1000 / zoom
) * zoom
/ 1000;
115 rectSel_dest
[0] += xDelta
;
116 rectSel_dest
[1] += yDelta
;
119 rectSel_dest
[0] += xDelta
;
120 rectSel_dest
[1] += yDelta
;
121 rectSel_dest
[2] -= xDelta
;
122 rectSel_dest
[3] -= yDelta
;
125 rectSel_dest
[1] += yDelta
;
126 rectSel_dest
[3] -= yDelta
;
129 rectSel_dest
[2] += xDelta
;
130 rectSel_dest
[1] += yDelta
;
133 rectSel_dest
[0] += xDelta
;
134 rectSel_dest
[2] -= xDelta
;
137 rectSel_dest
[2] += xDelta
;
140 rectSel_dest
[0] += xDelta
;
141 rectSel_dest
[2] -= xDelta
;
142 rectSel_dest
[3] += yDelta
;
145 rectSel_dest
[3] += yDelta
;
148 rectSel_dest
[2] += xDelta
;
149 rectSel_dest
[3] += yDelta
;
153 _stprintf(sizeStr
, _T("%d x %d"), rectSel_dest
[2], rectSel_dest
[3]);
154 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) sizeStr
);
157 StretchBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0, GetDIBWidth(hSelBm
), GetDIBHeight(hSelBm
), SRCCOPY
);
160 MaskBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3],
161 hSelDC
, 0, 0, hSelMask
, 0, 0, MAKEROP4(SRCCOPY
, SRCAND
));
167 tempMask
= CreateBitmap(rectSel_dest
[2], rectSel_dest
[3], 1, 1, NULL
);
168 oldBrush
= SelectObject(hSelDC
, CreateSolidBrush(bgColor
));
169 tempDC
= CreateCompatibleDC(hSelDC
);
170 SelectObject(tempDC
, tempMask
);
171 MaskBlt(tempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0, hSelMask
, 0, 0,
172 MAKEROP4(NOTSRCCOPY
, BLACKNESS
));
174 DeleteObject(SelectObject(hSelDC
, oldBrush
));
176 MaskBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3],
177 hSelDC
, 0, 0, tempMask
, 0, 0, MAKEROP4(SRCCOPY
, SRCAND
));
178 DeleteObject(tempMask
);
180 SendMessage(hImageArea
, WM_PAINT
, 0, 0);
181 xPos
= LOWORD(lParam
);
182 yPos
= HIWORD(lParam
);
183 //SendMessage(hwnd, WM_PAINT, 0, 0);
187 int w
= rectSel_dest
[2] * zoom
/ 1000 + 6;
188 int h
= rectSel_dest
[3] * zoom
/ 1000 + 6;
189 xPos
= LOWORD(lParam
);
190 yPos
= HIWORD(lParam
);
191 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) NULL
);
192 action
= identifyCorner(xPos
, yPos
, w
, h
);
194 SetCursor(LoadCursor(NULL
, cursors
[action
]));
206 hTempDC
= CreateCompatibleDC(hSelDC
);
207 hTempBm
= CreateDIBWithProperties(rectSel_dest
[2], rectSel_dest
[3]);
208 SelectObject(hTempDC
, hTempBm
);
209 SelectObject(hSelDC
, hSelBm
);
210 StretchBlt(hTempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0,
211 GetDIBWidth(hSelBm
), GetDIBHeight(hSelBm
), SRCCOPY
);
212 DeleteObject(hSelBm
);
214 hTempBm
= CreateBitmap(rectSel_dest
[2], rectSel_dest
[3], 1, 1, NULL
);
215 SelectObject(hTempDC
, hTempBm
);
216 SelectObject(hSelDC
, hSelMask
);
217 StretchBlt(hTempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0,
218 GetDIBWidth(hSelMask
), GetDIBHeight(hSelMask
), SRCCOPY
);
219 DeleteObject(hSelMask
);
221 SelectObject(hSelDC
, hSelBm
);
225 ShowWindow(hSelection
, SW_HIDE
);
226 ShowWindow(hSelection
, SW_SHOW
);
230 return DefWindowProc(hwnd
, message
, wParam
, lParam
);