3 static const TCHAR szImageEditWndClass
[] = TEXT("ImageSoftEditWndClass");
5 #define IMAGE_FRAME_SIZE 1
8 EditWndUpdateScrollInfo(PEDIT_WND_INFO Info
)
13 GetClientRect(Info
->hSelf
,
16 si
.cbSize
= sizeof(si
);
17 si
.fMask
= SIF_PAGE
| SIF_RANGE
;
18 si
.nPage
= rcClient
.right
- (2 * IMAGE_FRAME_SIZE
);
20 si
.nMax
= Info
->Width
;
22 SetScrollInfo(Info
->hSelf
,
27 si
.nPage
= rcClient
.bottom
- (2 * IMAGE_FRAME_SIZE
);
28 si
.nMax
= Info
->Height
;
29 SetScrollInfo(Info
->hSelf
,
37 LoadBlankCanvas(PEDIT_WND_INFO Info
)
39 /* FIXME: convert this to a DIB Section */
40 /* set bitmap dimensions */
41 Info
->Width
= Info
->OpenInfo
->New
.Width
;
42 Info
->Height
= Info
->OpenInfo
->New
.Height
;
48 LoadDIBImage(PEDIT_WND_INFO Info
)
50 BITMAPFILEHEADER bmfh
;
54 BOOL bSuccess
, bRet
= FALSE
;
56 hFile
= CreateFile(Info
->OpenInfo
->Open
.lpImagePath
,
61 FILE_FLAG_SEQUENTIAL_SCAN
,
63 if (hFile
== INVALID_HANDLE_VALUE
)
66 bSuccess
= ReadFile(hFile
,
68 sizeof(BITMAPFILEHEADER
),
72 if (bSuccess
&& (BytesRead
== sizeof(BITMAPFILEHEADER
))
73 && (bmfh
.bfType
== *(WORD
*)"BM"))
75 DWORD InfoSize
= bmfh
.bfOffBits
- sizeof(BITMAPFILEHEADER
);
77 Info
->pbmi
= HeapAlloc(ProcessHeap
,
82 bSuccess
= ReadFile(hFile
,
88 if (bSuccess
&& (BytesRead
== InfoSize
))
90 Info
->hBitmap
= CreateDIBSection(NULL
,
96 if (Info
->hBitmap
!= NULL
)
100 bmfh
.bfSize
- bmfh
.bfOffBits
,
104 GetObject(Info
->hBitmap
,
108 Info
->Width
= bitmap
.bmWidth
;
109 Info
->Height
= bitmap
.bmHeight
;
128 InitEditWnd(PEDIT_WND_INFO Info
)
134 if (Info
->OpenInfo
!= NULL
)
140 DeleteObject(Info
->hDCMem
);
144 hDC
= GetDC(Info
->hSelf
);
145 Info
->hDCMem
= CreateCompatibleDC(hDC
);
146 ReleaseDC(Info
->hSelf
, hDC
);
148 if (Info
->OpenInfo
->CreateNew
)
150 LoadBlankCanvas(Info
);
157 Info
->OpenInfo
= NULL
;
160 EditWndUpdateScrollInfo(Info
);
162 /* Add image editor to the list */
163 Info
->Next
= Info
->MainWnd
->ImageEditors
;
164 Info
->MainWnd
->ImageEditors
= Info
;
166 InvalidateRect(Info
->hSelf
,
170 /* FIXME - if returning FALSE, remove the image editor from the list! */
175 DestroyEditWnd(PEDIT_WND_INFO Info
)
177 PEDIT_WND_INFO
*PrevEditor
;
178 PEDIT_WND_INFO Editor
;
180 DeleteDC(Info
->hDCMem
);
182 /* FIXME - free resources and run down editor */
183 HeapFree(ProcessHeap
,
186 HeapFree(ProcessHeap
,
190 /* Remove the image editor from the list */
191 PrevEditor
= &Info
->MainWnd
->ImageEditors
;
192 Editor
= Info
->MainWnd
->ImageEditors
;
197 *PrevEditor
= Info
->Next
;
200 PrevEditor
= &Editor
->Next
;
201 Editor
= Editor
->Next
;
202 } while (Editor
!= NULL
);
206 ImageEditWndRepaint(PEDIT_WND_INFO Info
,
214 hOldBitmap
= (HBITMAP
) SelectObject(Info
->hDCMem
,
220 lpps
->rcPaint
.right
- lpps
->rcPaint
.left
,
221 lpps
->rcPaint
.bottom
- lpps
->rcPaint
.top
,
227 Info
->hBitmap
= SelectObject(Info
->hDCMem
, hOldBitmap
);
231 static LRESULT CALLBACK
232 ImageEditWndProc(HWND hwnd
,
240 static INT xMouse
, yMouse
;
241 static BOOL bLeftButtonDown
, bRightButtonDown
;
243 /* Get the window context */
244 Info
= (PEDIT_WND_INFO
)GetWindowLongPtr(hwnd
,
246 if (Info
== NULL
&& uMsg
!= WM_CREATE
)
248 goto HandleDefaultMessage
;
255 Info
= (PEDIT_WND_INFO
)(((LPMDICREATESTRUCT
)((LPCREATESTRUCT
)lParam
)->lpCreateParams
)->lParam
);
258 SetWindowLongPtr(hwnd
,
262 if (!InitEditWnd(Info
))
271 if (Info->Width != 0 && Info->Height != 0)
278 if (! bRightButtonDown
)
279 SetCapture(Info
->hSelf
);
281 bLeftButtonDown
= TRUE
;
282 xMouse
= LOWORD(lParam
);
283 yMouse
= HIWORD(lParam
);
285 SetCursor(LoadCursor(hInstance
,
286 MAKEINTRESOURCE(IDC_PAINTBRUSHCURSORMOUSEDOWN
)));
293 bLeftButtonDown
= FALSE
;
298 if (! bLeftButtonDown
)
299 SetCapture(Info
->hSelf
);
301 bRightButtonDown
= TRUE
;
302 xMouse
= LOWORD(lParam
);
303 yMouse
= HIWORD(lParam
);
305 SetCursor(LoadCursor(hInstance
,
306 MAKEINTRESOURCE(IDC_PAINTBRUSHCURSORMOUSEDOWN
)));
310 if (bRightButtonDown
)
313 bRightButtonDown
= FALSE
;
321 if (!bLeftButtonDown
&& !bRightButtonDown
)
324 hDC
= GetDC(Info
->hSelf
);
326 SelectObject(Info
->hDCMem
,
330 hPen
= CreatePen(PS_SOLID
,
334 hPen
= CreatePen(PS_SOLID
,
338 hPenOld
= SelectObject(hDC
,
340 SelectObject(Info
->hDCMem
,
348 MoveToEx(Info
->hDCMem
,
353 xMouse
= (short)LOWORD(lParam
);
354 yMouse
= (short)HIWORD(lParam
);
366 DeleteObject(SelectObject(Info
->hDCMem
,
369 ReleaseDC(Info
->hSelf
,
376 if (Info
->Width
!= 0 && Info
->Height
!= 0)
381 hDC
= BeginPaint(hwnd
,
385 ImageEditWndRepaint(Info
,
398 EditWndUpdateScrollInfo(Info
);
399 goto HandleDefaultMessage
;
403 case WM_ENTERMENULOOP
:
404 case WM_EXITMENULOOP
:
405 /* forward these messages to the main window procedure */
406 Ret
= SendMessage(Info
->MainWnd
->hSelf
,
413 /* Switch the main window context if neccessary */
414 MainWndSwitchEditorContext(Info
->MainWnd
,
421 DestroyEditWnd(Info
);
423 HeapFree(ProcessHeap
,
426 SetWindowLongPtr(hwnd
,
433 HandleDefaultMessage
:
434 Ret
= DefMDIChildProc(hwnd
,
445 SetImageEditorEnvironment(PEDIT_WND_INFO Info
,
450 /* FIXME - setup editor environment (e.g. show toolbars, enable menus etc) */
454 /* FIXME - cleanup editor environment (e.g. hide toolbars, disable menus etc) */
459 CreateImageEditWindow(PMAIN_WND_INFO MainWnd
,
460 POPEN_IMAGE_EDIT_INFO OpenInfo
)
466 Info
= HeapAlloc(ProcessHeap
,
468 sizeof(EDIT_WND_INFO
));
472 sizeof(EDIT_WND_INFO
));
473 Info
->MainWnd
= MainWnd
;
474 Info
->MdiEditorType
= metImageEditor
;
475 Info
->OpenInfo
= OpenInfo
;
477 if (OpenInfo
->CreateNew
)
479 Width
= OpenInfo
->New
.Width
;
480 Height
= OpenInfo
->New
.Height
;
484 Width
= CW_USEDEFAULT
;
485 Height
= CW_USEDEFAULT
;
488 hWndEditor
= CreateMDIWindow(szImageEditWndClass
,
489 OpenInfo
->lpImageName
,
490 WS_HSCROLL
| WS_VSCROLL
| WS_MAXIMIZE
,
499 if (hWndEditor
!= NULL
)
504 HeapFree(ProcessHeap
,
513 InitImageEditWindowImpl(VOID
)
517 wc
.cbSize
= sizeof(WNDCLASSEX
);
518 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
519 wc
.lpfnWndProc
= ImageEditWndProc
;
520 wc
.hInstance
= hInstance
;
521 wc
.hIcon
= LoadIcon(hInstance
,
522 MAKEINTRESOURCE(IDI_IMAGESOFTICON
));
523 wc
.hCursor
= LoadCursor(hInstance
,
524 MAKEINTRESOURCE(IDC_PAINTBRUSHCURSOR
));
525 wc
.hbrBackground
= (HBRUSH
)GetStockObject(WHITE_BRUSH
);
526 wc
.lpszClassName
= szImageEditWndClass
;
527 wc
.hIconSm
= (HICON
)LoadImage(hInstance
,
528 MAKEINTRESOURCE(IDI_IMAGESOFTICON
),
534 return RegisterClassEx(&wc
) != (ATOM
)0;
538 UninitImageEditWindowImpl(VOID
)
540 UnregisterClass(szImageEditWndClass
,