3210 lines
84 KiB
C++
3210 lines
84 KiB
C++
/**************************************************/
|
|
/* */
|
|
/* */
|
|
/* MDI Child Window( For Edit) */
|
|
/* */
|
|
/* */
|
|
/* Copyright (c) 1997-1999 Microsoft Corporation. */
|
|
/**************************************************/
|
|
|
|
#include "stdafx.h"
|
|
#include "eudcedit.h"
|
|
#include "editwnd.h"
|
|
#include "refrwnd.h"
|
|
#include "vdata.h"
|
|
#include "extfunc.h"
|
|
#include "util.h"
|
|
#include "rotatdlg.h"
|
|
|
|
// For mouse
|
|
#define NCLICK 0
|
|
#define LCLICK 1
|
|
#define RCLICK 2
|
|
|
|
// For selected rectangle
|
|
#define LUPPER 0
|
|
#define RUPPER 1
|
|
#define RLOWER 2
|
|
#define LLOWER 3
|
|
#define MUPPER 4
|
|
#define RMIDLE 5
|
|
#define MLOWER 6
|
|
#define LMIDLE 7
|
|
#define NCHECK 8
|
|
|
|
// For Rectangular selection and freeform selection
|
|
#define BMP 0
|
|
#define DSP 1
|
|
#define PRV 2
|
|
#define VLD 3
|
|
#define PIN 4
|
|
|
|
// max of freeform selection point
|
|
#define FREELIAIS 1000
|
|
#define MKOUTHDL 2
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
CMenu NEAR CEditWnd::menu;
|
|
IMPLEMENT_DYNCREATE( CEditWnd, CMDIChildWnd)
|
|
BEGIN_MESSAGE_MAP(CEditWnd, CMDIChildWnd)
|
|
//{{AFX_MSG_MAP(CEditWnd)
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_PAINT()
|
|
ON_WM_CREATE()
|
|
ON_COMMAND(ID_GAIJI_COPY, OnGaijiCopy)
|
|
ON_COMMAND(ID_GAIJI_CUT, OnGaijiCut)
|
|
ON_COMMAND(ID_GAIJI_PASTE, OnGaijiPaste)
|
|
ON_COMMAND(ID_GAIJI_UNDO, OnGaijiUndo)
|
|
ON_WM_RBUTTONDOWN()
|
|
ON_WM_RBUTTONUP()
|
|
ON_WM_SIZE()
|
|
ON_WM_SETCURSOR()
|
|
ON_UPDATE_COMMAND_UI(ID_GAIJI_PASTE, OnUpdateGaijiPaste)
|
|
ON_WM_MDIACTIVATE()
|
|
ON_UPDATE_COMMAND_UI(ID_GAIJI_COPY, OnUpdateGaijiCopy)
|
|
ON_UPDATE_COMMAND_UI(ID_GAIJI_CUT, OnUpdateGaijiCut)
|
|
ON_COMMAND(ID_DELETE_EDIT, OnDeleteEdit)
|
|
ON_UPDATE_COMMAND_UI(ID_DELETE_EDIT, OnUpdateDeleteEdit)
|
|
ON_UPDATE_COMMAND_UI(ID_GAIJI_UNDO, OnUpdateGaijiUndo)
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_CLOSE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// Global parameter
|
|
LOGFONT EditLogFont;
|
|
extern int SelectItems;
|
|
extern CBitmap DupBmp;
|
|
extern CRect DupRect;
|
|
extern CRefrWnd *pRefrChild;
|
|
extern BOOL g_bKeepEUDCLink;
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Create MDI child window for edit */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::Create(
|
|
LPCTSTR szTitle,
|
|
LONG Style,
|
|
RECT EudcWndRect,
|
|
CMDIFrameWnd* Parent)
|
|
{
|
|
// Load menu as same as MainFrame
|
|
if( menu.m_hMenu == NULL)
|
|
menu.LoadMenu( IDR_MAINFRAME);
|
|
m_hMenuShared = menu.m_hMenu;
|
|
|
|
// Register window class of MDI child for edit
|
|
const TCHAR *pszEudcWndClass =
|
|
AfxRegisterWndClass( CS_BYTEALIGNCLIENT,
|
|
NULL, (HBRUSH)(COLOR_WINDOW+1), NULL);
|
|
|
|
return CMDIChildWnd::Create( pszEudcWndClass,
|
|
szTitle, Style, EudcWndRect, Parent);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Process before window is created */
|
|
/* */
|
|
/****************************************/
|
|
int
|
|
CEditWnd::OnCreate( LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if( CMDIChildWnd::OnCreate( lpCreateStruct) == -1)
|
|
goto ERR;
|
|
|
|
// If it is mirrored then turn off mirroing.
|
|
ModifyStyleEx( WS_EX_LAYOUTRTL, 0);
|
|
|
|
if( !CreateNewBitmap())
|
|
goto ERR;
|
|
if( !ClipPickValueInit())
|
|
goto ERR;
|
|
if( !InitEditLogfont())
|
|
goto ERR;
|
|
|
|
return 0;
|
|
ERR:
|
|
return -1;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Create bitmap, and initialized */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::CreateNewBitmap()
|
|
{
|
|
WORD BitSize;
|
|
HANDLE BitInit;
|
|
BYTE *BitmapPtr;
|
|
|
|
CClientDC ChildDC( this);
|
|
|
|
if( !ImageDC.CreateCompatibleDC( &ChildDC))
|
|
return FALSE;
|
|
|
|
if( !CRTDrawDC.CreateCompatibleDC( &ChildDC))
|
|
return FALSE;
|
|
|
|
BitSize = (WORD)((( BITMAP_WIDTH +15) /16) *2) *(WORD)BITMAP_HEIGHT;
|
|
if(( BitInit = LocalAlloc( LMEM_MOVEABLE, BitSize)) == 0)
|
|
return FALSE;
|
|
|
|
if(( BitmapPtr = (BYTE *)LocalLock( BitInit)) == NULL){
|
|
LocalFree( BitInit);
|
|
return FALSE;
|
|
}
|
|
|
|
// Initialize with white color
|
|
memset( BitmapPtr, 0xffff, BitSize);
|
|
if( !ImageBmp.CreateBitmap( BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
1, 1, (LPSTR)BitmapPtr)){
|
|
LocalUnlock( BitInit);
|
|
LocalFree( BitInit);
|
|
return FALSE;
|
|
}
|
|
|
|
// Initialize with white color
|
|
if( !CRTDrawBmp.CreateBitmap( BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
1, 1, (LPSTR)BitmapPtr)){
|
|
LocalUnlock( BitInit);
|
|
LocalFree( BitInit);
|
|
return FALSE;
|
|
}
|
|
LocalUnlock( BitInit);
|
|
LocalFree( BitInit);
|
|
ImageDC.SelectObject( &ImageBmp);
|
|
CRTDrawDC.SelectObject( &CRTDrawBmp);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Registry clipboard format */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::ClipPickValueInit()
|
|
{
|
|
// Register "EUDCEDIT" clipboard format
|
|
if( !( ClipboardFormat = RegisterClipboardFormat(TEXT("EudcEdit"))))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Initialize EditLogFont */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::InitEditLogfont()
|
|
{
|
|
CFont cFont;
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
cFont.CreateStockObject(DEFAULT_GUI_FONT);
|
|
#else
|
|
cFont.CreateStockObject( SYSTEM_FONT);
|
|
#endif
|
|
cFont.GetObject( sizeof(LOGFONT), &EditLogFont);
|
|
cFont.DeleteObject();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CEditWnd::CEditWnd()
|
|
{
|
|
// Initialize static parameter
|
|
BitmapDirty = FALSE;
|
|
GridShow = TRUE;
|
|
SelectItem = PEN;
|
|
RectClipFlag = FALSE;
|
|
CheckNum = NCHECK;
|
|
ButtonFlag = NCLICK;
|
|
IsCapture = FALSE;
|
|
UndoBitmapFlag = FALSE;
|
|
FlagTmp = FALSE;
|
|
UpdateCode = 0x0000;
|
|
Ratio = 3;
|
|
bFocus = TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CEditWnd::~CEditWnd()
|
|
{
|
|
// Delete CDC and CBitmap object
|
|
if( CRTDrawBmp.Detach() != NULL)
|
|
CRTDrawBmp.DeleteObject();
|
|
if( ImageBmp.Detach() != NULL)
|
|
ImageBmp.DeleteObject();
|
|
if( CRTDrawDC.Detach() != NULL)
|
|
CRTDrawDC.DeleteDC();
|
|
if( ImageDC.Detach() != NULL)
|
|
ImageDC.DeleteDC();
|
|
if( UndoImage.Detach() != NULL)
|
|
UndoImage.DeleteObject();
|
|
menu.DestroyMenu();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "UNDO" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnGaijiUndo()
|
|
{
|
|
int wSize;
|
|
LPBYTE pBuf1, pBuf2;
|
|
|
|
if( !UndoBitmapFlag)
|
|
CreateUndoBitmap();
|
|
UndoBitmapFlag = TRUE;
|
|
|
|
if( SelectItem == RECTCLIP || SelectItem == FREEFORM)
|
|
WriteSelRectBitmap();
|
|
|
|
wSize = (int)((( BITMAP_WIDTH +15) /16) *2) *(int)BITMAP_HEIGHT;
|
|
pBuf1 = (LPBYTE)malloc( wSize);
|
|
pBuf2 = (LPBYTE)malloc( wSize);
|
|
ImageBmp.GetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
UndoImage.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
ImageBmp.SetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
UndoImage.SetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
free(pBuf1);
|
|
free(pBuf2);
|
|
|
|
this->Invalidate(FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "UNDO" (Update) */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnUpdateGaijiUndo(
|
|
CCmdUI* pCmdUI)
|
|
{
|
|
if( BitmapDirty)
|
|
pCmdUI->Enable(TRUE);
|
|
else pCmdUI->Enable(FALSE);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "CUT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnGaijiCut()
|
|
{
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
ClipImageCopy();
|
|
ClipImageCut();
|
|
this->Invalidate(FALSE);
|
|
if( RectClipFlag){
|
|
ToolTerm();
|
|
RectClipFlag = FALSE;
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "Cut" (Update) */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnUpdateGaijiCut(
|
|
CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable( RectClipFlag);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "COPY" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnGaijiCopy()
|
|
{
|
|
ClipImageCopy();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "Copy" (Update) */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnUpdateGaijiCopy( CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable( RectClipFlag);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "PASTE" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnGaijiPaste()
|
|
{
|
|
HBITMAP ClipBmpHandle, hTempBitmap1;
|
|
CBitmap ClipBmp1, ClipBmp2;
|
|
HDC hStdDC, hTempDC1;
|
|
HGDIOBJ hOldSObj, hOldSObj2;
|
|
BITMAP Bmp;
|
|
CSize StretchSize;
|
|
BOOL BitmapFmt, PrivateFmt;
|
|
|
|
BitmapFmt = FALSE;
|
|
PrivateFmt = FALSE;
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
WriteSelRectBitmap();
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
|
|
if( !this->OpenClipboard())
|
|
return;
|
|
|
|
if(( ClipBmpHandle = (HBITMAP)GetClipboardData(CF_BITMAP)) == NULL){
|
|
CloseClipboard();
|
|
return;
|
|
}
|
|
GetObject(ClipBmpHandle, sizeof(BITMAP), (LPVOID)&Bmp);
|
|
hStdDC = CreateCompatibleDC( ImageDC.GetSafeHdc());
|
|
hOldSObj = SelectObject(hStdDC, ClipBmpHandle);
|
|
|
|
hTempBitmap1 = CreateBitmap(Bmp.bmWidth, Bmp.bmHeight, 1, 1, NULL);
|
|
hTempDC1 = CreateCompatibleDC( ImageDC.GetSafeHdc());
|
|
hOldSObj2 = SelectObject( hTempDC1, hTempBitmap1);
|
|
::BitBlt( hTempDC1, 0, 0, Bmp.bmWidth, Bmp.bmHeight,
|
|
hStdDC, 0, 0, SRCCOPY);
|
|
|
|
if( !CloseClipboard())
|
|
{
|
|
SelectObject( hStdDC, hOldSObj);
|
|
SelectObject( hTempDC1, hOldSObj2);
|
|
DeleteObject( hTempBitmap1);
|
|
DeleteDC( hStdDC);
|
|
DeleteDC( hTempDC1);
|
|
return;
|
|
}
|
|
if( (int)Bmp.bmWidth < BITMAP_WIDTH &&
|
|
(int)Bmp.bmHeight < BITMAP_HEIGHT ){
|
|
StretchSize.cx = (int)Bmp.bmWidth;
|
|
StretchSize.cy = (int)Bmp.bmHeight;
|
|
::StretchBlt( CRTDrawDC.GetSafeHdc(), 0, 0,
|
|
StretchSize.cx, StretchSize.cy, hTempDC1, 0, 0,
|
|
StretchSize.cx, StretchSize.cy, SRCCOPY);
|
|
}else if( Bmp.bmWidth < BITMAP_WIDTH){
|
|
StretchSize.cx = (int)Bmp.bmWidth;
|
|
StretchSize.cy = BITMAP_HEIGHT;
|
|
::StretchBlt( CRTDrawDC.GetSafeHdc(), 0, 0,
|
|
StretchSize.cx, StretchSize.cy, hTempDC1, 0, 0,
|
|
StretchSize.cx, Bmp.bmHeight, SRCCOPY);
|
|
}else if( Bmp.bmHeight < BITMAP_HEIGHT){
|
|
StretchSize.cx = BITMAP_HEIGHT;
|
|
StretchSize.cy = (int)Bmp.bmHeight;
|
|
::StretchBlt( CRTDrawDC.GetSafeHdc(), 0, 0,
|
|
StretchSize.cx, StretchSize.cy, hTempDC1, 0, 0,
|
|
Bmp.bmWidth, StretchSize.cy, SRCCOPY);
|
|
}else{
|
|
StretchSize.cx = BITMAP_WIDTH;
|
|
StretchSize.cy = BITMAP_HEIGHT;
|
|
::StretchBlt( CRTDrawDC.GetSafeHdc(), 0, 0,
|
|
StretchSize.cx, StretchSize.cy, hTempDC1, 0, 0,
|
|
Bmp.bmWidth, Bmp.bmHeight, SRCCOPY);
|
|
}
|
|
ptStart.x = 0;
|
|
ptStart.y = 0;
|
|
ptEnd.x = (StretchSize.cx-1) *ZoomRate;
|
|
ptEnd.y = (StretchSize.cy-1) *ZoomRate;
|
|
SetMoveRect();
|
|
SetValidRect();
|
|
SetClickRect();
|
|
SetPickRect();
|
|
SelectItem = RECTCLIP;
|
|
RectClipFlag = TRUE;
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
|
|
SelectObject( hStdDC, hOldSObj);
|
|
SelectObject( hTempDC1, hOldSObj2);
|
|
DeleteObject( hTempBitmap1);
|
|
DeleteDC( hStdDC);
|
|
DeleteDC( hTempDC1);
|
|
|
|
return;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "PASTE" (Update) */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnUpdateGaijiPaste(
|
|
CCmdUI* pCmdUI)
|
|
{
|
|
UINT ClipFormat;
|
|
BOOL BitmapFmt;
|
|
BOOL PrivateFmt;
|
|
|
|
BitmapFmt = FALSE;
|
|
PrivateFmt = FALSE;
|
|
if( !::OpenClipboard(this->GetSafeHwnd()))
|
|
return;
|
|
|
|
for( ClipFormat = 0;;){
|
|
ClipFormat = EnumClipboardFormats( ClipFormat);
|
|
if( ClipFormat == CF_BITMAP){
|
|
BitmapFmt = TRUE;
|
|
if( PrivateFmt) break;
|
|
}
|
|
if( ClipFormat == ClipboardFormat){
|
|
PrivateFmt = TRUE;
|
|
if( BitmapFmt) break;
|
|
}
|
|
if( ClipFormat == 0) break;
|
|
}
|
|
if( !PrivateFmt){
|
|
if( BitmapFmt){
|
|
CloseClipboard();
|
|
pCmdUI->Enable(TRUE);
|
|
return;
|
|
}else{
|
|
CloseClipboard();
|
|
pCmdUI->Enable(FALSE);
|
|
return;
|
|
}
|
|
}else{
|
|
if ( !BitmapFmt){
|
|
CloseClipboard();
|
|
pCmdUI->Enable(FALSE);
|
|
return;
|
|
}
|
|
}
|
|
CloseClipboard();
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "Delete" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnDeleteEdit()
|
|
{
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
if(( SelectItem == RECTCLIP || SelectItem == FREEFORM) &&
|
|
RectClipFlag){
|
|
RectClipFlag = FALSE;
|
|
ToolTerm();
|
|
}
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "Delete"(Update)*/
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnUpdateDeleteEdit(
|
|
CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable( RectClipFlag);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Create bitmap for undo */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::CreateUndoBitmap()
|
|
{
|
|
HANDLE BitHandle;
|
|
BYTE *pBitmap;
|
|
WORD wSize;
|
|
|
|
wSize = (WORD)((( BITMAP_WIDTH + 15) /16) *2) *(WORD)BITMAP_HEIGHT;
|
|
if(( BitHandle = LocalAlloc( LMEM_MOVEABLE, wSize)) == 0)
|
|
return FALSE;
|
|
|
|
if(( pBitmap = (BYTE *)LocalLock( BitHandle)) == NULL){
|
|
LocalFree( BitHandle);
|
|
return FALSE;
|
|
}
|
|
memset( pBitmap, 0xffff, wSize);
|
|
if( !UndoImage.CreateBitmap( BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
1, 1, (LPSTR)pBitmap)){
|
|
LocalFree( BitHandle);
|
|
return FALSE;
|
|
}
|
|
LocalUnlock( BitHandle);
|
|
LocalFree( BitHandle);
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Cut image to clipboard */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::ClipImageCut()
|
|
{
|
|
CPen CutPen;
|
|
CBrush CutBrush;
|
|
|
|
CutPen.CreateStockObject( NULL_PEN);
|
|
CPen *OldPen = CRTDrawDC.SelectObject( &CutPen);
|
|
CutBrush.CreateSolidBrush( COLOR_WHITE );
|
|
CBrush *OldBrush = CRTDrawDC.SelectObject( &CutBrush);
|
|
|
|
ClipRect[BMP].right += 1;
|
|
ClipRect[BMP].bottom += 1;
|
|
CRTDrawDC.Rectangle( &ClipRect[BMP]);
|
|
|
|
CRTDrawDC.SelectObject( OldPen);
|
|
CRTDrawDC.SelectObject( OldBrush);
|
|
CutPen.DeleteObject();
|
|
CutBrush.DeleteObject();
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Copy image to clipboard */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::ClipImageCopy()
|
|
{
|
|
CBitmap ClipBmp;
|
|
CDC ClipDC;
|
|
CRect pRect;
|
|
|
|
pRect.SetRect( ClipRect[DSP].left /ZoomRate,
|
|
( ClipRect[DSP].top - CAPTION_HEIGHT) /ZoomRate,
|
|
ClipRect[DSP].right /ZoomRate,
|
|
( ClipRect[DSP].bottom - CAPTION_HEIGHT) /ZoomRate);
|
|
|
|
ClipDC.CreateCompatibleDC( &ImageDC);
|
|
ClipBmp.CreateCompatibleBitmap( &ImageDC,
|
|
pRect.Width(), pRect.Height());
|
|
CBitmap *OldClip = ClipDC.SelectObject( &ClipBmp);
|
|
|
|
ClipDC.PatBlt( 0, 0, pRect.Width(), pRect.Height(), WHITENESS);
|
|
ClipDC.StretchBlt( 0, 0, pRect.Width(), pRect.Height(), &CRTDrawDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(),SRCCOPY);
|
|
|
|
if( !this->OpenClipboard()){
|
|
ClipDC.SelectObject( OldClip);
|
|
ClipBmp.DeleteObject();
|
|
ClipDC.DeleteDC();
|
|
return FALSE;
|
|
}
|
|
EmptyClipboard();
|
|
|
|
if( !SetClipboardData( CF_BITMAP, ClipBmp.Detach())){
|
|
ClipDC.SelectObject( OldClip);
|
|
ClipBmp.DeleteObject();
|
|
ClipDC.DeleteDC();
|
|
CloseClipboard();
|
|
return FALSE;
|
|
}
|
|
CloseClipboard();
|
|
ClipDC.SelectObject( OldClip);
|
|
ClipBmp.DeleteObject();
|
|
ClipDC.DeleteDC();
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnPaint()
|
|
{
|
|
CPaintDC dc( this);
|
|
DWORD OldTextColor;
|
|
|
|
this->GetClientRect( &EudcWndRect);
|
|
|
|
// Set textcolor to gray if fitting curve
|
|
if( FlagTmp)
|
|
OldTextColor = dc.SetTextColor( COLOR_FITTING);
|
|
else OldTextColor = dc.SetTextColor( COLOR_BLACK);
|
|
|
|
// Put bitmap data on display
|
|
ZoomRate = EudcWndRect.right /BITMAP_WIDTH;
|
|
dc.StretchBlt( 0, CAPTION_HEIGHT, EudcWndRect.right,
|
|
EudcWndRect.bottom - CAPTION_HEIGHT,
|
|
&ImageDC, 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT, SRCCOPY);
|
|
|
|
// Draw selected rectangle if RectClipFlag is build
|
|
if( RectClipFlag){
|
|
dc.StretchBlt( ClipRect[DSP].left - 1, ClipRect[DSP].top - 1,
|
|
ClipRect[DSP].Width(), ClipRect[DSP].Height(),
|
|
&CRTDrawDC, ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(), SRCAND);
|
|
|
|
DrawMoveRect( &dc);
|
|
DrawStretchRect( &dc);
|
|
}
|
|
dc.SetTextColor( OldTextColor);
|
|
CaptionDraw();
|
|
|
|
if( ZoomRate >= 2 && GridShow)
|
|
DrawGridLine( &dc);
|
|
|
|
if( FlagTmp)
|
|
CurveFittingDraw( &dc);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_LBUTTONDOWN" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnLButtonDown(
|
|
UINT ,
|
|
CPoint point)
|
|
{
|
|
CRect CaptionRect;
|
|
CPoint ClickPt;
|
|
|
|
if( ButtonFlag == RCLICK){
|
|
this->Invalidate();
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
ClickPt = point;
|
|
CaptionRect.CopyRect( &EudcWndRect);
|
|
CaptionRect.top = CAPTION_HEIGHT;
|
|
if( !CaptionRect.PtInRect( point))
|
|
return;
|
|
|
|
ToolInit(LCLICK);
|
|
// Modurate coordinate
|
|
CorrectMouseDownPoint( point);
|
|
|
|
// Stretch selected rectangle
|
|
if( RectClipFlag){
|
|
SetClickRect();
|
|
if( ClipRect[PIN].PtInRect( ClickPt) &&
|
|
( EudcWndRect.Width() > ClipRect[DSP].Width() ||
|
|
EudcWndRect.Height() - CAPTION_HEIGHT
|
|
> ClipRect[DSP].Height())){
|
|
BitmapDirty = TRUE;
|
|
}else if(( CheckNum = CheckClipRect( ClickPt)) != NCHECK){
|
|
BitmapDirty = TRUE;
|
|
SetValidRect();
|
|
RectClipFlag = FALSE;
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
RectClipFlag = TRUE;
|
|
CClientDC dc( this);
|
|
DrawMoveRect( &dc);
|
|
}else{
|
|
RectClipFlag = FALSE;
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
DrawClipBmp();
|
|
SetPickRect();
|
|
if( SelectItem == RECTCLIP)
|
|
DrawRubberBand( TRUE);
|
|
else{
|
|
CPoint Sp;
|
|
|
|
Sp.x = ptStart.x;
|
|
Sp.y = ptStart.y + CAPTION_HEIGHT;
|
|
m_pointArray.RemoveAll();
|
|
m_SelectArray.RemoveAll();
|
|
m_pointArray.Add( Sp);
|
|
Sp.x = ptStart.x /ZoomRate;
|
|
Sp.y = ptStart.y /ZoomRate;
|
|
m_SelectArray.Add( Sp);
|
|
|
|
}
|
|
}
|
|
}else{
|
|
if( SelectItem == PEN || SelectItem == BRUSH ){
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
DrawPoint( ptStart, FALSE);
|
|
}else if (SelectItem == ERASER){
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
DrawPoint( ptStart, TRUE);
|
|
}else{
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
if( SelectItem == FREEFORM){
|
|
CPoint Sp;
|
|
|
|
Sp.x = ptStart.x;
|
|
Sp.y = ptStart.y + CAPTION_HEIGHT;
|
|
m_pointArray.RemoveAll();
|
|
m_SelectArray.RemoveAll();
|
|
m_pointArray.Add( Sp);
|
|
Sp.x = ptStart.x /ZoomRate;
|
|
Sp.y = ptStart.y /ZoomRate;
|
|
m_SelectArray.Add( Sp);
|
|
}else DrawRubberBand( TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_MOUSEMOVE" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnMouseMove(
|
|
UINT ,
|
|
CPoint point)
|
|
{
|
|
|
|
if( IsCapture){
|
|
// Modurate coordinate
|
|
CorrectMouseUpPoint( point);
|
|
if( ptPrev.x == ptEnd.x && ptPrev.y == ptEnd.y)
|
|
return;
|
|
|
|
if( RectClipFlag){
|
|
if( CheckNum == NCHECK){
|
|
CRect URect, MRect, PRRect;
|
|
|
|
if( !MoveClipRect())
|
|
return;
|
|
MRect.SetRect( ClipRect[DSP].left - Ratio,
|
|
ClipRect[DSP].top - Ratio,
|
|
ClipRect[DSP].right + Ratio,
|
|
ClipRect[DSP].bottom + Ratio);
|
|
|
|
PRRect.SetRect( ClipRect[PRV].left - Ratio,
|
|
ClipRect[PRV].top - Ratio,
|
|
ClipRect[PRV].right + Ratio,
|
|
ClipRect[PRV].bottom + Ratio);
|
|
|
|
URect.UnionRect( &MRect, &PRRect);
|
|
this->InvalidateRect( &URect, FALSE);
|
|
this->UpdateWindow();
|
|
|
|
}else StretchMoveRect();
|
|
}else{
|
|
if( SelectItem == PEN || SelectItem == BRUSH)
|
|
DrawToPoint(FALSE);
|
|
else if (SelectItem == ERASER)
|
|
DrawToPoint(TRUE);
|
|
else if( SelectItem == FREEFORM){
|
|
DrawFreeForm( FALSE);
|
|
SelectFreeForm(FALSE);
|
|
}else DrawRubberBand( FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_LBUTTONUP" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnLButtonUp(
|
|
UINT ,
|
|
CPoint point)
|
|
{
|
|
if (!bFocus)
|
|
{
|
|
bFocus = TRUE;
|
|
CaptionDraw();
|
|
|
|
pRefrChild->bFocus = FALSE;
|
|
pRefrChild->CaptionDraw();
|
|
|
|
}
|
|
|
|
if( IsCapture){
|
|
// Modurate coordinate
|
|
CorrectMouseUpPoint( point);
|
|
|
|
if( SelectItem == PEN || SelectItem == BRUSH ||SelectItem == ERASER){
|
|
if( FlagTmp)
|
|
this->Invalidate(FALSE);
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
|
|
// draw a figure on bitmap
|
|
if( SelectItem == RECTCLIP && !RectClipFlag){
|
|
SetMoveRect();
|
|
SetPickRect();
|
|
SetValidRect();
|
|
SetClickRect();
|
|
if(( abs( ptEnd.x - ptStart.x) >= ZoomRate*2) &&
|
|
( abs( ptEnd.y - ptStart.y) >= ZoomRate*2) ){
|
|
CRTDrawDC.BitBlt( ClipRect[BMP].left,
|
|
ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(),
|
|
ClipRect[BMP].Height(),
|
|
&ImageDC, ClipRect[BMP].left,
|
|
ClipRect[BMP].top, SRCCOPY);
|
|
|
|
EraseRectangle();
|
|
RectClipFlag = TRUE;
|
|
}
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}else if( SelectItem == FREEFORM && !RectClipFlag){
|
|
POINT nArray[FREELIAIS];
|
|
POINT pArray[FREELIAIS];
|
|
|
|
DrawFreeForm( FALSE);
|
|
SelectFreeForm( FALSE);
|
|
DrawFreeForm( TRUE);
|
|
SelectFreeForm( TRUE);
|
|
|
|
if( m_pointArray.GetSize() >= FREELIAIS ||
|
|
m_SelectArray.GetSize() >= FREELIAIS ){
|
|
ToolTerm();
|
|
this->Invalidate(FALSE);
|
|
this->UpdateWindow();
|
|
return;
|
|
}
|
|
for( int i = 0; i < m_pointArray.GetSize(); i++)
|
|
nArray[i] = m_pointArray[i];
|
|
for( i = 0; i < m_SelectArray.GetSize(); i++)
|
|
pArray[i] = m_SelectArray[i];
|
|
|
|
if( FreeRgn.GetSafeHandle() != NULL)
|
|
FreeRgn.DeleteObject();
|
|
if( PickRgn.GetSafeHandle() != NULL)
|
|
PickRgn.DeleteObject();
|
|
FreeRgn.CreatePolygonRgn( nArray,
|
|
(int)(m_pointArray.GetSize()), ALTERNATE);
|
|
PickRgn.CreatePolygonRgn( pArray,
|
|
(int)(m_SelectArray.GetSize()), ALTERNATE);
|
|
|
|
if( FreeRgn.GetSafeHandle() == NULL ||
|
|
PickRgn.GetSafeHandle() == NULL){
|
|
m_pointArray.RemoveAll();
|
|
m_SelectArray.RemoveAll();
|
|
RectClipFlag = FALSE;
|
|
}else{
|
|
RectClipFlag = TRUE;
|
|
if( !SetFreeForm()){
|
|
RectClipFlag = FALSE;
|
|
FreeRgn.DeleteObject();
|
|
PickRgn.DeleteObject();
|
|
SetPickRect();
|
|
SetValidRect();
|
|
SetClickRect();
|
|
ClipRect[PRV].CopyRect( &ClipRect[DSP]);
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}else{
|
|
EraseFreeForm();
|
|
SetPickRect();
|
|
SetValidRect();
|
|
SetClickRect();
|
|
ClipRect[PRV].CopyRect( &ClipRect[DSP]);
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
}
|
|
}else if( RectClipFlag){
|
|
if( CheckNum != NCHECK){
|
|
DrawStretchClipToDisp();
|
|
CheckNum = NCHECK;
|
|
}else{
|
|
if( !MoveClipRect()){
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
}
|
|
SetValidRect();
|
|
SetClickRect();
|
|
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}else{
|
|
if( SelectItem != SLOPE)
|
|
IllegalRect( &ptStart, &ptEnd);
|
|
else{
|
|
ptEnd.x = ( ptEnd.x /ZoomRate) *ZoomRate;
|
|
ptEnd.y = ( ptEnd.y /ZoomRate) *ZoomRate;
|
|
ptStart.x = ( ptStart.x /ZoomRate) *ZoomRate;
|
|
ptStart.y = ( ptStart.y /ZoomRate) *ZoomRate;
|
|
}
|
|
DrawRectBmp();
|
|
if( SelectItem == SLOPE)
|
|
IllegalRect( &ptStart, &ptEnd);
|
|
SetMoveRect();
|
|
if( FlagTmp)
|
|
this->Invalidate( FALSE);
|
|
else if( SelectItem != PEN && SelectItem != BRUSH && SelectItem != ERASER){
|
|
this->InvalidateRect( &ClipRect[DSP], FALSE);
|
|
}
|
|
}
|
|
ToolTerm();
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_RBUTTONDOWN" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnRButtonDown(
|
|
UINT nFlags,
|
|
CPoint point)
|
|
{
|
|
CRect CaptionRect;
|
|
|
|
if( ButtonFlag == LCLICK){
|
|
this->Invalidate();
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
if( SelectItem == RECTCLIP || SelectItem == FREEFORM){
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
CaptionRect.CopyRect( &EudcWndRect);
|
|
CaptionRect.top = CAPTION_HEIGHT;
|
|
if( !CaptionRect.PtInRect( point))
|
|
return;
|
|
ToolInit(RCLICK);
|
|
|
|
// Modurate coordinate
|
|
CorrectMouseDownPoint( point);
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
if( SelectItem == PEN || SelectItem == BRUSH )
|
|
DrawPoint( ptStart, FALSE);
|
|
else if (SelectItem == ERASER)
|
|
DrawPoint( ptStart, TRUE);
|
|
else
|
|
DrawRubberBand( TRUE);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_RBUTTONUP" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnRButtonUp(
|
|
UINT nFlags,
|
|
CPoint point)
|
|
{
|
|
if( IsCapture){
|
|
if( SelectItem == PEN || SelectItem == BRUSH || SelectItem == ERASER ||
|
|
SelectItem == RECTCLIP || SelectItem == FREEFORM){
|
|
if( FlagTmp)
|
|
this->Invalidate( FALSE);
|
|
ToolTerm();
|
|
return;
|
|
}
|
|
// Modurate coordinate
|
|
CorrectMouseUpPoint( point);
|
|
DrawRubberBand( TRUE);
|
|
if( SelectItem != SLOPE)
|
|
IllegalRect( &ptStart, &ptEnd);
|
|
else{
|
|
ptEnd.x = ( ptEnd.x /ZoomRate) *ZoomRate;
|
|
ptEnd.y = ( ptEnd.y /ZoomRate) *ZoomRate;
|
|
ptStart.x = ( ptStart.x /ZoomRate) *ZoomRate;
|
|
ptStart.y = ( ptStart.y /ZoomRate) *ZoomRate;
|
|
}
|
|
|
|
// Draw a figure on bitmap
|
|
DrawRectBmp();
|
|
if( SelectItem == SLOPE)
|
|
IllegalRect( &ptStart, &ptEnd);
|
|
SetMoveRect();
|
|
if( FlagTmp)
|
|
this->Invalidate( FALSE);
|
|
else this->InvalidateRect( &ClipRect[DSP], FALSE);
|
|
ToolTerm();
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_SIZE" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnSize(
|
|
UINT nType,
|
|
int cx,
|
|
int cy)
|
|
{
|
|
int NewZoomRate;
|
|
|
|
NewZoomRate = cx / BITMAP_WIDTH;
|
|
if( RectClipFlag && NewZoomRate > 1){
|
|
ClipRect[PRV].left = ( ClipRect[PRV].left /ZoomRate)
|
|
* NewZoomRate;
|
|
|
|
ClipRect[PRV].top = ((( ClipRect[PRV].top - CAPTION_HEIGHT)
|
|
/ZoomRate) * NewZoomRate) + CAPTION_HEIGHT;
|
|
|
|
ClipRect[PRV].right = ( ClipRect[PRV].right /ZoomRate)
|
|
* NewZoomRate + 1;
|
|
|
|
ClipRect[PRV].bottom = ((( ClipRect[PRV].bottom -CAPTION_HEIGHT)
|
|
/ ZoomRate) * NewZoomRate) + CAPTION_HEIGHT + 1;
|
|
|
|
ClipRect[DSP].left = ( ClipRect[DSP].left /ZoomRate)
|
|
* NewZoomRate;
|
|
|
|
ClipRect[DSP].top = ((( ClipRect[DSP].top - CAPTION_HEIGHT)
|
|
/ ZoomRate) * NewZoomRate) + CAPTION_HEIGHT;
|
|
|
|
ClipRect[DSP].right = ( ClipRect[DSP].right /ZoomRate)
|
|
* NewZoomRate + 1;
|
|
|
|
ClipRect[DSP].bottom = ((( ClipRect[DSP].bottom -CAPTION_HEIGHT)
|
|
/ ZoomRate) * NewZoomRate) + CAPTION_HEIGHT + 1;
|
|
|
|
SetClickRect();
|
|
SetValidRect();
|
|
}else if( RectClipFlag && NewZoomRate <= 1)
|
|
WriteSelRectBitmap();
|
|
|
|
CMDIChildWnd::OnSize(nType, cx, cy);
|
|
|
|
this->Invalidate(FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_SETCURSOR" */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::OnSetCursor(
|
|
CWnd* pWnd,
|
|
UINT nHitTest,
|
|
UINT message)
|
|
{
|
|
CPoint point;
|
|
CRect CaptionRect;
|
|
CRect EditRect;
|
|
HCURSOR hArrowCur;
|
|
|
|
GetCursorPos( &point);
|
|
this->ScreenToClient( &point);
|
|
this->GetClientRect( &CaptionRect);
|
|
EditRect.CopyRect( &CaptionRect);
|
|
CaptionRect.bottom = CAPTION_HEIGHT;
|
|
EditRect.top = CAPTION_HEIGHT;
|
|
|
|
if(CaptionRect.PtInRect( point)){
|
|
hArrowCur = AfxGetApp()->LoadStandardCursor( IDC_ARROW);
|
|
::SetCursor( hArrowCur);
|
|
}else if( RectClipFlag && !IsCapture && EditRect.PtInRect( point)){
|
|
if( PickRect[LUPPER].PtInRect( point) ||
|
|
PickRect[RLOWER].PtInRect( point)){
|
|
::SetCursor((HCURSOR)ArrowCursor[LEFTSLOPE]);
|
|
}else if( PickRect[RUPPER].PtInRect( point) ||
|
|
PickRect[LLOWER].PtInRect( point)){
|
|
::SetCursor((HCURSOR)ArrowCursor[RIGHTSLOPE]);
|
|
}else if( PickRect[MUPPER].PtInRect( point) ||
|
|
PickRect[MLOWER].PtInRect( point)){
|
|
::SetCursor((HCURSOR)ArrowCursor[HORIZONTAL]);
|
|
}else if( PickRect[RMIDLE].PtInRect( point) ||
|
|
PickRect[LMIDLE].PtInRect( point)){
|
|
::SetCursor((HCURSOR)ArrowCursor[VERTICAL]);
|
|
}else if( ClipRect[DSP].PtInRect( point)){
|
|
::SetCursor((HCURSOR)ArrowCursor[ALLDIRECT]);
|
|
}else ::SetCursor((HCURSOR)ToolCursor[SelectItem]);
|
|
}else if( !IsCapture && EditRect.PtInRect( point))
|
|
::SetCursor((HCURSOR)ToolCursor[SelectItem]);
|
|
else{
|
|
hArrowCur = AfxGetApp()->LoadStandardCursor( IDC_ARROW);
|
|
::SetCursor( hArrowCur);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_MDIACTIVATE"*/
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnMDIActivate(
|
|
BOOL bActivate,
|
|
CWnd* pActivateWnd,
|
|
CWnd* pDeactivateWnd)
|
|
{
|
|
if( bActivate == FALSE){
|
|
if( SelectItem == RECTCLIP || SelectItem == FREEFORM)
|
|
WriteSelRectBitmap();
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_KEYDOWN" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::OnKeyDown(
|
|
UINT nChar,
|
|
UINT nRepCnt,
|
|
UINT nFlags)
|
|
{
|
|
if( nChar == VK_ESCAPE)
|
|
WriteSelRectBitmap();
|
|
else CMDIChildWnd::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw Caption */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::CaptionDraw()
|
|
{
|
|
COLORREF TextColor;
|
|
CString WndCaption;
|
|
CRect CaptionRect;
|
|
CBrush CaptionBrush;
|
|
CFont *OldFont;
|
|
int BkMode;
|
|
CDC dc;
|
|
dc.Attach( ::GetDC( this->GetSafeHwnd()));
|
|
|
|
// Get brush with active caption color
|
|
CaptionRect.CopyRect( &EudcWndRect);
|
|
if (bFocus)
|
|
{
|
|
CaptionBrush.CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION));
|
|
}
|
|
else
|
|
{
|
|
CaptionBrush.CreateSolidBrush(::GetSysColor(COLOR_INACTIVECAPTION));
|
|
}
|
|
CaptionRect.bottom = CAPTION_HEIGHT;
|
|
dc.FillRect( &CaptionRect, &CaptionBrush);
|
|
CaptionBrush.DeleteObject();
|
|
|
|
// Get font to draw caption
|
|
#ifdef BUILD_ON_WINNT
|
|
OldFont = (CFont *)dc.SelectStockObject(DEFAULT_GUI_FONT);
|
|
#else
|
|
OldFont = (CFont *)dc.SelectStockObject(SYSTEM_FONT);
|
|
#endif
|
|
BkMode = dc.SetBkMode( TRANSPARENT);
|
|
if (bFocus)
|
|
{
|
|
TextColor = dc.SetTextColor( ::GetSysColor(COLOR_CAPTIONTEXT));
|
|
}
|
|
else
|
|
{
|
|
TextColor = dc.SetTextColor( ::GetSysColor(COLOR_INACTIVECAPTIONTEXT));
|
|
}
|
|
WndCaption.LoadString( IDS_EDIT_STR);
|
|
dc.TextOut( EudcWndRect.right /2 - 30, 1, WndCaption);
|
|
dc.SelectObject( OldFont);
|
|
dc.SetTextColor( TextColor);
|
|
dc.SetBkMode( BkMode);
|
|
::ReleaseDC(NULL, dc.Detach());
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw Grid line */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawGridLine(
|
|
CDC *dc)
|
|
{
|
|
CPen GlyphPen;
|
|
register int i;
|
|
|
|
// Create pen to draw grid
|
|
GlyphPen.CreatePen( PS_SOLID, 1, COLOR_GRID);
|
|
CPen *OldPen = dc->SelectObject( &GlyphPen);
|
|
|
|
// Draw grid
|
|
for( i = ZoomRate - 1; i < EudcWndRect.right; i += ZoomRate){
|
|
dc->MoveTo( i, CAPTION_HEIGHT-1);
|
|
dc->LineTo( i, EudcWndRect.bottom);
|
|
}
|
|
for( i =ZoomRate +CAPTION_HEIGHT -1;i<EudcWndRect.bottom;i += ZoomRate){
|
|
dc->MoveTo( 0, i);
|
|
dc->LineTo( EudcWndRect.right, i);
|
|
}
|
|
dc->SelectObject( OldPen);
|
|
GlyphPen.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw OutLine */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::CurveFittingDraw(
|
|
CDC* dc)
|
|
{
|
|
struct VHEAD *vhd;
|
|
struct VDATA *vp;
|
|
CPen CurvePen;
|
|
CPoint DrawPt;
|
|
LPBYTE pBuf;
|
|
int pcnt, TmpHdl, SetHdl;
|
|
|
|
SetHdl = MKOUTHDL;
|
|
|
|
DWORD wSize = (WORD)((( BITMAP_WIDTH +15)/16)*2)*(WORD)BITMAP_HEIGHT;
|
|
pBuf = (LPBYTE)malloc(((( BITMAP_WIDTH +15) /16) *2) *BITMAP_HEIGHT);
|
|
if( pBuf == NULL){
|
|
return FALSE;
|
|
}
|
|
ImageBmp.GetBitmapBits( wSize, (LPVOID)pBuf);
|
|
|
|
OInit();
|
|
VDNew( SetHdl);
|
|
if(( TmpHdl = OMakeOutline((LPBYTE)pBuf,
|
|
BITMAP_WIDTH,SMOOTHLVL)) < 0){
|
|
free( pBuf);
|
|
OTerm();
|
|
return FALSE;
|
|
}
|
|
if( MkPoly( TmpHdl, SetHdl) < 0){
|
|
free( pBuf);
|
|
OTerm();
|
|
return FALSE;
|
|
}
|
|
|
|
VDGetHead( SetHdl, &vhd);
|
|
if( VDGetNCont( SetHdl) > 0){
|
|
CurvePen.CreatePen( PS_SOLID, 1, COLOR_CURVE);
|
|
CPen *OldPen = dc->SelectObject( &CurvePen);
|
|
CBrush *OldBrush = (CBrush *)dc->SelectStockObject( NULL_BRUSH);
|
|
|
|
while ( vhd->next != NIL){
|
|
vp = vhd->headp;
|
|
pcnt = vhd->nPoints - 1;
|
|
ZoomPoint( &DrawPt, vp->vd.x, vp->vd.y);
|
|
dc->MoveTo( DrawPt.x, DrawPt.y);
|
|
vp = vp->next;
|
|
while( pcnt-- > 0){
|
|
ZoomPoint( &DrawPt, vp->vd.x, vp->vd.y);
|
|
dc->LineTo( DrawPt.x, DrawPt.y);
|
|
vp = vp->next;
|
|
}
|
|
vhd = vhd->next;
|
|
}
|
|
dc->SelectObject( OldBrush);
|
|
dc->SelectObject( OldPen);
|
|
CurvePen.DeleteObject();
|
|
}
|
|
OTerm();
|
|
free( pBuf);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Zoom coordinate of outline */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::ZoomPoint(
|
|
CPoint *DrawPt,
|
|
int x,
|
|
int y)
|
|
{
|
|
DWORD px, py;
|
|
|
|
px = (DWORD)(x * EudcWndRect.right);
|
|
py = (DWORD)(y * (EudcWndRect.bottom - CAPTION_HEIGHT));
|
|
DrawPt->x = (int)( px/(BITMAP_WIDTH *4));
|
|
DrawPt->y = (int)( py/(BITMAP_HEIGHT*4)) + CAPTION_HEIGHT;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw MoveRect rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawMoveRect(
|
|
CDC *dc)
|
|
{
|
|
CPen *OldPen;
|
|
CBrush *OldBrush;
|
|
|
|
OldPen = (CPen *)dc->SelectStockObject( BLACK_PEN);
|
|
OldBrush = (CBrush *)dc->SelectStockObject( NULL_BRUSH);
|
|
int OldMode = dc->SetROP2( R2_NOTXORPEN);
|
|
|
|
dc->Rectangle( &ClipRect[DSP]);
|
|
|
|
dc->SelectObject( OldPen);
|
|
dc->SelectObject( OldBrush);
|
|
dc->SetROP2( OldMode);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw clipping rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawStretchRect(
|
|
CDC *dc)
|
|
{
|
|
CPen *OldPen;
|
|
CBrush *OldBrush;
|
|
int Left, Top;
|
|
int Right, Bottom;
|
|
|
|
OldPen = (CPen *)dc->SelectStockObject( BLACK_PEN);
|
|
OldBrush = (CBrush *)dc->SelectStockObject( BLACK_BRUSH);
|
|
|
|
for( int i = 0; i < 8; i++){
|
|
// Set left and right side of PickRect[]
|
|
if( i == LUPPER || i == LLOWER || i == LMIDLE){
|
|
Left = ClipRect[DSP].left - Ratio;
|
|
Right = ClipRect[DSP].left + Ratio;
|
|
}else if( i == RUPPER || i == RLOWER || i == RMIDLE){
|
|
Left = ClipRect[DSP].right - Ratio;
|
|
Right = ClipRect[DSP].right + Ratio;
|
|
}else{
|
|
Left = ClipRect[DSP].left + ClipRect[DSP].Width()/2
|
|
- Ratio;
|
|
Right = ClipRect[DSP].left + ClipRect[DSP].Width()/2
|
|
+ Ratio;
|
|
}
|
|
|
|
// Set top and bottom side of PickRect[]
|
|
if( i == LUPPER || i == RUPPER || i == MUPPER){
|
|
Top = ClipRect[DSP].top - Ratio;
|
|
Bottom = ClipRect[DSP].top + Ratio;
|
|
}else if( i == RMIDLE || i == LMIDLE){
|
|
Top = ClipRect[DSP].top + ClipRect[DSP].Height()/2
|
|
- Ratio;
|
|
Bottom = ClipRect[DSP].top + ClipRect[DSP].Height()/2
|
|
+ Ratio;
|
|
}else{
|
|
Top = ClipRect[DSP].bottom - Ratio;
|
|
Bottom = ClipRect[DSP].bottom + Ratio;
|
|
}
|
|
PickRect[i].SetRect( Left, Top, Right, Bottom);
|
|
dc->InvertRect( &PickRect[i]);
|
|
}
|
|
dc->SelectObject( OldPen);
|
|
dc->SelectObject( OldBrush);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Write Selected Rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::WriteSelRectBitmap()
|
|
{
|
|
if( RectClipFlag){
|
|
RectClipFlag = FALSE;
|
|
DrawClipBmp();
|
|
ToolTerm();
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Modurate coordinate */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::CorrectMouseDownPoint(
|
|
CPoint point)
|
|
{
|
|
ptStart.x = point.x;
|
|
ptStart.y = point.y - CAPTION_HEIGHT;
|
|
if( ptStart.y < 0)
|
|
ptStart.y = 0;
|
|
|
|
if( SelectItem == FREEFORM){
|
|
ptStart.x = (( ptStart.x + ZoomRate/2) /ZoomRate) *ZoomRate;
|
|
ptStart.y = (( ptStart.y + ZoomRate/2) /ZoomRate) *ZoomRate;
|
|
}else if( SelectItem != SLOPE){
|
|
ptStart.x = ( ptStart.x /ZoomRate) *ZoomRate;
|
|
ptStart.y = ( ptStart.y /ZoomRate) *ZoomRate;
|
|
}else{
|
|
ptStart.x = ( ptStart.x /ZoomRate) *ZoomRate +ZoomRate /2;
|
|
ptStart.y = ( ptStart.y /ZoomRate) *ZoomRate +ZoomRate /2;
|
|
}
|
|
if( SelectItem == RECTBAND || SelectItem == RECTFILL ||
|
|
SelectItem == CIRCLE || SelectItem == CIRCLEFILL ){
|
|
if( ptStart.x > EudcWndRect.right - ZoomRate)
|
|
ptStart.x -= ZoomRate;
|
|
if( ptStart.y > EudcWndRect.bottom - CAPTION_HEIGHT - ZoomRate)
|
|
ptStart.y -= ZoomRate;
|
|
ptEnd.x = ptPrev.x = ptStart.x + ZoomRate;
|
|
ptEnd.y = ptPrev.y = ptStart.y + ZoomRate;
|
|
}else ptEnd = ptPrev = ptStart;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Modurate coordinate */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::CorrectMouseUpPoint(
|
|
CPoint point)
|
|
{
|
|
ptPrev = ptEnd;
|
|
ptEnd.x = point.x;
|
|
ptEnd.y = point.y - CAPTION_HEIGHT;
|
|
|
|
if( ptEnd.x < 0) ptEnd.x = 0;
|
|
if( ptEnd.y < 0) ptEnd.y = 0;
|
|
if( ptEnd.x > EudcWndRect.right){
|
|
if( SelectItem == BRUSH)
|
|
ptEnd.x = EudcWndRect.right - ZoomRate*2;
|
|
else if( SelectItem == FREEFORM)
|
|
ptEnd.x = EudcWndRect.right;
|
|
else
|
|
ptEnd.x = EudcWndRect.right - ZoomRate;
|
|
}
|
|
if( ptEnd.y > EudcWndRect.bottom - CAPTION_HEIGHT){
|
|
if( SelectItem == BRUSH)
|
|
ptEnd.y = EudcWndRect.bottom - CAPTION_HEIGHT
|
|
- ZoomRate*2;
|
|
else if( SelectItem == FREEFORM)
|
|
ptEnd.y = EudcWndRect.bottom - CAPTION_HEIGHT;
|
|
else
|
|
ptEnd.y = EudcWndRect.bottom - CAPTION_HEIGHT
|
|
- ZoomRate;
|
|
}
|
|
if( SelectItem == FREEFORM){
|
|
ptEnd.x = (( ptEnd.x + ZoomRate/2) /ZoomRate) *ZoomRate ;
|
|
ptEnd.y = (( ptEnd.y + ZoomRate/2) /ZoomRate) *ZoomRate ;
|
|
}else if( SelectItem != SLOPE){
|
|
ptEnd.x = ( ptEnd.x /ZoomRate)*ZoomRate;
|
|
ptEnd.y = ( ptEnd.y /ZoomRate)*ZoomRate;
|
|
}else{
|
|
ptEnd.x = ( ptEnd.x /ZoomRate) *ZoomRate + ZoomRate /2;
|
|
ptEnd.y = ( ptEnd.y /ZoomRate) *ZoomRate + ZoomRate /2;
|
|
}
|
|
if( SelectItem == RECTBAND || SelectItem == RECTFILL ||
|
|
SelectItem == CIRCLE || SelectItem == CIRCLEFILL ){
|
|
if( ptEnd.x - ptStart.x <= ZoomRate &&
|
|
ptEnd.x - ptStart.x >= 0)
|
|
ptEnd.x = ptStart.x + ZoomRate;
|
|
if( ptStart.x - ptEnd.x <= ZoomRate &&
|
|
ptStart.x - ptEnd.x > 0)
|
|
ptEnd.x = ptStart.x - ZoomRate;
|
|
if( ptStart.y - ptEnd.y <= ZoomRate &&
|
|
ptStart.y - ptEnd.y > 0)
|
|
ptEnd.y = ptStart.y - ZoomRate;
|
|
if( ptEnd.y - ptStart.y <= ZoomRate &&
|
|
ptEnd.y -ptStart.y >= 0)
|
|
ptEnd.y = ptStart.y + ZoomRate;
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Move Selected Rectangle */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::MoveClipRect()
|
|
{
|
|
int Movex, Movey;
|
|
int Wid, High;
|
|
BOOL sts;
|
|
|
|
sts = TRUE;
|
|
ClipRect[PRV].CopyRect( &ClipRect[DSP]);
|
|
|
|
// Boundary condition
|
|
Movex = ptEnd.x - ptPrev.x;
|
|
Movey = ptEnd.y - ptPrev.y;
|
|
Wid = ClipRect[DSP].Width();
|
|
High = ClipRect[DSP].Height();
|
|
ClipRect[DSP].OffsetRect( Movex, Movey);
|
|
|
|
if( ClipRect[DSP].left < 0){
|
|
ClipRect[DSP].left = 0;
|
|
ClipRect[DSP].right = Wid;
|
|
}
|
|
if( ClipRect[DSP].right > EudcWndRect.right){
|
|
ClipRect[DSP].right = EudcWndRect.right + 1;
|
|
ClipRect[DSP].left = ClipRect[DSP].right - Wid;
|
|
}
|
|
if( ClipRect[DSP].top < CAPTION_HEIGHT){
|
|
ClipRect[DSP].top = CAPTION_HEIGHT;
|
|
ClipRect[DSP].bottom = CAPTION_HEIGHT +High;
|
|
}
|
|
if( ClipRect[DSP].bottom > EudcWndRect.bottom){
|
|
ClipRect[DSP].bottom = EudcWndRect.bottom +1;
|
|
ClipRect[DSP].top = ClipRect[DSP].bottom - High;
|
|
}
|
|
if( ClipRect[PRV].EqualRect( &ClipRect[DSP])){
|
|
sts = FALSE;
|
|
}
|
|
return sts;
|
|
}
|
|
|
|
/************************************************/
|
|
/* */
|
|
/* whether point is in rectangle or not */
|
|
/* */
|
|
/************************************************/
|
|
int
|
|
CEditWnd::CheckClipRect(
|
|
POINT ClipPoint)
|
|
{
|
|
for( int i = 0; i < 8; i++){
|
|
if( PickRect[i].PtInRect( ClipPoint))
|
|
return i;
|
|
}
|
|
return NCHECK;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Process to stretch rectangle */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::DrawStretchClipToDisp()
|
|
{
|
|
CDC SwapDC;
|
|
CBitmap SwapBmp;
|
|
CRect SwapRect;
|
|
|
|
CClientDC dc( this);
|
|
|
|
if( !SwapDC.CreateCompatibleDC( &dc))
|
|
return FALSE;
|
|
|
|
if( !SwapBmp.CreateCompatibleBitmap( &SwapDC, EudcWndRect.Width(),
|
|
EudcWndRect.Height()))
|
|
return FALSE;
|
|
CBitmap *OldBitmap = SwapDC.SelectObject( &SwapBmp);
|
|
|
|
SwapRect.CopyRect( &ClipRect[DSP]);
|
|
if( EudcWndRect.right < SwapRect.right)
|
|
SwapRect.right -= 1;
|
|
if( EudcWndRect.bottom < SwapRect.bottom)
|
|
SwapRect.bottom -= 1;
|
|
|
|
SwapDC.StretchBlt( SwapRect.left, SwapRect.top,
|
|
SwapRect.Width(), SwapRect.Height(),
|
|
&CRTDrawDC, ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(),
|
|
SRCCOPY);
|
|
|
|
SetPickRect();
|
|
CRTDrawDC.StretchBlt( ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(),
|
|
&SwapDC, SwapRect.left, SwapRect.top,
|
|
SwapRect.Width(), SwapRect.Height(), SRCCOPY);
|
|
|
|
SwapDC.SelectObject( OldBitmap);
|
|
SwapBmp.DeleteObject();
|
|
SwapDC.DeleteDC();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw select rectangle to bitmap */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawClipBmp()
|
|
{
|
|
CRect pRect;
|
|
|
|
pRect.SetRect(( ClipRect[DSP].left + 1) /ZoomRate,
|
|
( ClipRect[DSP].top - CAPTION_HEIGHT + 1) /ZoomRate,
|
|
( ClipRect[DSP].right + 1)/ZoomRate,
|
|
( ClipRect[DSP].bottom - CAPTION_HEIGHT + 1) /ZoomRate);
|
|
|
|
ImageDC.StretchBlt( pRect.left, pRect.top,
|
|
pRect.Width(), pRect.Height(), &CRTDrawDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(), SRCAND);
|
|
SetValidRect();
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set size of clipping rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SetPickRect()
|
|
{
|
|
ClipRect[BMP].SetRect( ClipRect[DSP].left /ZoomRate,
|
|
( ClipRect[DSP].top - CAPTION_HEIGHT) /ZoomRate,
|
|
ClipRect[DSP].right /ZoomRate,
|
|
( ClipRect[DSP].bottom - CAPTION_HEIGHT) /ZoomRate);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set size of clipping rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SetMoveRect()
|
|
{
|
|
IllegalRect( &ptStart, &ptEnd);
|
|
|
|
ClipRect[DSP].SetRect( ptStart.x, ptStart.y + CAPTION_HEIGHT,
|
|
ptEnd.x + ZoomRate + 1,
|
|
ptEnd.y + ZoomRate + 1 + CAPTION_HEIGHT);
|
|
ClipRect[PRV].CopyRect( &ClipRect[DSP]);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set size of clipping rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SetValidRect()
|
|
{
|
|
ClipRect[VLD].SetRect( ClipRect[DSP].left - Ratio,
|
|
ClipRect[DSP].top - Ratio,
|
|
ClipRect[DSP].right + Ratio,
|
|
ClipRect[DSP].bottom + Ratio);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set size of clipping rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SetClickRect()
|
|
{
|
|
ClipRect[PIN].SetRect( ClipRect[DSP].left + Ratio,
|
|
ClipRect[DSP].top + Ratio,
|
|
ClipRect[DSP].right - Ratio,
|
|
ClipRect[DSP].bottom - Ratio);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw a figure to bitmap */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawRectBmp()
|
|
{
|
|
CPen *OldPen;
|
|
CBrush *OldBrush;
|
|
CRect BRect;
|
|
CPoint ptLT;
|
|
CPoint ptRB;
|
|
|
|
ptLT.x = ptStart.x /ZoomRate;
|
|
ptLT.y = ptStart.y /ZoomRate;
|
|
ptRB.x = ptEnd.x /ZoomRate;
|
|
ptRB.y = ptEnd.y /ZoomRate;
|
|
|
|
if( ButtonFlag == LCLICK)
|
|
OldPen = (CPen *)ImageDC.SelectStockObject( BLACK_PEN);
|
|
else OldPen = (CPen *)ImageDC.SelectStockObject( WHITE_PEN);
|
|
|
|
if( SelectItem == RECTBAND || SelectItem == CIRCLE)
|
|
OldBrush = (CBrush *)ImageDC.SelectStockObject( NULL_BRUSH);
|
|
else if( ButtonFlag == LCLICK)
|
|
OldBrush = (CBrush *)ImageDC.SelectStockObject( BLACK_BRUSH);
|
|
else OldBrush = (CBrush *)ImageDC.SelectStockObject( WHITE_BRUSH);
|
|
|
|
BRect.SetRect( ptLT.x, ptLT.y, ptRB.x +1, ptRB.y +1);
|
|
if( SelectItem == CIRCLE || SelectItem == CIRCLEFILL)
|
|
ImageDC.Ellipse( &BRect);
|
|
else if( SelectItem == RECTBAND || SelectItem == RECTFILL)
|
|
ImageDC.Rectangle( &BRect);
|
|
else{
|
|
ImageDC.MoveTo( ptLT);
|
|
ImageDC.LineTo( ptRB);
|
|
if (SelectItem == ERASER)
|
|
DrawPoint( ptEnd, TRUE);
|
|
else
|
|
DrawPoint( ptEnd, FALSE);
|
|
}
|
|
ImageDC.SelectObject( OldPen);
|
|
ImageDC.SelectObject( OldBrush);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw 1Point */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawPoint( CPoint Pt, BOOL bErase)
|
|
{
|
|
CBrush PointBrush,*OldBrush1, *OldBrush2;
|
|
CPoint W;
|
|
int Wstep, i, j;
|
|
|
|
CClientDC dc( this);
|
|
if( ButtonFlag == LCLICK && !bErase){
|
|
if( FlagTmp)
|
|
PointBrush.CreateSolidBrush( COLOR_FITTING);
|
|
else PointBrush.CreateSolidBrush( COLOR_BLACK);
|
|
}else PointBrush.CreateSolidBrush( COLOR_WHITE);
|
|
|
|
OldBrush1 = dc.SelectObject( &PointBrush);
|
|
|
|
|
|
W = Pt;
|
|
Wstep = ZoomRate;
|
|
if( ZoomRate > 1 && GridShow)
|
|
Wstep -= 1;
|
|
for( i = 0; i < BrushWidth; i++, W.x += ZoomRate){
|
|
W.y = Pt.y;
|
|
for( j = 0; j < BrushWidth; j++ , W.y += ZoomRate)
|
|
dc.PatBlt( W.x, W.y+CAPTION_HEIGHT,Wstep,Wstep,PATCOPY);
|
|
}
|
|
dc.SelectObject( OldBrush1);
|
|
PointBrush.DeleteObject();
|
|
|
|
if( ButtonFlag == LCLICK && !bErase)
|
|
OldBrush2 = (CBrush *)ImageDC.SelectStockObject(BLACK_BRUSH);
|
|
else OldBrush2 = (CBrush *)ImageDC.SelectStockObject(WHITE_BRUSH);
|
|
|
|
W.x = Pt.x /ZoomRate;
|
|
W.y = Pt.y /ZoomRate;
|
|
if( W.x < BITMAP_WIDTH && W.y < BITMAP_HEIGHT)
|
|
ImageDC.PatBlt( W.x, W.y, BrushWidth, BrushWidth, PATCOPY);
|
|
ImageDC.SelectObject( OldBrush2);
|
|
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Degital differencial analyzer */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawToPoint(BOOL bErase)
|
|
{
|
|
CPoint Pt, Start, End, Inc;
|
|
int Xf, Yf;
|
|
int Inc1, Inc2;
|
|
int Dx, Dy, D, Tmp;
|
|
BOOL Slope;
|
|
|
|
End.x = Xf = ptEnd.x /ZoomRate;
|
|
End.y = Yf = ptEnd.y /ZoomRate;
|
|
Start.x = ptPrev.x /ZoomRate;
|
|
Start.y = ptPrev.y /ZoomRate;
|
|
|
|
if( Xf >= Start.x)
|
|
Inc.x = 1;
|
|
else Inc.x = -1;
|
|
if( Yf >= Start.y)
|
|
Inc.y = 1;
|
|
else Inc.y = -1;
|
|
|
|
Dx = ( Xf - Start.x)*Inc.x;
|
|
Dy = ( Yf - Start.y)*Inc.y;
|
|
if( !Dx && !Dy) return;
|
|
if( Dx < Dy){
|
|
Tmp = Dy;
|
|
Dy = Dx;
|
|
Dx = Tmp;
|
|
Tmp = Inc.x;
|
|
Inc.x = Inc.y;
|
|
Inc.y = Tmp;
|
|
Slope = TRUE;
|
|
}else Slope = FALSE;
|
|
|
|
Inc1 = Dy*2;
|
|
Inc2 = (Dy - Dx)*2;
|
|
D = Inc1 - Dx;
|
|
End.x = Start.x;
|
|
End.y = Start.y;
|
|
while(1){
|
|
Pt.x = End.x *ZoomRate;
|
|
Pt.y = End.y *ZoomRate;
|
|
DrawPoint( Pt, bErase);
|
|
if( End.x == Xf && End.y == Yf)
|
|
break;
|
|
if( Slope){
|
|
Tmp = End.x;
|
|
End.x = End.y;
|
|
End.y = Tmp;
|
|
}
|
|
End.x += Inc.x;
|
|
if( D < 0) D += Inc1;
|
|
else{
|
|
End.y += Inc.y;
|
|
D += Inc2;
|
|
}
|
|
if( Slope){
|
|
Tmp = End.x;
|
|
End.x = End.y;
|
|
End.y = Tmp;
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Initialize tool width and color */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::ToolInit(
|
|
int LRButton)
|
|
{
|
|
this->SetCapture();
|
|
ButtonFlag = LRButton;
|
|
IsCapture = TRUE;
|
|
if( SelectItem == PEN || SelectItem == SLOPE)
|
|
BrushWidth = 1;
|
|
else if( SelectItem == BRUSH || SelectItem == ERASER)
|
|
BrushWidth = 2;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Rubberband stretch mode */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::StretchMoveRect()
|
|
{
|
|
CPen *OldPen;
|
|
CBrush *OldBrush;
|
|
int Left, Top, Right, Bottom;
|
|
|
|
CClientDC dc( this);
|
|
|
|
OldPen = (CPen *)dc.SelectStockObject( BLACK_PEN);
|
|
OldBrush = (CBrush *)dc.SelectStockObject( NULL_BRUSH);
|
|
int OldMode = dc.SetROP2( R2_NOTXORPEN);
|
|
dc.Rectangle( &ClipRect[PRV]);
|
|
|
|
Left = ClipRect[DSP].left;
|
|
Top = ClipRect[DSP].top;
|
|
Right = ClipRect[DSP].right;
|
|
Bottom = ClipRect[DSP].bottom;
|
|
switch( CheckNum){
|
|
case RLOWER:
|
|
ClipRect[DSP].SetRect( Left, Top,
|
|
ptEnd.x + ZoomRate + 1,
|
|
ptEnd.y + CAPTION_HEIGHT + ZoomRate + 1);
|
|
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].bottom = ClipRect[DSP].top
|
|
+ ZoomRate*2+1;
|
|
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].right = ClipRect[DSP].left
|
|
+ ZoomRate*2+1;
|
|
break;
|
|
case RMIDLE:
|
|
ClipRect[DSP].SetRect( Left, Top,
|
|
ptEnd.x + ZoomRate + 1, Bottom);
|
|
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].right = ClipRect[DSP].left
|
|
+ ZoomRate*2+1;
|
|
break;
|
|
case MLOWER:
|
|
ClipRect[DSP].SetRect( Left, Top,
|
|
Right, ptEnd.y + CAPTION_HEIGHT + ZoomRate + 1);
|
|
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].bottom = ClipRect[DSP].top
|
|
+ ZoomRate*2+1;
|
|
break;
|
|
case RUPPER:
|
|
ClipRect[DSP].SetRect( Left, ptEnd.y + CAPTION_HEIGHT,
|
|
ptEnd.x + ZoomRate + 1, Bottom);
|
|
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].top = ClipRect[DSP].bottom
|
|
- ZoomRate*2+1;
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].right = ClipRect[DSP].left
|
|
+ ZoomRate*2+1;
|
|
break;
|
|
case LLOWER:
|
|
ClipRect[DSP].SetRect( ptEnd.x, Top,
|
|
Right, ptEnd.y + CAPTION_HEIGHT + ZoomRate + 1);
|
|
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].left = ClipRect[DSP].right
|
|
- ZoomRate*2+1;
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].bottom = ClipRect[DSP].top
|
|
+ ZoomRate*2+1;
|
|
break;
|
|
case LMIDLE:
|
|
ClipRect[DSP].SetRect( ptEnd.x, Top, Right, Bottom);
|
|
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].left = ClipRect[DSP].right
|
|
- ZoomRate*2+1;
|
|
break;
|
|
case MUPPER:
|
|
ClipRect[DSP].SetRect( Left, ptEnd.y + CAPTION_HEIGHT,
|
|
Right, Bottom);
|
|
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].top = ClipRect[DSP].bottom
|
|
- ZoomRate*2+1;
|
|
break;
|
|
case LUPPER:
|
|
ClipRect[DSP].SetRect( ptEnd.x,
|
|
ptEnd.y + CAPTION_HEIGHT, Right, Bottom);
|
|
|
|
if( ClipRect[DSP].Height() < ZoomRate*2)
|
|
ClipRect[DSP].top = ClipRect[DSP].bottom
|
|
- ZoomRate*2+1;
|
|
if( ClipRect[DSP].Width() < ZoomRate*2)
|
|
ClipRect[DSP].left = ClipRect[DSP].right
|
|
- ZoomRate*2+1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
ClipRect[PRV].CopyRect( &ClipRect[DSP]);
|
|
dc.Rectangle( &ClipRect[DSP]);
|
|
dc.SelectObject( OldPen);
|
|
dc.SelectObject( OldBrush);
|
|
dc.SetROP2( OldMode);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* FreeForm */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SelectFreeForm(
|
|
BOOL MouseSts)
|
|
{
|
|
CPoint Ep, Sp, Cp;
|
|
CPoint Fp, Inc;
|
|
CPoint Dp, Err;
|
|
BOOL Slope;
|
|
int D;
|
|
int Tmp;
|
|
|
|
if( !MouseSts){
|
|
Sp.x = ptPrev.x /ZoomRate;
|
|
Sp.y = ptPrev.y /ZoomRate;
|
|
Ep.x = Fp.x = ptEnd.x /ZoomRate;
|
|
Ep.y = Fp.y = ptEnd.y /ZoomRate;
|
|
}else{
|
|
Sp.x = ptEnd.x /ZoomRate;
|
|
Sp.y = ptEnd.y /ZoomRate;
|
|
Ep.x = Fp.x = ptStart.x /ZoomRate;
|
|
Ep.y = Fp.y = ptStart.y /ZoomRate;
|
|
}
|
|
|
|
if( Fp.x >= Sp.x)
|
|
Inc.x = 1;
|
|
else Inc.x = -1;
|
|
if( Fp.y >= Sp.y)
|
|
Inc.y = 1;
|
|
else Inc.y = -1;
|
|
|
|
Dp.x = ( Fp.x - Sp.x)*Inc.x;
|
|
Dp.y = ( Fp.y - Sp.y)*Inc.y;
|
|
if( !Dp.x && !Dp.y) return;
|
|
if( Dp.x < Dp.y){
|
|
Tmp = Dp.y;
|
|
Dp.y = Dp.x;
|
|
Dp.x = Tmp;
|
|
Tmp = Inc.x;
|
|
Inc.x = Inc.y;
|
|
Inc.y = Tmp;
|
|
Slope = TRUE;
|
|
}else Slope = FALSE;
|
|
|
|
Err.x = Dp.y * 2;
|
|
Err.y = ( Dp.y - Dp.x) * 2;
|
|
D = Err.x - Dp.x;
|
|
Ep = Sp;
|
|
while(1){
|
|
m_SelectArray.Add( Ep);
|
|
if( Ep.x == Fp.x && Ep.y == Fp.y)
|
|
break;
|
|
if( Slope){
|
|
Tmp = Ep.x;
|
|
Ep.x = Ep.y;
|
|
Ep.y = Tmp;
|
|
}
|
|
Ep.x += Inc.x;
|
|
if( D < 0) D += Err.x;
|
|
else{
|
|
Ep.y += Inc.y;
|
|
D += Err.y;
|
|
}
|
|
if( Slope){
|
|
Tmp = Ep.x;
|
|
Ep.x = Ep.y;
|
|
Ep.y = Tmp;
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* FreeForm */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawFreeForm(
|
|
BOOL MouseSts)
|
|
{
|
|
CPoint Ep, Sp, Cp;
|
|
CPoint Fp, Inc;
|
|
CPoint Dp, Err;
|
|
CPoint P1, P2;
|
|
BOOL Slope;
|
|
int D;
|
|
int Tmp;
|
|
|
|
CClientDC dc( this);
|
|
|
|
CPen *OldPen = (CPen *)dc.SelectStockObject( BLACK_PEN);
|
|
int OldMode = dc.SetROP2( R2_NOTXORPEN);
|
|
|
|
if( !MouseSts){
|
|
Sp.x = ptPrev.x;
|
|
Sp.y = ptPrev.y + CAPTION_HEIGHT;
|
|
Ep.x = Fp.x = ptEnd.x;
|
|
Ep.y = Fp.y = ptEnd.y + CAPTION_HEIGHT;
|
|
}else{
|
|
Sp.x = ptEnd.x;
|
|
Sp.y = ptEnd.y + CAPTION_HEIGHT;
|
|
Ep.x = Fp.x = ptStart.x;
|
|
Ep.y = Fp.y = ptStart.y + CAPTION_HEIGHT;
|
|
}
|
|
if( Fp.x >= Sp.x)
|
|
Inc.x = ZoomRate;
|
|
else Inc.x = 0 - ZoomRate;
|
|
if( Fp.y >= Sp.y)
|
|
Inc.y = ZoomRate;
|
|
else Inc.y = 0 - ZoomRate;
|
|
|
|
Dp.x = ( Fp.x - Sp.x)*Inc.x;
|
|
Dp.y = ( Fp.y - Sp.y)*Inc.y;
|
|
if( !Dp.x && !Dp.y) return;
|
|
if( Dp.x < Dp.y){
|
|
Tmp = Dp.y;
|
|
Dp.y = Dp.x;
|
|
Dp.x = Tmp;
|
|
Tmp = Inc.x;
|
|
Inc.x = Inc.y;
|
|
Inc.y = Tmp;
|
|
Slope = TRUE;
|
|
}else Slope = FALSE;
|
|
|
|
Err.x = Dp.y * 2;
|
|
Err.y = ( Dp.y - Dp.x) * 2;
|
|
D = Err.x - Dp.x;
|
|
Ep = Sp;
|
|
dc.MoveTo( Sp);
|
|
while(1){
|
|
if( Sp.x != Ep.x && Sp.y != Ep.y){
|
|
if( Sp.y < Ep.y && Sp.x > Ep.x){
|
|
Cp.x = Sp.x;
|
|
Cp.y = Ep.y;
|
|
}else if( Sp.y < Ep.y && Sp.x < Ep.x){
|
|
Cp.x = Sp.x;
|
|
Cp.y = Ep.y;
|
|
}else if( Sp.y > Ep.y && Sp.x > Ep.x){
|
|
Cp.y = Sp.y;
|
|
Cp.x = Ep.x;
|
|
}else{
|
|
Cp.y = Sp.y;
|
|
Cp.x = Ep.x;
|
|
}
|
|
dc.LineTo( Cp);
|
|
dc.LineTo( Ep);
|
|
P1 = Cp;
|
|
P2 = Ep;
|
|
m_pointArray.Add( P1);
|
|
m_pointArray.Add( P2);
|
|
}else if( Sp.x != Ep.x || Sp.y != Ep.y){
|
|
dc.LineTo( Ep);
|
|
P1 = Ep;
|
|
m_pointArray.Add( P1);
|
|
}
|
|
Sp.x = Ep.x;
|
|
Sp.y = Ep.y;
|
|
if( Ep.x == Fp.x && Ep.y == Fp.y)
|
|
break;
|
|
if( Slope){
|
|
Tmp = Ep.x;
|
|
Ep.x = Ep.y;
|
|
Ep.y = Tmp;
|
|
}
|
|
Ep.x += Inc.x;
|
|
if( D < 0) D += Err.x;
|
|
else{
|
|
Ep.y += Inc.y;
|
|
D += Err.y;
|
|
}
|
|
if( Slope){
|
|
Tmp = Ep.x;
|
|
Ep.x = Ep.y;
|
|
Ep.y = Tmp;
|
|
}
|
|
}
|
|
dc.SelectObject( OldPen);
|
|
dc.SetROP2( OldMode);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Rubber Band( rectangle and circle) */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::DrawRubberBand(
|
|
BOOL StretchFlag)
|
|
{
|
|
CRect RubberBandRect;
|
|
CPoint ptLT, ptRB;
|
|
int OldMode;
|
|
|
|
CClientDC dc( this);
|
|
|
|
CPen *OldPen = (CPen *)dc.SelectStockObject( BLACK_PEN);
|
|
CBrush *OldBrush = (CBrush *)dc.SelectStockObject( NULL_BRUSH);
|
|
OldMode = dc.SetROP2( R2_NOTXORPEN);
|
|
|
|
if( !StretchFlag){
|
|
ptLT.x = ptStart.x;
|
|
ptLT.y = ptStart.y + CAPTION_HEIGHT;
|
|
ptRB.x = ptPrev.x;
|
|
ptRB.y = ptPrev.y + CAPTION_HEIGHT;
|
|
if( SelectItem != SLOPE)
|
|
IllegalRect( &ptLT, &ptRB);
|
|
RubberBandRect.SetRect( ptLT.x, ptLT.y,
|
|
ptRB.x + ZoomRate + 1, ptRB.y + ZoomRate + 1);
|
|
if( SelectItem == SLOPE){
|
|
dc.MoveTo( ptLT);
|
|
dc.LineTo( ptRB);
|
|
}else if( SelectItem == CIRCLE || SelectItem == CIRCLEFILL)
|
|
dc.Ellipse( &RubberBandRect);
|
|
else dc.Rectangle( &RubberBandRect);
|
|
}
|
|
ptLT.x = ptStart.x;
|
|
ptLT.y = ptStart.y + CAPTION_HEIGHT;
|
|
ptRB.x = ptEnd.x;
|
|
ptRB.y = ptEnd.y + CAPTION_HEIGHT;
|
|
ptPrev = ptRB;
|
|
if( SelectItem != SLOPE)
|
|
IllegalRect( &ptLT, &ptRB);
|
|
RubberBandRect.SetRect( ptLT.x, ptLT.y,
|
|
ptRB.x + ZoomRate + 1, ptRB.y + ZoomRate + 1);
|
|
if( SelectItem == SLOPE){
|
|
dc.MoveTo( ptLT);
|
|
dc.LineTo( ptRB);
|
|
}else if( SelectItem == CIRCLE || SelectItem == CIRCLEFILL)
|
|
dc.Ellipse( &RubberBandRect);
|
|
else dc.Rectangle( &RubberBandRect);
|
|
|
|
dc.SelectObject( OldPen);
|
|
dc.SelectObject( OldBrush);
|
|
dc.SetROP2( OldMode);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Correct coordinate of rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::IllegalRect(
|
|
PPOINT ptTL,
|
|
PPOINT ptBR)
|
|
{
|
|
int Tmp;
|
|
|
|
if( ptTL->x > ptBR->x){
|
|
Tmp = ptTL->x;
|
|
ptTL->x = ptBR->x;
|
|
ptBR->x = Tmp;
|
|
}
|
|
if( ptTL->y > ptBR->y){
|
|
Tmp = ptTL->y;
|
|
ptTL->y = ptBR->y;
|
|
ptBR->y = Tmp;
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Process to term tool */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::ToolTerm()
|
|
{
|
|
if( IsCapture){
|
|
IsCapture = FALSE;
|
|
ReleaseCapture();
|
|
}
|
|
ButtonFlag = NCLICK;
|
|
}
|
|
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set Freeform selection */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::SetFreeForm()
|
|
{
|
|
CBrush EraseBrush;
|
|
CBrush BlackBrush;
|
|
|
|
PickRgn.GetRgnBox( &ClipRect[BMP]);
|
|
if( ClipRect[BMP].Width() < 3 ||
|
|
ClipRect[BMP].Height() < 3){
|
|
FreeRgn.GetRgnBox( &ClipRect[DSP]);
|
|
ClipRect[DSP].right += 1;
|
|
ClipRect[DSP].bottom += 1;
|
|
return FALSE;
|
|
}
|
|
EraseBrush.CreateStockObject( WHITE_BRUSH);
|
|
BlackBrush.CreateStockObject( BLACK_BRUSH);
|
|
CRTDrawDC.FillRect( &ClipRect[BMP], &EraseBrush);
|
|
CRTDrawDC.FillRgn( &PickRgn, &BlackBrush);
|
|
EraseBrush.DeleteObject();
|
|
BlackBrush.DeleteObject();
|
|
|
|
CRTDrawDC.BitBlt( ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(),
|
|
&ImageDC, ClipRect[BMP].left, ClipRect[BMP].top, SRCPAINT);
|
|
|
|
|
|
FreeRgn.GetRgnBox( &ClipRect[DSP]);
|
|
ClipRect[DSP].right += 1;
|
|
ClipRect[DSP].bottom += 1;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Erase Freeform selection area */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::EraseFreeForm()
|
|
{
|
|
CBrush CutBrush;
|
|
CutBrush.CreateSolidBrush( COLOR_WHITE );
|
|
ImageDC.FillRgn( &PickRgn, &CutBrush);
|
|
CutBrush.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Erase rectangle selection area */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::EraseRectangle()
|
|
{
|
|
CRect pRect;
|
|
CPen *OldPen;
|
|
CBrush CutBrush;
|
|
|
|
OldPen = (CPen *)ImageDC.SelectStockObject( NULL_PEN);
|
|
CutBrush.CreateSolidBrush( COLOR_WHITE );
|
|
CBrush *OldBrush = ImageDC.SelectObject( &CutBrush);
|
|
|
|
pRect.CopyRect( &ClipRect[BMP]);
|
|
pRect.right += 1;
|
|
pRect.bottom += 1;
|
|
ImageDC.Rectangle( &pRect);
|
|
ImageDC.SelectObject( OldPen);
|
|
ImageDC.SelectObject( OldBrush);
|
|
CutBrush.DeleteObject();
|
|
|
|
RectClipFlag = FALSE;
|
|
SetValidRect();
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
RectClipFlag = TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Save character with same code */
|
|
/* */
|
|
/****************************************/
|
|
#define ABORT 1
|
|
#define CANCEL 0
|
|
int
|
|
CEditWnd::SaveEUDCCode(UINT msgBoxType)
|
|
{
|
|
CClientDC dc(this);
|
|
CFont cFont, *OldFont;
|
|
LOGFONT LogFont;
|
|
DWORD wSize;
|
|
LPBYTE pBuf;
|
|
LPBYTE pBuf2;
|
|
TCHAR BMPPath[MAX_PATH];
|
|
TCHAR TTFPath[MAX_PATH];
|
|
TCHAR *FilePtr;
|
|
int FontType, sts=0;
|
|
//fix for FontIsLinked
|
|
BOOL firstTime = false;
|
|
//
|
|
if( SelectItem == RECTCLIP || SelectItem == FREEFORM)
|
|
WriteSelRectBitmap();
|
|
|
|
lstrcpy(TTFPath, SelectEUDC.m_File);
|
|
lstrcpy(BMPPath,TTFPath);
|
|
if(( FilePtr = Mytcsrchr( BMPPath, '.')) != NULL)
|
|
*FilePtr = '\0';
|
|
lstrcat( BMPPath, TEXT(".EUF"));
|
|
|
|
// The code is to fix the related bug #421829 & #438677
|
|
// It delays 1 second to call EnabelEUDC(FALSE).
|
|
DWORD dwStart = GetTickCount();
|
|
|
|
// Stop if this has taken too long
|
|
while (1)
|
|
{
|
|
if( GetTickCount() - dwStart >= 1000 )
|
|
break;
|
|
}
|
|
|
|
if( !EnableEUDC( FALSE)){
|
|
MessageBox(TEXT("EnableEUDC() Error"), TEXT("EudcEditor"), MB_OK);
|
|
return ABORT;
|
|
}
|
|
|
|
//fix for FontIsLinked
|
|
//create logFont first, then use this font to create new character
|
|
OInit();
|
|
if( !OExistTTF( TTFPath)){
|
|
firstTime = TRUE;
|
|
memset( &LogFont, 0, sizeof( LogFont));
|
|
lstrcpy (LogFont.lfFaceName, CountryInfo.szForceFont);
|
|
LogFont.lfHeight = BITMAP_HEIGHT;
|
|
LogFont.lfWidth = BITMAP_WIDTH;
|
|
LogFont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
|
|
LogFont.lfCharSet = (BYTE)CountryInfo.CharacterSet;
|
|
LogFont.lfPitchAndFamily = FF_ROMAN; //| FIXED_PITCH;
|
|
if (CountryInfo.LangID == EUDC_JPN)
|
|
{
|
|
// JPN platform, use fixed pitch font.
|
|
LogFont.lfPitchAndFamily |= FIXED_PITCH;
|
|
}
|
|
if( !cFont.CreateFontIndirect( &LogFont)){
|
|
OutputMessageBox(this->GetSafeHwnd(),
|
|
IDS_ASSOCIATE_DLGTITLE,
|
|
IDS_SELECTFONT_ERROR, TRUE);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
OldFont = dc.SelectObject( &cFont);
|
|
|
|
FontType = !SelectEUDC.m_FontTypeFlg? 1:0;
|
|
if( OCreateTTF( dc.GetSafeHdc(), TTFPath, FontType))
|
|
{
|
|
dc.SelectObject(OldFont);
|
|
cFont.DeleteObject();
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
dc.SelectObject(OldFont);
|
|
cFont.DeleteObject();
|
|
}
|
|
|
|
wSize = (DWORD)((( BITMAP_WIDTH +15) /16) *2) *(WORD)BITMAP_HEIGHT;
|
|
pBuf = (LPBYTE)malloc(((( BITMAP_WIDTH +15) /16) *2) *BITMAP_HEIGHT);
|
|
if( pBuf == NULL){
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
pBuf2 = pBuf;
|
|
ImageBmp.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
|
|
if( OMakeOutline( (LPBYTE)pBuf2, BITMAP_WIDTH, SMOOTHLVL) < 0)
|
|
{
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
sts = OOutTTF( dc.GetSafeHdc(),
|
|
TTFPath,
|
|
(unsigned short)UpdateCode,
|
|
CountryInfo.bUnicodeMode);
|
|
if (sts == -3) //tte file is being used by another process
|
|
{
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
|
|
HINSTANCE hInst = AfxGetInstanceHandle();
|
|
TCHAR szMessage[256];
|
|
LoadString(hInst, IDS_OVERWRITEFAIL, szMessage, sizeof(szMessage) / sizeof(TCHAR));
|
|
TCHAR szTitle[256];
|
|
LoadString(hInst, IDS_MAINFRAMETITLE, szTitle, sizeof(szTitle) / sizeof(TCHAR));
|
|
if (MessageBox( szMessage, szTitle, msgBoxType) == IDCANCEL)
|
|
return CANCEL;
|
|
else
|
|
return ABORT;
|
|
}
|
|
else if (sts < 0)
|
|
{
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
|
|
OutputMessageBox( this->GetSafeHwnd(),
|
|
IDS_MAINFRAMETITLE,
|
|
IDS_NOTENOUGHMEMORY_ERROR, TRUE);
|
|
return ABORT;
|
|
}
|
|
|
|
//fix for FontIsLinked
|
|
if (firstTime)
|
|
{
|
|
if (creatW31JEUDC(BMPPath))
|
|
{
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
}
|
|
//
|
|
if( OpenW31JEUDC( BMPPath)){
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
if( PutW31JEUDCFont((unsigned short)UpdateCode, pBuf2, BITMAP_WIDTH,
|
|
BITMAP_HEIGHT, CountryInfo.bUnicodeMode)){
|
|
CloseW31JEUDC();
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
CloseW31JEUDC();
|
|
BitmapDirty = FALSE;
|
|
g_bKeepEUDCLink = TRUE;
|
|
|
|
free(pBuf);
|
|
OTerm();
|
|
EnableEUDC(TRUE);
|
|
return ABORT;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* draw image for undo */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::UndoImageDraw()
|
|
{
|
|
CDC UndoDC;
|
|
|
|
if( !UndoBitmapFlag)
|
|
CreateUndoBitmap();
|
|
|
|
UndoDC.CreateCompatibleDC( &ImageDC);
|
|
CBitmap *OldBitmap = UndoDC.SelectObject( &UndoImage);
|
|
|
|
UndoDC.BitBlt( 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
&ImageDC, 0, 0, SRCCOPY);
|
|
|
|
if( RectClipFlag && (SelectItem == RECTCLIP || SelectItem == FREEFORM)){
|
|
CRect pRect;
|
|
|
|
pRect.SetRect(( ClipRect[DSP].left + 1) /ZoomRate,
|
|
( ClipRect[DSP].top - CAPTION_HEIGHT +1) /ZoomRate,
|
|
( ClipRect[DSP].right + 1)/ZoomRate,
|
|
( ClipRect[DSP].bottom - CAPTION_HEIGHT +1) /ZoomRate);
|
|
|
|
UndoDC.StretchBlt( pRect.left, pRect.top,
|
|
pRect.Width(), pRect.Height(), &CRTDrawDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(), ClipRect[BMP].Height(), SRCAND);
|
|
}
|
|
UndoDC.SelectObject( OldBitmap);
|
|
UndoDC.DeleteDC();
|
|
UndoBitmapFlag = TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* for Update */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::SelectCodes()
|
|
{
|
|
int xSize, ySize;
|
|
int wSize;
|
|
LPBYTE pBuf;
|
|
TCHAR *FilePtr;
|
|
TCHAR BMPPath[MAX_PATH];
|
|
|
|
lstrcpy( BMPPath, SelectEUDC.m_File);
|
|
if(( FilePtr = Mytcsrchr( BMPPath, '.')) != NULL)
|
|
*FilePtr = '\0';
|
|
lstrcat( BMPPath, TEXT(".EUF"));
|
|
|
|
wSize = (int)((( BITMAP_WIDTH + 15) /16) *2) *(int)BITMAP_HEIGHT;
|
|
pBuf = (LPBYTE)malloc( wSize);
|
|
if( OpenW31JEUDC( BMPPath)){
|
|
free( pBuf);
|
|
return FALSE;
|
|
}
|
|
if( GetW31JEUDCFont((unsigned short)UpdateCode, pBuf, wSize,
|
|
&xSize, &ySize, CountryInfo.bUnicodeMode)){
|
|
CloseW31JEUDC();
|
|
free( pBuf);
|
|
return FALSE;
|
|
}else if( xSize != BITMAP_WIDTH || ySize != BITMAP_HEIGHT){
|
|
CloseW31JEUDC();
|
|
free( pBuf);
|
|
return FALSE;
|
|
}
|
|
CloseW31JEUDC();
|
|
|
|
ImageBmp.SetBitmapBits( wSize, (LPVOID)pBuf);
|
|
BitmapDirty = FALSE;
|
|
free( pBuf);
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Clear bitmap data */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::UpdateBitmap()
|
|
{
|
|
WORD wSize;
|
|
HANDLE BitHandle;
|
|
BYTE *pBitmap;
|
|
|
|
wSize = (WORD)((( BITMAP_WIDTH +15) /16) *2) *(WORD)BITMAP_HEIGHT;
|
|
if(( BitHandle = LocalAlloc( LMEM_MOVEABLE, wSize)) == 0)
|
|
return FALSE;
|
|
|
|
if(( pBitmap = (BYTE *)LocalLock( BitHandle)) == NULL){
|
|
LocalFree( BitHandle);
|
|
return FALSE;
|
|
}
|
|
memset( pBitmap, 0xffff, wSize);
|
|
|
|
ImageBmp.SetBitmapBits((DWORD)wSize, (const void far *)pBitmap);
|
|
LocalUnlock( BitHandle);
|
|
LocalFree( BitHandle);
|
|
|
|
if(( SelectItem == RECTCLIP || SelectItem == FREEFORM) && RectClipFlag){
|
|
RectClipFlag = FALSE;
|
|
ToolTerm();
|
|
}
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
BitmapDirty = FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Get bitmap dirty flag */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::GetBitmapDirty()
|
|
{
|
|
return BitmapDirty;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Get bitmap dirty flag */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEditWnd::SetBitmapDirty(
|
|
BOOL Flg)
|
|
{
|
|
BitmapDirty = Flg;
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Call Charcter */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::CallCharTextOut()
|
|
{
|
|
CFont CallFont;
|
|
CSize CharSize;
|
|
BYTE sWork[10];
|
|
int Length;
|
|
int xOffset, yOffset;
|
|
|
|
EditLogFont.lfHeight = BITMAP_HEIGHT;
|
|
EditLogFont.lfWeight = 0;
|
|
EditLogFont.lfQuality = PROOF_QUALITY;
|
|
if( !CallFont.CreateFontIndirect( &EditLogFont))
|
|
return;
|
|
CFont *OldFont = ImageDC.SelectObject( &CallFont);
|
|
|
|
if( !CallCode)
|
|
Length = 0;
|
|
|
|
else
|
|
{
|
|
sWork[0] = LOBYTE(CallCode);
|
|
sWork[1] = HIBYTE(CallCode);
|
|
sWork[2] = sWork[3] = 0;
|
|
Length = 1;
|
|
}
|
|
/*
|
|
else if( !HIBYTE(CallCode)){
|
|
// SBCS
|
|
sWork[0] = LOBYTE(CallCode);
|
|
sWork[1] = (BYTE)'\0';
|
|
Length = 1;
|
|
}else{
|
|
// DBCS
|
|
sWork[0] = HIBYTE(CallCode);
|
|
sWork[1] = LOBYTE(CallCode);
|
|
sWork[2] = (BYTE)'\0';
|
|
Length = 2;
|
|
}
|
|
*/
|
|
if( Length){
|
|
CRect TextImage;
|
|
/*
|
|
GetTextExtentPoint32A( ImageDC.GetSafeHdc(), (LPCSTR)sWork,
|
|
Length, &CharSize);
|
|
*/
|
|
GetTextExtentPoint32W( ImageDC.GetSafeHdc(), (LPCWSTR)sWork,
|
|
Length, &CharSize);
|
|
|
|
TextImage.SetRect( 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT);
|
|
if( CharSize.cx < BITMAP_WIDTH)
|
|
xOffset = ( BITMAP_HEIGHT - CharSize.cx) /2;
|
|
else xOffset = 0;
|
|
|
|
if( CharSize.cy < BITMAP_HEIGHT)
|
|
yOffset = ( BITMAP_WIDTH - CharSize.cy) /2;
|
|
else yOffset = 0;
|
|
|
|
if( EditLogFont.lfFaceName[0] == '@' &&
|
|
Length == 1)
|
|
xOffset = yOffset = 0;
|
|
/*
|
|
ExtTextOutA(ImageDC.GetSafeHdc(), xOffset, yOffset, ETO_OPAQUE,
|
|
&TextImage, (LPCSTR)sWork, Length, NULL);
|
|
*/
|
|
ExtTextOutW(ImageDC.GetSafeHdc(), xOffset, yOffset, ETO_OPAQUE,
|
|
&TextImage, (LPCWSTR)sWork, Length, NULL);
|
|
|
|
}
|
|
ImageDC.SelectObject( OldFont);
|
|
CallFont.DeleteObject();
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* COMMAND "Flip/Rotate" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::FlipRotate(
|
|
int RadioItem)
|
|
{
|
|
CDC RotateDC;
|
|
CBitmap RotateBMP;
|
|
CBrush wBrush;
|
|
int wSize;
|
|
LPBYTE pBuf1, pBuf2;
|
|
LPBYTE pPtr1, pPtr2;
|
|
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
InitFlipRotate( &RotateDC, &RotateBMP);
|
|
|
|
switch( RadioItem){
|
|
case FLIP_HOR:
|
|
if( !RectClipFlag){
|
|
ImageDC.StretchBlt( BITMAP_WIDTH - 1, 0,
|
|
0 - BITMAP_WIDTH, BITMAP_HEIGHT, &CRTDrawDC,
|
|
0, 0, BITMAP_WIDTH, BITMAP_HEIGHT, SRCCOPY);
|
|
}else{
|
|
wBrush.CreateStockObject( WHITE_BRUSH);
|
|
CRTDrawDC.FillRect( &ClipRect[BMP], &wBrush);
|
|
wBrush.DeleteObject();
|
|
|
|
CRTDrawDC.StretchBlt(
|
|
ClipRect[BMP].right - 1, ClipRect[BMP].top,
|
|
0 - ClipRect[BMP].Width(),
|
|
ClipRect[BMP].Height(), &RotateDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(),
|
|
ClipRect[BMP].Height(), SRCCOPY);
|
|
}
|
|
break;
|
|
|
|
case FLIP_VER:
|
|
if( !RectClipFlag){
|
|
ImageDC.StretchBlt( 0, BITMAP_HEIGHT - 1, BITMAP_WIDTH,
|
|
0 - BITMAP_HEIGHT, &CRTDrawDC, 0, 0,
|
|
BITMAP_WIDTH, BITMAP_HEIGHT, SRCCOPY);
|
|
}else{
|
|
wBrush.CreateStockObject( WHITE_BRUSH);
|
|
CRTDrawDC.FillRect( &ClipRect[BMP], &wBrush);
|
|
wBrush.DeleteObject();
|
|
|
|
CRTDrawDC.StretchBlt(
|
|
ClipRect[BMP].left,ClipRect[BMP].bottom - 1,
|
|
ClipRect[BMP].Width(),
|
|
0 - ClipRect[BMP].Height(), &RotateDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(),
|
|
ClipRect[BMP].Height(), SRCCOPY);
|
|
}
|
|
break;
|
|
|
|
case ROTATE_9:
|
|
wSize = (int)((( BITMAP_WIDTH +15) /16) *2)*(int)BITMAP_HEIGHT;
|
|
pBuf1 = (LPBYTE)malloc( wSize);
|
|
pBuf2 = (LPBYTE)malloc( wSize);
|
|
if( !RectClipFlag){
|
|
ImageBmp.GetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
CRTDrawBmp.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
pPtr1 = pBuf1;
|
|
pPtr2 = pBuf2;
|
|
RotateFigure90(pPtr1,pPtr2,BITMAP_WIDTH, BITMAP_HEIGHT);
|
|
ImageBmp.SetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
CRTDrawBmp.SetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
|
|
free(pBuf1);
|
|
free(pBuf2);
|
|
}else{
|
|
CPoint Mid;
|
|
CRTDrawBmp.GetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
RotateBMP.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
pPtr1 = pBuf1;
|
|
pPtr2 = pBuf2;
|
|
RotateFigure90(pPtr1,pPtr2,BITMAP_WIDTH, BITMAP_HEIGHT);
|
|
|
|
int Lft = ClipRect[BMP].left;
|
|
int Btm = ClipRect[BMP].bottom;
|
|
int Wid = ClipRect[BMP].Width();
|
|
int Hgt = ClipRect[BMP].Height();
|
|
ClipRect[BMP].left = BITMAP_HEIGHT - Btm;
|
|
ClipRect[BMP].top = Lft;
|
|
ClipRect[BMP].right = ClipRect[BMP].left + Hgt;
|
|
ClipRect[BMP].bottom = ClipRect[BMP].top + Wid;
|
|
|
|
Lft = ClipRect[DSP].left;
|
|
Btm = ClipRect[DSP].bottom - CAPTION_HEIGHT - 1;
|
|
Wid = ClipRect[DSP].Width();
|
|
Hgt = ClipRect[DSP].Height();
|
|
Mid.x = Lft
|
|
+((ClipRect[DSP].Width()/2)/ZoomRate)*ZoomRate;
|
|
Mid.y = ClipRect[DSP].top - CAPTION_HEIGHT
|
|
+((ClipRect[DSP].Height()/2)/ZoomRate)*ZoomRate;
|
|
|
|
Mid.x -= (((ClipRect[DSP].Height()/2)/ZoomRate)*ZoomRate);
|
|
Mid.y -= (((ClipRect[DSP].Width()/2)/ZoomRate)*ZoomRate);
|
|
if( Mid.x < 0) ClipRect[DSP].left = 0;
|
|
else{
|
|
if( ClipRect[DSP].left + Hgt <=
|
|
EudcWndRect.right){
|
|
ClipRect[DSP].left = Mid.x;
|
|
}else{
|
|
ClipRect[DSP].left =
|
|
Mid.x - ((Mid.x + Hgt - EudcWndRect.right)/ZoomRate)*ZoomRate;
|
|
}
|
|
}
|
|
if( Mid.y < 0) ClipRect[DSP].top = CAPTION_HEIGHT;
|
|
else{
|
|
if( ClipRect[DSP].top + Wid <= EudcWndRect.bottom){
|
|
ClipRect[DSP].top =
|
|
CAPTION_HEIGHT + Mid.y;
|
|
}else{
|
|
ClipRect[DSP].top =
|
|
CAPTION_HEIGHT + Mid.y - (( CAPTION_HEIGHT + Mid.y + Wid - EudcWndRect.bottom)/ZoomRate)*ZoomRate;
|
|
}
|
|
}
|
|
ClipRect[DSP].right = ClipRect[DSP].left + Hgt;
|
|
ClipRect[DSP].bottom = ClipRect[DSP].top + Wid;
|
|
CRTDrawBmp.SetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
RotateBMP.SetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
free(pBuf1);
|
|
free(pBuf2);
|
|
}
|
|
break;
|
|
|
|
case ROTATE_18:
|
|
if( !RectClipFlag){
|
|
ImageDC.StretchBlt( BITMAP_WIDTH -1, BITMAP_HEIGHT-1,
|
|
0-BITMAP_HEIGHT, 0-BITMAP_WIDTH, &CRTDrawDC,
|
|
0, 0, BITMAP_WIDTH, BITMAP_HEIGHT, SRCCOPY);
|
|
}else{
|
|
wBrush.CreateStockObject( WHITE_BRUSH);
|
|
CRTDrawDC.FillRect( &ClipRect[BMP], &wBrush);
|
|
wBrush.DeleteObject();
|
|
|
|
CRTDrawDC.StretchBlt(
|
|
ClipRect[BMP].right-1, ClipRect[BMP].bottom-1,
|
|
0 - ClipRect[BMP].Width(),
|
|
0 - ClipRect[BMP].Height(), &RotateDC,
|
|
ClipRect[BMP].left, ClipRect[BMP].top,
|
|
ClipRect[BMP].Width(),
|
|
ClipRect[BMP].Height(), SRCCOPY);
|
|
}
|
|
break;
|
|
|
|
case ROTATE_27:
|
|
wSize = (int)((( BITMAP_WIDTH +15) /16) *2) *(int)BITMAP_HEIGHT;
|
|
pBuf1 = (LPBYTE)malloc( wSize);
|
|
pBuf2 = (LPBYTE)malloc( wSize);
|
|
if( !RectClipFlag){
|
|
ImageBmp.GetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
CRTDrawBmp.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
pPtr1 = pBuf1;
|
|
pPtr2 = pBuf2;
|
|
RotateFigure270( pPtr1, pPtr2, BITMAP_WIDTH,
|
|
BITMAP_HEIGHT);
|
|
ImageBmp.SetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
CRTDrawBmp.SetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
|
|
free(pBuf1);
|
|
free(pBuf2);
|
|
}else{
|
|
CPoint Mid;
|
|
CRTDrawBmp.GetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
RotateBMP.GetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
pPtr1 = pBuf1;
|
|
pPtr2 = pBuf2;
|
|
RotateFigure270( pPtr1, pPtr2,
|
|
BITMAP_WIDTH, BITMAP_HEIGHT);
|
|
|
|
int Rgt = ClipRect[BMP].right;
|
|
int Top = ClipRect[BMP].top;
|
|
int Wid = ClipRect[BMP].Width();
|
|
int Hgt = ClipRect[BMP].Height();
|
|
ClipRect[BMP].left = Top;
|
|
ClipRect[BMP].top = BITMAP_WIDTH - Rgt;
|
|
ClipRect[BMP].right = ClipRect[BMP].left + Hgt;
|
|
ClipRect[BMP].bottom = ClipRect[BMP].top + Wid;
|
|
|
|
Rgt = ClipRect[DSP].right - 1;
|
|
Top = ClipRect[DSP].top - CAPTION_HEIGHT;
|
|
Wid = ClipRect[DSP].Width();
|
|
Hgt = ClipRect[DSP].Height();
|
|
Mid.x = ClipRect[DSP].left
|
|
+ ((ClipRect[DSP].Width()/2)/ZoomRate)*ZoomRate;
|
|
Mid.y = Top
|
|
+ ((ClipRect[DSP].Height()/2)/ZoomRate)*ZoomRate;
|
|
Mid.x -= (((ClipRect[DSP].Height()/2)/ZoomRate)*ZoomRate);
|
|
Mid.y -= (((ClipRect[DSP].Width()/2)/ZoomRate)*ZoomRate);
|
|
if( Mid.x < 0) ClipRect[DSP].left = 0;
|
|
else{
|
|
if( ClipRect[DSP].left + Hgt
|
|
<= EudcWndRect.right){
|
|
ClipRect[DSP].left = Mid.x;
|
|
}else{
|
|
ClipRect[DSP].left =
|
|
Mid.x - ((Mid.x + Hgt - EudcWndRect.right)/ZoomRate)*ZoomRate;
|
|
}
|
|
}
|
|
if( Mid.y < 0)
|
|
ClipRect[DSP].top = CAPTION_HEIGHT;
|
|
else{
|
|
if( ClipRect[DSP].top + Wid <= EudcWndRect.bottom){
|
|
ClipRect[DSP].top =
|
|
CAPTION_HEIGHT + Mid.y;
|
|
}else{
|
|
ClipRect[DSP].top =
|
|
CAPTION_HEIGHT + Mid.y - (( CAPTION_HEIGHT + Mid.y + Wid - EudcWndRect.bottom)/ZoomRate)*ZoomRate;
|
|
}
|
|
}
|
|
ClipRect[DSP].right = ClipRect[DSP].left + Hgt;
|
|
ClipRect[DSP].bottom = ClipRect[DSP].top + Wid;
|
|
|
|
CRTDrawBmp.SetBitmapBits( wSize, (LPVOID)pBuf1);
|
|
RotateBMP.SetBitmapBits( wSize, (LPVOID)pBuf2);
|
|
free(pBuf1);
|
|
free(pBuf2);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
if( RectClipFlag){
|
|
if( RotateBMP.Detach() != NULL)
|
|
RotateBMP.DeleteObject();
|
|
if( RotateDC.Detach() != NULL)
|
|
RotateDC.DeleteDC();
|
|
}
|
|
this->Invalidate(FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
/************************************************/
|
|
/* */
|
|
/* Initialize before flip or rotate */
|
|
/* */
|
|
/************************************************/
|
|
void
|
|
CEditWnd::InitFlipRotate(
|
|
CDC* RotateDC,
|
|
CBitmap *RotateBMP)
|
|
{
|
|
WORD BitSize;
|
|
HANDLE BitInit;
|
|
BYTE *BitmapPtr;
|
|
|
|
if( RectClipFlag){
|
|
CClientDC dc( this);
|
|
if( !RotateDC->CreateCompatibleDC( &dc))
|
|
return;
|
|
|
|
BitSize = (WORD)((( BITMAP_WIDTH +15) /16) *2)
|
|
* (WORD)BITMAP_HEIGHT;
|
|
if(( BitInit = LocalAlloc( LMEM_MOVEABLE, BitSize))==0)
|
|
return;
|
|
|
|
if(( BitmapPtr = (BYTE *)LocalLock( BitInit)) == NULL){
|
|
LocalFree( BitInit);
|
|
return;
|
|
}
|
|
memset( BitmapPtr, 0xffff, BitSize);
|
|
if( !RotateBMP->CreateBitmap(BITMAP_WIDTH,BITMAP_HEIGHT,
|
|
1, 1, (LPSTR)BitmapPtr)){
|
|
LocalUnlock( BitInit);
|
|
LocalFree( BitInit);
|
|
return;
|
|
}
|
|
LocalUnlock( BitInit);
|
|
LocalFree( BitInit);
|
|
RotateDC->SelectObject( RotateBMP);
|
|
|
|
RotateDC->BitBlt( 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
&CRTDrawDC, 0, 0, SRCCOPY);
|
|
}else{
|
|
CRTDrawDC.BitBlt( 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT,
|
|
&ImageDC, 0, 0, SRCCOPY);
|
|
}
|
|
}
|
|
|
|
#define set_p(a,i) ((a)[(i)>>3] & (0x80>>((i)&7)))
|
|
/****************************************/
|
|
/* */
|
|
/* Rotate 90 */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::RotateFigure90(
|
|
LPBYTE pBuf1,
|
|
LPBYTE pBuf2,
|
|
int bWid,
|
|
int bHgt)
|
|
{
|
|
int i, j, k, l;
|
|
int wSize, aSize;
|
|
BYTE Pt, *test;
|
|
|
|
aSize = (int)(((( bWid + 15) /16) *2) *bHgt);
|
|
wSize = (int)((( bWid + 15) /16) *2);
|
|
test = pBuf2;
|
|
for( i = 0; i < wSize; i++){
|
|
pBuf2 = test + aSize - wSize + i;
|
|
for( j = 0; j < 8; j++){
|
|
for( k = wSize-1; k >= 0; k--){
|
|
memset( &Pt, 0x00, sizeof(BYTE));
|
|
for( l = 0; l < 8; l++){
|
|
if( set_p(pBuf2, j))
|
|
Pt |= (1<<(7-l));
|
|
pBuf2 -= wSize;
|
|
}
|
|
*pBuf1++ = Pt;
|
|
}
|
|
pBuf2 = test + aSize - wSize + i;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Rotate 270 */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::RotateFigure270(
|
|
LPBYTE pBuf1,
|
|
LPBYTE pBuf2,
|
|
int bWid,
|
|
int bHgt)
|
|
{
|
|
int i, j, k, l;
|
|
int wSize, aSize;
|
|
BYTE Pt, *test;
|
|
|
|
aSize = (int)(((( bWid + 15) /16) *2) *bHgt);
|
|
wSize = (int)((( bWid + 15) /16) *2);
|
|
test = pBuf2;
|
|
for( i = 0; i < wSize; i++){
|
|
pBuf2 = test + wSize - 1 - i;
|
|
for( j = 7; j >= 0; j--){
|
|
for( k = wSize-1; k >= 0; k--){
|
|
memset( &Pt, 0x00, sizeof(BYTE));
|
|
for( l = 0; l < 8; l++){
|
|
if( set_p(pBuf2, j))
|
|
Pt |= (1<<(7-l));
|
|
pBuf2 += wSize;
|
|
}
|
|
*pBuf1++ = Pt;
|
|
}
|
|
pBuf2 = test + wSize - 1 - i;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set Duplicate rectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEditWnd::SetDuplicateRect(
|
|
RECT *rect,
|
|
POINT *point)
|
|
{
|
|
LPBYTE pDupBmp;
|
|
int wSize;
|
|
|
|
UndoImageDraw();
|
|
BitmapDirty = TRUE;
|
|
WriteSelRectBitmap();
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
|
|
wSize = ((( BITMAP_WIDTH +15) /16) *2) *BITMAP_HEIGHT;
|
|
pDupBmp = (LPBYTE)malloc( wSize);
|
|
DupBmp.GetBitmapBits( wSize, (LPVOID)pDupBmp);
|
|
CRTDrawBmp.SetBitmapBits( wSize, (LPVOID)pDupBmp);
|
|
free( pDupBmp);
|
|
|
|
ClipRect[DSP].CopyRect( rect);
|
|
ClipRect[PRV].CopyRect( rect);
|
|
SetValidRect();
|
|
SetClickRect();
|
|
ClipRect[BMP].SetRect( DupRect.left /ZoomRate,
|
|
( DupRect.top - CAPTION_HEIGHT) /ZoomRate,
|
|
DupRect.right /ZoomRate,
|
|
( DupRect.bottom - CAPTION_HEIGHT) /ZoomRate);
|
|
RectClipFlag = TRUE;
|
|
|
|
this->InvalidateRect( &ClipRect[VLD], FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
void CEditWnd::OnClose()
|
|
{
|
|
// Don't allow user to use hot key to close this window
|
|
|
|
//CMDIChildWnd::OnClose();
|
|
}
|