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 *********************************************************/
13 /* FUNCTIONS ********************************************************/
15 LPCTSTR cursors
[9] = { IDC_SIZEALL
, IDC_SIZENWSE
, IDC_SIZENS
, IDC_SIZENESW
,
16 IDC_SIZEWE
, IDC_SIZEWE
, IDC_SIZENESW
, IDC_SIZENS
, IDC_SIZENWSE
27 identifyCorner(short x
, short y
, short w
, short h
)
33 if ((x
< w
/ 2 + 2) && (x
>= w
/ 2 - 1))
38 if ((y
< h
/ 2 + 2) && (y
>= h
/ 2 - 1))
49 if ((x
< w
/ 2 + 2) && (x
>= w
/ 2 - 1))
58 SelectionWinProc(HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
66 HDC hDC
= GetDC(hwnd
);
67 DefWindowProc(hwnd
, message
, wParam
, lParam
);
68 SelectionFrame(hDC
, 1, 1, rectSel_dest
[2] * zoom
/ 1000 + 5,
69 rectSel_dest
[3] * zoom
/ 1000 + 5);
75 xPos
= LOWORD(lParam
);
76 yPos
= HIWORD(lParam
);
79 SetCursor(LoadCursor(NULL
, cursors
[action
]));
89 xFrac
+= (short)LOWORD(lParam
) - xPos
;
90 yFrac
+= (short)HIWORD(lParam
) - yPos
;
93 xDelta
= xFrac
* 1000 / zoom
;
95 yDelta
= yFrac
* 1000 / zoom
;
100 xDelta
= xFrac
* 1000 / zoom
;
101 xFrac
-= (xFrac
* 1000 / zoom
) * zoom
/ 1000;
102 yDelta
= yFrac
* 1000 / zoom
;
103 yFrac
-= (yFrac
* 1000 / zoom
) * zoom
/ 1000;
108 rectSel_dest
[0] += xDelta
;
109 rectSel_dest
[1] += yDelta
;
112 rectSel_dest
[0] += xDelta
;
113 rectSel_dest
[1] += yDelta
;
114 rectSel_dest
[2] -= xDelta
;
115 rectSel_dest
[3] -= yDelta
;
118 rectSel_dest
[1] += yDelta
;
119 rectSel_dest
[3] -= yDelta
;
122 rectSel_dest
[2] += xDelta
;
123 rectSel_dest
[1] += yDelta
;
126 rectSel_dest
[0] += xDelta
;
127 rectSel_dest
[2] -= xDelta
;
130 rectSel_dest
[2] += xDelta
;
133 rectSel_dest
[0] += xDelta
;
134 rectSel_dest
[2] -= xDelta
;
135 rectSel_dest
[3] += yDelta
;
138 rectSel_dest
[3] += yDelta
;
141 rectSel_dest
[2] += xDelta
;
142 rectSel_dest
[3] += yDelta
;
146 _stprintf(sizeStr
, _T("%d x %d"), rectSel_dest
[2], rectSel_dest
[3]);
147 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) sizeStr
);
150 StretchBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0, GetDIBWidth(hSelBm
), GetDIBHeight(hSelBm
), SRCCOPY
);
153 MaskBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3],
154 hSelDC
, 0, 0, hSelMask
, 0, 0, MAKEROP4(SRCCOPY
, SRCAND
));
160 tempMask
= CreateBitmap(rectSel_dest
[2], rectSel_dest
[3], 1, 1, NULL
);
161 oldBrush
= SelectObject(hSelDC
, CreateSolidBrush(bgColor
));
162 tempDC
= CreateCompatibleDC(hSelDC
);
163 SelectObject(tempDC
, tempMask
);
164 MaskBlt(tempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0, hSelMask
, 0, 0,
165 MAKEROP4(NOTSRCCOPY
, BLACKNESS
));
167 DeleteObject(SelectObject(hSelDC
, oldBrush
));
169 MaskBlt(hDrawingDC
, rectSel_dest
[0], rectSel_dest
[1], rectSel_dest
[2], rectSel_dest
[3],
170 hSelDC
, 0, 0, tempMask
, 0, 0, MAKEROP4(SRCCOPY
, SRCAND
));
171 DeleteObject(tempMask
);
173 SendMessage(hImageArea
, WM_PAINT
, 0, 0);
174 xPos
= LOWORD(lParam
);
175 yPos
= HIWORD(lParam
);
176 //SendMessage(hwnd, WM_PAINT, 0, 0);
180 int w
= rectSel_dest
[2] * zoom
/ 1000 + 6;
181 int h
= rectSel_dest
[3] * zoom
/ 1000 + 6;
182 xPos
= LOWORD(lParam
);
183 yPos
= HIWORD(lParam
);
184 SendMessage(hStatusBar
, SB_SETTEXT
, 2, (LPARAM
) NULL
);
185 action
= identifyCorner(xPos
, yPos
, w
, h
);
187 SetCursor(LoadCursor(NULL
, cursors
[action
]));
199 hTempDC
= CreateCompatibleDC(hSelDC
);
200 hTempBm
= CreateDIBWithProperties(rectSel_dest
[2], rectSel_dest
[3]);
201 SelectObject(hTempDC
, hTempBm
);
202 SelectObject(hSelDC
, hSelBm
);
203 StretchBlt(hTempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0,
204 GetDIBWidth(hSelBm
), GetDIBHeight(hSelBm
), SRCCOPY
);
205 DeleteObject(hSelBm
);
207 hTempBm
= CreateBitmap(rectSel_dest
[2], rectSel_dest
[3], 1, 1, NULL
);
208 SelectObject(hTempDC
, hTempBm
);
209 SelectObject(hSelDC
, hSelMask
);
210 StretchBlt(hTempDC
, 0, 0, rectSel_dest
[2], rectSel_dest
[3], hSelDC
, 0, 0,
211 GetDIBWidth(hSelMask
), GetDIBHeight(hSelMask
), SRCCOPY
);
212 DeleteObject(hSelMask
);
214 SelectObject(hSelDC
, hSelBm
);
218 ShowWindow(hSelection
, SW_HIDE
);
219 ShowWindow(hSelection
, SW_SHOW
);
223 return DefWindowProc(hwnd
, message
, wParam
, lParam
);