Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1296 lines
32 KiB

/**************************************************/
/* */
/* */
/* MDI Child Window( Reference) */
/* */
/* */
/* Copyright (c) 1997-1999 Microsoft Corporation. */
/**************************************************/
#include "stdafx.h"
#include "eudcedit.h"
#include "refrwnd.h"
#include "editwnd.h"
#include "mainfrm.h"
#define FREELIAIS 1000
LOGFONT ReffLogFont;
CBitmap DupBmp;
CRect DupRect;
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern CEditWnd *pEditChild;
CMenu NEAR CRefrWnd::menu;
IMPLEMENT_DYNCREATE(CRefrWnd, CMDIChildWnd)
BEGIN_MESSAGE_MAP(CRefrWnd, CMDIChildWnd)
//{{AFX_MSG_MAP(CRefrWnd)
ON_BN_CLICKED( IDB_CLOSE_REF, OnClickClose)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_GAIJI_COPY, OnGaijiCopy)
ON_UPDATE_COMMAND_UI(ID_GAIJI_COPY, OnUpdateGaijiCopy)
ON_WM_SETCURSOR()
ON_WM_MDIACTIVATE()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/****************************************/
/* */
/* Create reference Window */
/* */
/****************************************/
BOOL
CRefrWnd::Create(
LPCTSTR szTitle,
LONG Style,
RECT ReffWndRect,
CMDIFrameWnd* Parent)
{
// Set Mainframe menu for reference
if( menu.m_hMenu == NULL)
menu.LoadMenu( IDR_MAINFRAME);
m_hMenuShared = menu.m_hMenu;
// Register WindowClass
const TCHAR *pszReffWndClass =
AfxRegisterWndClass( CS_BYTEALIGNCLIENT,
NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL);
return CMDIChildWnd::Create( pszReffWndClass,
szTitle, Style, ReffWndRect, Parent);
}
/****************************************/
/* */
/* Process before window create */
/* */
/****************************************/
int
CRefrWnd::OnCreate(
LPCREATESTRUCT lpCreateStruct)
{
if( CMDIChildWnd::OnCreate( lpCreateStruct) == -1)
return -1;
// Check if m_hWnd is mirrored then we need to set the colse button on the other side.
m_bCloseOnLeft = (BOOL)(GetWindowLongPtr(m_hWnd, GWL_EXSTYLE) & WS_EX_LAYOUTRTL);
// Then turn off miroring if any.
if (m_bCloseOnLeft) {
ModifyStyleEx( WS_EX_LAYOUTRTL, 0);
}
if( !CreateNewBitmap())
return -1;
if( !ClipPickValueInit())
return -1;
if( !InitSelectLogfont())
return -1;
if( !LoadCloseBitmap())
return -1;
return 0;
}
/****************************************/
/* */
/* Create New Bitmap */
/* */
/****************************************/
BOOL
CRefrWnd::CreateNewBitmap()
{
WORD wSize;
HANDLE BmpHdl;
BYTE *pBmp;
CClientDC dc( this);
if( !ImageDC.CreateCompatibleDC( &dc))
return FALSE;
wSize = (WORD)((( BITMAP_WIDTH +15) /16) *2) *(WORD)BITMAP_HEIGHT;
if(( BmpHdl = LocalAlloc( LMEM_MOVEABLE, wSize)) == 0)
return FALSE;
if(( pBmp = (BYTE *)LocalLock( BmpHdl)) == NULL){
LocalUnlock( BmpHdl);
LocalFree( BmpHdl);
return FALSE;
}
memset( pBmp, 0xffff, wSize);
if( !ImageBmp.CreateBitmap( BITMAP_WIDTH, BITMAP_HEIGHT,
1, 1, (LPSTR)pBmp)){
LocalUnlock( BmpHdl);
LocalFree( BmpHdl);
return FALSE;
}
LocalUnlock( BmpHdl);
LocalFree( BmpHdl);
ImageDC.SelectObject( &ImageBmp);
return TRUE;
}
/****************************************/
/* */
/* Initialize clipboard format */
/* */
/****************************************/
BOOL
CRefrWnd::ClipPickValueInit()
{
if( !( ClipboardFormat = RegisterClipboardFormat(TEXT("EudcEdit"))))
return FALSE;
else return TRUE;
}
/****************************************/
/* */
/* Initialize selected logfont */
/* */
/****************************************/
BOOL
CRefrWnd::InitSelectLogfont()
{
CFont cFont;
#ifdef BUILD_ON_WINNT
cFont.CreateStockObject(DEFAULT_GUI_FONT);
#else
cFont.CreateStockObject( SYSTEM_FONT);
#endif
cFont.GetObject( sizeof(LOGFONT), &ReffLogFont);
cFont.DeleteObject();
return TRUE;
}
/****************************************/
/* */
/* Load Close Bitmap (to close) */
/* */
/****************************************/
BOOL
CRefrWnd::LoadCloseBitmap()
{
CRect rect;
this->GetClientRect( &rect);
rect.top = 2;
rect.bottom = CAPTION_HEIGHT - 2;
rect.right -= 2;
rect.left = rect.right - ( rect.bottom - rect.top) - 5;
if( !CloseBtm.Create( NULL, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW |
WS_EX_TOPMOST | BS_PUSHBUTTON, rect, this, IDB_CLOSE_REF) ||
!CloseBtm.LoadBitmaps( IDB_CLOSEBMP, IDB_CLOSEBMPP))
return FALSE;
else{
CloseBtm.SizeToContent();
return TRUE;
}
}
/****************************************/
/* */
/* Default Constructor */
/* */
/****************************************/
CRefrWnd::CRefrWnd()
{
RectVisible = FALSE;
IsCapture = FALSE;
SelectItems = RECTCLIP;
GridShow = TRUE;
bFocus = FALSE;
m_bCloseOnLeft = FALSE;
}
/****************************************/
/* */
/* Destructor */
/* */
/****************************************/
CRefrWnd::~CRefrWnd()
{
if( ImageBmp.Detach() != NULL)
ImageBmp.DeleteObject();
if( ImageDC.Detach() != NULL)
ImageDC.DeleteDC();
menu.DestroyMenu();
}
/****************************************/
/* */
/* MESSAGE "WM_PAINT" */
/* */
/****************************************/
void
CRefrWnd::OnPaint()
{
CString WndCaption;
CFont RefferFont;
BYTE sWork[10];
CSize CharSize;
short xOffset, yOffset;
int Length;
CPaintDC dc( this);
this->GetClientRect( &ReffWndRect);
ZoomRate = ReffWndRect.right /BITMAP_WIDTH;
ReffLogFont.lfHeight = BITMAP_HEIGHT;
ReffLogFont.lfWidth = 0;
ReffLogFont.lfQuality = PROOF_QUALITY;
if( !RefferFont.CreateFontIndirect( &ReffLogFont))
return;
CFont *OldFont = ImageDC.SelectObject( &RefferFont);
if( !ReferCode)
Length = 0;
/*
else if( !(ReferCode & 0xff00)){
// SBCS
sWork[0] = (BYTE)( ReferCode & 0x00ff);
sWork[1] = (BYTE)'\0';
Length = 1;
}else{
// DBCS
sWork[0] = (BYTE)(( ReferCode & 0xff00) >> 8);
sWork[1] = (BYTE)( ReferCode & 0x00ff);
sWork[2] = (BYTE)'\0';
Length = 2;
}
*/
else
{
sWork[0] = LOBYTE(ReferCode);
sWork[1] = HIBYTE(ReferCode);
Length = 1;
}
if( Length){
CRect TextImage;
GetTextExtentPoint32W( ImageDC.GetSafeHdc(), (const unsigned short *)sWork,
Length, &CharSize);
/*
GetTextExtentPoint32A( ImageDC.GetSafeHdc(), (LPCSTR)sWork,
Length, &CharSize);*/
TextImage.SetRect( 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT);
if( CharSize.cx < BITMAP_WIDTH)
xOffset = (short)(( BITMAP_HEIGHT - CharSize.cx) /2);
else xOffset = 0;
if( CharSize.cy < BITMAP_HEIGHT)
yOffset = (short)(( BITMAP_WIDTH - CharSize.cy) /2);
else yOffset = 0;
/*
if( ReffLogFont.lfFaceName[0] == '@' && Length == 2)
xOffset = yOffset = 0;
*/
if( ReffLogFont.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, (const unsigned short *)sWork, Length, NULL);
}
dc.StretchBlt( 0, CAPTION_HEIGHT, ReffWndRect.Width(),
ReffWndRect.Height() - CAPTION_HEIGHT,
&ImageDC, 0, 0, BITMAP_WIDTH, BITMAP_HEIGHT,SRCCOPY);
CRect rect;
rect.CopyRect( &ReffWndRect);
rect.top = 2;
rect.bottom = CAPTION_HEIGHT - 2;
if (m_bCloseOnLeft) {
rect.left += 2;
rect.right = rect.left + ( rect.bottom - rect.top) - 2;
} else {
rect.right -= 2;
rect.left = rect.right - ( rect.bottom - rect.top) - 2;
}
CloseBtm.SetWindowPos( NULL, rect.left, rect.top,
0, 0, SWP_NOSIZE );
CaptionDraw();
if( RectVisible)
RubberBandPaint( &dc);
if( GridShow && ZoomRate >= 2)
DrawGridLine( &dc);
ImageDC.SelectObject( OldFont);
RefferFont.DeleteObject();
return;
}
/****************************************/
/* */
/* Draw Caption */
/* */
/****************************************/
void
CRefrWnd::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( &ReffWndRect);
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_REFERENCE_STR);
dc.TextOut( ReffWndRect.right /2 - 30, 1, WndCaption);
dc.SelectObject( OldFont);
dc.SetTextColor( TextColor);
dc.SetBkMode( BkMode);
//
// redraw the close button.
//
CloseBtm.Invalidate(FALSE);
::ReleaseDC( NULL, dc.Detach());
return;
}
/****************************************/
/* */
/* Draw Grid */
/* */
/****************************************/
void
CRefrWnd::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 < ReffWndRect.right; i += ZoomRate){
dc->MoveTo( i, CAPTION_HEIGHT-1);
dc->LineTo( i, ReffWndRect.bottom);
}
for( i =ZoomRate +CAPTION_HEIGHT -1;i<ReffWndRect.bottom;i += ZoomRate){
dc->MoveTo( 0, i);
dc->LineTo( ReffWndRect.right, i);
}
dc->SelectObject( OldPen);
GlyphPen.DeleteObject();
}
/****************************************/
/* */
/* Draw RubberBand */
/* */
/****************************************/
void
CRefrWnd::RubberBandPaint(
CDC *dc)
{
CPen *OldPen;
CBrush *OldBrush;
int OldMode;
OldPen = (CPen *)dc->SelectStockObject( BLACK_PEN);
OldBrush = (CBrush *)dc->SelectStockObject( NULL_BRUSH);
OldMode = dc->SetROP2( R2_NOTXORPEN);
dc->Rectangle( &MoveRect);
dc->SelectObject( OldPen);
dc->SelectObject( OldBrush);
dc->SetROP2( OldMode);
}
/****************************************/
/* */
/* MESSAGE "WM_LBUTTONDOWN" */
/* */
/****************************************/
void
CRefrWnd::OnLButtonDown(
UINT ,
CPoint point)
{
CRect CaptionRect;
CaptionRect.CopyRect( &ReffWndRect);
CaptionRect.top = CAPTION_HEIGHT;
if( !CaptionRect.PtInRect( point))
return;
IsCapture = TRUE;
this->SetCapture();
CorrectMouseDownPt( point);
if( RectVisible){
if( MoveRect.PtInRect( point)){
RectVisible = FALSE;
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
RectVisible = TRUE;
m_ptMouse.x = point.x - MoveRect.left;
m_ptMouse.y = point.y - MoveRect.top;
this->ClientToScreen( &point);
MoveRectangle( point);
m_ptLast = point;
return;
}else{
RectVisible = FALSE;
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
}
}
if( SelectItems == RECTCLIP)
RubberBand( 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);
}
}
/****************************************/
/* */
/* MESSAGE "WM_MOUSEMOVE" */
/* */
/****************************************/
void
CRefrWnd::OnMouseMove(
UINT ,
CPoint point)
{
if( IsCapture){
CorrectMouseUpPt( point);
if( ptEnd.x == ptPrev.x && ptEnd.y == ptPrev.y)
return;
if( RectVisible){
this->ClientToScreen( &point);
MoveRectangle( m_ptLast);
m_ptLast = point;
MoveRectangle( m_ptLast);
}else{
if( SelectItems == RECTCLIP)
RubberBand( FALSE);
else{
DrawFreeForm( FALSE);
SelectFreeForm( FALSE);
}
}
}
}
/****************************************/
/* */
/* MESSAGE "WM_LBUTTONUP" */
/* */
/****************************************/
void
CRefrWnd::OnLButtonUp(
UINT ,
CPoint point)
{
CRect WorkRect;
int wSize;
char *pDupBmp;
if (!bFocus)
{
bFocus = TRUE;
CaptionDraw();
pEditChild->bFocus = FALSE;
pEditChild->CaptionDraw();
}
if( IsCapture){
CorrectMouseUpPt( point);
if( RectVisible){
MoveRectangle( m_ptLast);
WorkRect.CopyRect( &MoveRect);
WorkRect.left = ptStart.x - MoveRect.left;
WorkRect.top = ptStart.y - MoveRect.top+CAPTION_HEIGHT;
WorkRect.right = MoveRect.Width();
WorkRect.bottom = MoveRect.Height();
this->ClientToScreen( &point);
DupBmp.CreateBitmap( BITMAP_WIDTH, BITMAP_HEIGHT,
1, 1, NULL);
wSize = ((( BITMAP_WIDTH +15) /16) *2) *BITMAP_HEIGHT;
pDupBmp = (char *)malloc( wSize);
if( SelectItems == FREEFORM){
CBitmap hStdBitmap;
CDC hStdDC;
CBrush BlackBrush;
hStdDC.CreateCompatibleDC( &ImageDC);
hStdBitmap.CreateCompatibleBitmap( &ImageDC,
BITMAP_WIDTH, BITMAP_HEIGHT);
CBitmap *hOldSObj =
hStdDC.SelectObject( &hStdBitmap);
hStdDC.PatBlt( 0, 0, BITMAP_WIDTH,
BITMAP_HEIGHT, WHITENESS);
BlackBrush.CreateStockObject( BLACK_BRUSH);
hStdDC.FillRgn( &PickRgn, &BlackBrush);
BlackBrush.DeleteObject();
hStdDC.BitBlt( 0, 0, BITMAP_WIDTH,
BITMAP_HEIGHT, &ImageDC,0, 0, SRCPAINT);
hStdBitmap.GetBitmapBits( wSize,
(LPVOID)pDupBmp);
hStdDC.SelectObject( &hOldSObj);
hStdBitmap.DeleteObject();
hStdDC.DeleteDC();
}else{
ImageBmp.GetBitmapBits( wSize, (LPVOID)pDupBmp);
}
DupBmp.SetBitmapBits( wSize, (LPVOID)pDupBmp);
free( pDupBmp);
DupRect.CopyRect( &MoveRect);
AfxGetMainWnd()->SendMessage( WM_DUPLICATE,
(WPARAM)&WorkRect,(LPARAM)&point);
DupBmp.DeleteObject();
}else if( SelectItems == RECTCLIP){
IllegalRect( &ptStart, &ptEnd);
MoveRect.SetRect( ptStart.x, ptStart.y + CAPTION_HEIGHT,
ptEnd.x + ZoomRate + 1,
ptEnd.y + ZoomRate + CAPTION_HEIGHT + 1);
if( abs( ptEnd.x - ptStart.x) < ZoomRate*2 ||
abs( ptEnd.y - ptStart.y) < ZoomRate*2){
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
}else{
RectVisible = TRUE;
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
}
PickRect.SetRect(ptStart.x/ZoomRate, ptStart.y/ZoomRate,
( ptEnd.x+ZoomRate)/ZoomRate,
( ptEnd.y+ZoomRate)/ZoomRate);
}else{
CPoint nArray[FREELIAIS];
CPoint pArray[FREELIAIS];
DrawFreeForm( FALSE);
SelectFreeForm( FALSE);
DrawFreeForm( TRUE);
SelectFreeForm( TRUE);
if( m_pointArray.GetSize() >= FREELIAIS ||
m_selectArray.GetSize() >= FREELIAIS ){
IsCapture = FALSE;
ReleaseCapture();
this->Invalidate( FALSE);
this->UpdateWindow();
return;
}
for( int i = 0; i < m_pointArray.GetSize(); i++)
nArray[i] = m_pointArray[i];
for( int k = 0; k < m_selectArray.GetSize(); k++)
pArray[k] = m_selectArray[k];
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();
}else{
RectVisible = TRUE;
FreeRgn.GetRgnBox( &MoveRect);
PickRgn.GetRgnBox( &PickRect);
if( PickRect.Width() < 3 ||
PickRect.Height() < 3){
RectVisible = FALSE;
FreeRgn.DeleteObject();
PickRgn.DeleteObject();
}
MoveRect.right += 1;
MoveRect.bottom += 1;
this->InvalidateRect( &MoveRect);
this->UpdateWindow();
}
}
IsCapture = FALSE;
}
ReleaseCapture();
}
/****************************************/
/* */
/* Correct Mouse Down Point */
/* */
/****************************************/
void
CRefrWnd::CorrectMouseDownPt(
CPoint point)
{
CRect WorkRect;
WorkRect.CopyRect( &ReffWndRect);
ptStart.x = point.x;
ptStart.y = point.y - CAPTION_HEIGHT;
if( ptStart.y < 0)
ptStart.y = 0;
if( SelectItems == RECTCLIP){
ptStart.x = ( ptStart.x /ZoomRate) *ZoomRate;
ptStart.y = ( ptStart.y /ZoomRate) *ZoomRate;
}else{
ptStart.x = (( ptStart.x + ZoomRate/2) /ZoomRate) *ZoomRate;
ptStart.y = (( ptStart.y + ZoomRate/2) /ZoomRate) *ZoomRate;
}
ptEnd = ptPrev = ptStart;
}
/****************************************/
/* */
/* Correct Mouse Up point */
/* */
/****************************************/
void
CRefrWnd::CorrectMouseUpPt(
CPoint point)
{
ptPrev = ptEnd;
ptEnd.x = point.x;
ptEnd.y = point.y - CAPTION_HEIGHT;
CRect WorkRect;
WorkRect.CopyRect( &ReffWndRect);
if( ptEnd.x < 0) ptEnd.x = 0;
if( ptEnd.y < 0) ptEnd.y = 0;
if( ptEnd.x > WorkRect.right){
if( SelectItems == RECTCLIP)
ptEnd.x = WorkRect.right - ZoomRate;
else ptEnd.x = WorkRect.right;
}
if( ptEnd.y > WorkRect.bottom - CAPTION_HEIGHT){
if( SelectItems == RECTCLIP){
ptEnd.y = WorkRect.bottom - CAPTION_HEIGHT
- ZoomRate;
}else ptEnd.y = WorkRect.bottom - CAPTION_HEIGHT;
}
if( SelectItems == RECTCLIP){
ptEnd.x = ( ptEnd.x /ZoomRate) *ZoomRate;
ptEnd.y = ( ptEnd.y /ZoomRate) *ZoomRate;
}else{
ptEnd.x = (( ptEnd.x + ZoomRate/2) /ZoomRate) *ZoomRate;
ptEnd.y = (( ptEnd.y + ZoomRate/2) /ZoomRate) *ZoomRate;
}
if( SelectItems == RECTCLIP){
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;
}
}
/****************************************/
/* */
/* Correct Illegal rectangle */
/* */
/****************************************/
void
CRefrWnd::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;
}
}
/****************************************/
/* */
/* COMMAND "COPY" */
/* */
/****************************************/
void
CRefrWnd::OnGaijiCopy()
{
ClipImageCopy();
CMainFrame *pMain = new CMainFrame;
pMain->CustomActivate();
delete pMain;
}
/************************************************/
/* */
/* COMMAND "COPY" (Update) */
/* */
/************************************************/
void
CRefrWnd::OnUpdateGaijiCopy(
CCmdUI *pCmdUI)
{
if( RectVisible)
pCmdUI->Enable(TRUE);
else pCmdUI->Enable(FALSE);
}
/****************************************/
/* */
/* Copy Bitmap data */
/* */
/****************************************/
BOOL
CRefrWnd::ClipImageCopy()
{
CBitmap hStdBitmap;
CDC hStdDC;
hStdDC.CreateCompatibleDC( &ImageDC);
hStdBitmap.CreateCompatibleBitmap( &ImageDC,
PickRect.Width(), PickRect.Height());
CBitmap *hOldSObj = hStdDC.SelectObject( &hStdBitmap);
hStdDC.PatBlt( 0, 0, PickRect.Width(), PickRect.Height(), WHITENESS);
if( SelectItems == FREEFORM){
CBrush BlackBrush;
BlackBrush.CreateStockObject( BLACK_BRUSH);
PickRgn.OffsetRgn( 0 - PickRect.left, 0 - PickRect.top);
hStdDC.FillRgn( &PickRgn, &BlackBrush);
BlackBrush.DeleteObject();
hStdDC.BitBlt( 0, 0, PickRect.Width(), PickRect.Height(),
&ImageDC, PickRect.left, PickRect.top, SRCPAINT);
}else{
hStdDC.BitBlt( 0, 0, PickRect.Width(), PickRect.Height(),
&ImageDC, PickRect.left, PickRect.top, SRCCOPY);
}
if (!this->OpenClipboard()) {
hStdDC.SelectObject( hOldSObj);
hStdBitmap.DeleteObject();
hStdDC.DeleteDC();
return FALSE;
}
EmptyClipboard();
if( !SetClipboardData( CF_BITMAP, hStdBitmap.Detach())) {
hStdDC.SelectObject( hOldSObj);
hStdBitmap.DeleteObject();
hStdDC.DeleteDC();
CloseClipboard();
return FALSE;
}
CloseClipboard();
hStdDC.SelectObject( hOldSObj);
hStdBitmap.DeleteObject();
hStdDC.DeleteDC();
RectVisible = FALSE;
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
return TRUE;
}
/****************************************/
/* */
/* Draw Rubber Band rectanble */
/* */
/****************************************/
void
CRefrWnd::RubberBand(
BOOL TestFlag)
{
CPen *OldPen;
CBrush *OldBrush;
CPoint ptTL;
CPoint ptBR;
CClientDC dc( this);
OldPen = (CPen *)dc.SelectStockObject( BLACK_PEN);
OldBrush = (CBrush *)dc.SelectStockObject( NULL_BRUSH);
int OldMode = dc.SetROP2( R2_NOTXORPEN);
CRect BRect;
if( !TestFlag){
ptTL.x = ptStart.x;
ptTL.y = ptStart.y + CAPTION_HEIGHT;
ptBR.x = ptPrev.x;
ptBR.y = ptPrev.y + CAPTION_HEIGHT;
IllegalRect( &ptTL, &ptBR);
BRect.SetRect( ptTL.x, ptTL.y,
ptBR.x + ZoomRate +1, ptBR.y + ZoomRate +1);
dc.Rectangle( &BRect);
}
ptTL.x = ptStart.x;
ptTL.y = ptStart.y + CAPTION_HEIGHT;
ptBR.x = ptEnd.x;
ptBR.y = ptEnd.y + CAPTION_HEIGHT;
IllegalRect( &ptTL, &ptBR);
ptPrev = ptBR;
BRect.SetRect( ptTL.x, ptTL.y, ptBR.x + ZoomRate +1,ptBR.y+ZoomRate+1);
dc.Rectangle( &BRect);
dc.SelectObject( OldPen);
dc.SelectObject( OldBrush);
dc.SetROP2( OldMode);
}
/****************************************/
/* */
/* Initialize bitmap data */
/* */
/****************************************/
BOOL
CRefrWnd::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){
LocalUnlock( BitHandle);
LocalFree( BitHandle);
return FALSE;
}
memset( pBitmap, 0xffff, wSize);
ImageBmp.SetBitmapBits((DWORD)wSize, (const void far *)pBitmap);
LocalUnlock( BitHandle);
LocalFree( BitHandle);
RectVisible = FALSE;
this->Invalidate(FALSE);
this->UpdateWindow();
return TRUE;
}
/****************************************/
/* */
/* MESSAGE "WM_SETCURSOR" */
/* */
/****************************************/
BOOL
CRefrWnd::OnSetCursor(
CWnd* pWnd,
UINT nHitTest,
UINT message)
{
CPoint point;
CRect CaptionRect;
HCURSOR hArrowCur;
GetCursorPos( &point);
this->GetClientRect( &CaptionRect);
this->ScreenToClient( &point);
CaptionRect.top = CAPTION_HEIGHT;
if( CaptionRect.PtInRect( point))
if( MoveRect.PtInRect( point) && RectVisible)
::SetCursor((HCURSOR)ArrowCursor[ALLDIRECT]);
else ::SetCursor((HCURSOR)ToolCursor[SelectItems]);
else{
hArrowCur = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
::SetCursor( hArrowCur);
}
return TRUE;
}
/****************************************/
/* */
/* MESSAGE "WM_MDIACTIVATE" */
/* */
/****************************************/
void
CRefrWnd::OnMDIActivate(
BOOL bActivate,
CWnd* pActivateWnd,
CWnd* pDeactivateWnd)
{
if( bActivate == FALSE){
RectVisible = FALSE;
this->InvalidateRect( &MoveRect, FALSE);
this->UpdateWindow();
}
}
/****************************************/
/* */
/* MESSAGE "WM_SIZE" */
/* */
/****************************************/
void
CRefrWnd::OnSize(
UINT nType,
int cx,
int cy)
{
int NewZoomRate;
NewZoomRate = cx / BITMAP_WIDTH;
if( RectVisible && NewZoomRate > 1){
MoveRect.left = ( MoveRect.left /ZoomRate) * NewZoomRate;
MoveRect.top = ((( MoveRect.top - CAPTION_HEIGHT)
/ ZoomRate) * NewZoomRate) + CAPTION_HEIGHT;
MoveRect.right = ( MoveRect.right /ZoomRate) * NewZoomRate + 1;
MoveRect.bottom = ((( MoveRect.bottom -CAPTION_HEIGHT)
/ ZoomRate) * NewZoomRate) + CAPTION_HEIGHT + 1;
}else if( RectVisible && NewZoomRate <= 1){
RectVisible = FALSE;
}
CMDIChildWnd::OnSize(nType, cx, cy);
this->Invalidate(FALSE);
this->UpdateWindow();
}
/****************************************/
/* */
/* Select FreeForm */
/* */
/****************************************/
void
CRefrWnd::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;
}
}
}
/****************************************/
/* */
/* Draw FreeForm */
/* */
/****************************************/
void
CRefrWnd::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);
}
/****************************************/
/* */
/* Move Rectangle */
/* */
/****************************************/
void
CRefrWnd::MoveRectangle(
CPoint point)
{
CDC dc;
dc.Attach( ::GetDC( NULL));
dc.PatBlt( point.x - m_ptMouse.x, point.y - m_ptMouse.y,
MoveRect.Width(), 2, PATINVERT);
dc.PatBlt( point.x - m_ptMouse.x + MoveRect.Width(),
point.y - m_ptMouse.y, 2, MoveRect.Height(), PATINVERT);
dc.PatBlt( point.x - m_ptMouse.x, point.y - m_ptMouse.y
+ MoveRect.Height(), MoveRect.Width() + 2, 2, PATINVERT);
dc.PatBlt( point.x - m_ptMouse.x, point.y - m_ptMouse.y + 2, 2,
MoveRect.Height() - 2, PATINVERT);
::ReleaseDC( NULL, dc.Detach());
}
/****************************************/
/* */
/* COMMAND "Close Ref" */
/* */
/****************************************/
void
CRefrWnd::OnClickClose()
{
AfxGetMainWnd()->SendMessage( WM_COMMAND, ID_REFFER_CLOSE, 0);
}
/****************************************/
/* */
/* MESSAGE "WM_KEYDOWN" */
/* */
/****************************************/
void
CRefrWnd::OnKeyDown(
UINT nChar,
UINT nRepCnt,
UINT nFlags)
{
if( nChar == VK_ESCAPE){
if( RectVisible){
RectVisible = FALSE;
this->Invalidate(FALSE);
this->UpdateWindow();
}
}else CMDIChildWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}