📄 cepaint.cpp
字号:
// CEPaint.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "CEPaint.h"
//#include <afxwin.h>
//////////////////////////////////////////////////////////////////////////
//Includes
#include "CEPaint.h"
#include "PtBoard.h"
#include "PtBmpFun.h"
#include "PtWinPlaceDef.h"
#include "PtCtrlBase.h"
#include "PtCtrl_Point.h"
#include "PtCtrl_Brush.h"
#include "PtCtrl_Eraser.h"
#include "PtCtrl_Zoom.h"
#include "PtCtrl_Rect.h"
#include "PtCtrl_CirRect.h"
#include "PtCtrl_Circle.h"
#include "PtCtrl_Line.h"
#include "PtCtrl_Plyon.h"
//#include "PtCtrl_Bezzer.h"
#include "PtCtrl_Frog.h"
#include "PtCtrl_GetColor.h"
#include "PtCtrl_RectRgn.h"
//#include "PtCtrl_PlyRgn.h"
#include "PtCtrl_Fill.h"
#include "PtCtrl_Text.h"
//
//////////////////////////////////////////////////////////////////////////
//Global Variables
PtAppInfo m_pt_app_info;
WNDPROC g_sel_color_proc_ptr;
TBBUTTON toolbar_bn[3] =
{
{0, IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0},
{1, IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0},
{2, IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0},
};
INT32 paint_color[PT_COLOR_COUNT] =
{
RGB(0,0,0),
RGB(0,0,255),
RGB(0,255,0),
RGB(255,0,0),
RGB(0,0,127),
RGB(0,127,0),
RGB(127,0,0),
RGB(127,127,0),
RGB(127,0,127),
RGB(0,127,127),
RGB(255,255,0),
RGB(255,0,255),
RGB(0,255,255),
RGB(255,255,127),
RGB(255,127,127),
RGB(255,255,255),
};
//
UINT cursor_table[16] =
{
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_ERASER,
IDC_CURSOR_FILL,
IDC_CURSOR_GETCOLOR,
IDC_CURSOR_ZOOM,
IDC_CURSOR_POINT,
IDC_CURSOR_POINT,
IDC_CURSOR_FROG,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
IDC_CURSOR_LINE,
};
//////////////////////////////////////////////////////////////////////////
//define
#define MAX_LOADSTRING 100
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
m_pt_app_info.m_hInst = hInstance;
m_pt_app_info.m_toolbar_hbmp = LoadBitmap(hInstance, (TCHAR*)IDB_BMP_TOOLBAR);
DialogBoxParam(hInstance,(const TCHAR*)IDD_DLG_MAIN,NULL,(DLGPROC)WndProc,0);
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int wmId, wmEvent;
PAINTSTRUCT ps;
LRESULT ret;
switch (message)
{
case WM_INITDIALOG:
m_pt_app_info.m_main_win_hwnd = hWnd;
GlobalInit();
return FALSE;
case WM_DRAWITEM:
OnDrawItem((LPDRAWITEMSTRUCT)lParam);
break;
case WM_COMMAND:
{
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
ret = OnCommand(wmId , wmEvent);
}
break;
case WM_HSCROLL:
if(m_pt_app_info.m_pt_sc_bar_x_hwnd == (HWND)lParam)
OnSrcollBoard(0,wParam);
case WM_VSCROLL:
if(m_pt_app_info.m_pt_sc_bar_y_hwnd == (HWND)lParam)
OnSrcollBoard(1,wParam);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KILLFOCUS:
m_pt_app_info.m_pt_board_flag |= PT_BOARD_FLAG_RELOAD ;
break;
case WM_SETFOCUS:
break;
case WM_MOUSEMOVE:
if(m_pt_app_info.m_PtCtrl_Table[m_pt_app_info.m_PtCtrl_Idx] != NULL)
m_pt_app_info.m_PtCtrl_Table[m_pt_app_info.m_PtCtrl_Idx]->m_mouse_state = 0 ;
break;
default:
return FALSE;
}
return TRUE;
}
// Mesage handler for the About box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rt, rt1;
int DlgWidth, DlgHeight; // dialog width and height in pixel units
int NewPosX, NewPosY;
switch (message)
{
case WM_INITDIALOG:
// trying to center the About dialog
if (GetWindowRect(hDlg, &rt1)) {
GetClientRect(GetParent(hDlg), &rt);
DlgWidth = rt1.right - rt1.left;
DlgHeight = rt1.bottom - rt1.top ;
NewPosX = (rt.right - rt.left - DlgWidth)/2;
NewPosY = (rt.bottom - rt.top - DlgHeight)/2;
// if the About box is larger than the physical screen
if (NewPosX < 0) NewPosX = 0;
if (NewPosY < 0) NewPosY = 0;
SetWindowPos(hDlg, 0, NewPosX, NewPosY,
0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
return TRUE;
case WM_COMMAND:
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
//
INT GlobalInit()
{
//dbg_out(L"GlobalInit\n");
//////////////////////////////////////////////////////////////////////////
//init window handle
//m_pt_app_info.m_toolbar_hwnd = CreateToolbarEx(m_pt_app_info.m_main_win_hwnd,WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT,IDR_MAINFRAME,3,NULL,(UINT)m_pt_app_info.m_toolbar_hbmp,toolbar_bn,3,16,14,16,14,sizeof(TBBUTTON));
m_pt_app_info.m_pt_board_hwnd = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_SC_BOARD);
m_pt_app_info.m_pt_sc_bar_x_hwnd = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_SCROLL_BAR_X);
m_pt_app_info.m_pt_sc_bar_y_hwnd = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_SCROLL_BAR_Y);
int i ;
for( i = 0 ; i < PT_CTRL_COUNT; i ++)
{
m_pt_app_info.m_pt_ctrl_bn_hwnd[i] = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_BN_PT_PLYRGN + i);
if(m_pt_app_info.m_pt_ctrl_bn_hwnd[i] != NULL)
{
m_pt_app_info.m_pt_ctrl_hbmp[i] = LoadBitmap(m_pt_app_info.m_hInst,(TCHAR*)(IDB_PT_PLYRGN + i));
//SendMessage(m_pt_app_info.m_pt_ctrl_bn_hwnd[i],BM_SETIMAGE,IMAGE_BITMAP,(LONG)m_pt_app_info.m_pt_ctrl_hbmp[i]);
}
}
for( i = 0 ; i < 3; i ++)
m_pt_app_info.m_pt_style_bn_hwnd[i] = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_BN_PT_STYLE1 + i);
m_pt_app_info.m_color_cur_bn_hwnd = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_BN_COLOR_CUR);
for( i = 0 ; i < PT_COLOR_COUNT; i ++)
{
m_pt_app_info.m_color_sel_bn_hwnd[i] = GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_BN_COLOR_SEL1 + i);
g_sel_color_proc_ptr = (PtBoard_Proc_Ptr)SetWindowLong(m_pt_app_info.m_color_sel_bn_hwnd[i],GWL_WNDPROC,(LONG)PtColor_Sel_Proc);
// WNDCLASS wcs;
// GetClassInfo(m_pt_app_info.m_hInst,L"Static",&wcs);
// //g_sel_color_proc_ptr = GetClassLong(m_pt_app_info.m_color_sel_bn_hwnd[i],GCL_STYLE);
// g_sel_color_proc_ptr = wcs.lpfnWndProc;
}
////////////////////////////////////////////////////////////////////////////
// init paint control
memset(m_pt_app_info.m_PtCtrl_Table,0,sizeof(m_pt_app_info.m_PtCtrl_Table));
InitPbCtrl_Point(&g_ptctl_point);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_POINT - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_point;
//
InitPbCtrl_Brush(&g_ptctl_brush);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_BRUSH - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_brush;
//
InitPbCtrl_Line(&g_ptctl_line);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_LINE - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_line;
//
InitPbCtrl_Rect(&g_ptctl_rect);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_RECT - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_rect;
//
InitPbCtrl_CirRect(&g_ptctl_cirrect);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_CIRRECT - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_cirrect;
//
InitPbCtrl_Circle(&g_ptctl_circle);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_CIRCLE - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_circle;
//
InitPbCtrl_Plyon(&g_ptctl_plyon);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_POLY - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_plyon;
//
// InitPbCtrl_Bezzer(&g_ptctl_bezzer);
// m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_BIZZER - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_bezzer;
//
InitPbCtrl_Eraser(&g_ptctl_eraser);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_ERASER - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_eraser;
//
InitPbCtrl_Frog(&g_ptctl_frog);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_FROG - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_frog;
//
InitPbCtrl_GetColor(&g_ptctl_getcolor);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_GETCOLOR - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_getcolor;
//
InitPbCtrl_RectRgn(&g_ptctl_rectrgn);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_RECTRGN - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_rectrgn;
//
// InitPbCtrl_PlyRgn(&g_ptctl_plyrgn);
// m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_PLYRGN - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_plyrgn;
//
InitPbCtrl_Text(&g_ptctl_text);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_TEXT - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_text;
//
InitPbCtrl_Fill(&g_ptctl_fill);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_FILL - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_fill;
InitPbCtrl_Zoom(&g_ptctl_zoom);
m_pt_app_info.m_PtCtrl_Table[IDC_BN_PT_ZOOM - IDC_BN_PT_PLYRGN] = (PtCtrlBase*)&g_ptctl_zoom;
for( i = 0 ; i < PT_CTRL_COUNT; i ++)
{
if(m_pt_app_info.m_PtCtrl_Table[i] != NULL)
m_pt_app_info.m_PtCtrl_Table[i]->PtCtrl_Init(m_pt_app_info.m_PtCtrl_Table[i]);
m_pt_app_info.m_pt_ctrl_hcursor[i] = LoadCursor(m_pt_app_info.m_hInst,(TCHAR*)cursor_table[i]);
}
//////////////////////////////////////////////////////////////////////////
//init style color
//m_pt_app_info.m_pt_style_idx = 0;
m_pt_app_info.m_color_cur = 0;
m_pt_app_info.m_color_bk_cur = RGB(255,255,255);
//////////////////////////////////////////////////////////////////////////
//init file
m_pt_app_info.m_bmp_bits_ptr = gBmp_Bits;
BOOLEAN load_file_flag = FALSE;
INT slen = wcslen(GetCommandLine());
TCHAR* sp = GetCommandLine();
while (*sp != L' ' && *sp ) sp ++ ;
if(1)//*sp == L' ')
{
load_file_flag = TRUE;
//wcsncpy(m_pt_app_info.m_file_name,sp + 1 , sp - GetCommandLine());
wcscpy(m_pt_app_info.m_file_name,L"ASUKA.BMP");
}
else
memset(m_pt_app_info.m_file_name,0,sizeof(m_pt_app_info.m_file_name));
//wcscpy(m_pt_app_info.m_file_name,L"ASUKA.BMP");
if(load_file_flag)
{
INT ret = LoadBmpFromFile(m_pt_app_info.m_file_name);
if(ret)
{
wsprintf(m_pt_app_info.m_file_name, L"File Error! Code = %d",ret);
MessageBox(m_pt_app_info.m_main_win_hwnd,m_pt_app_info.m_file_name,0,0);
memset(m_pt_app_info.m_file_name,0,sizeof(m_pt_app_info.m_file_name));
load_file_flag = FALSE;
}
}
if(!load_file_flag)
CreateDefBmpHeader();
//////////////////////////////////////////////////////////////////////////
//init paint board
//UpdateWindowPlace();
SetWindowPlace();
InitPtBoard();
AdjustScrollBar();
//////////////////////////////////////////////////////////////////////////
//setdefalut
m_pt_app_info.m_PtCtrl_Idx = IDC_BN_PT_POINT - IDC_BN_PT_PLYRGN;
m_pt_app_info.m_PtCtrl_Idx_Prev = IDC_BN_PT_POINT - IDC_BN_PT_PLYRGN;
// m_pt_app_info.m_PtCtrl_Idx = IDC_BN_PT_ZOOM - IDC_BN_PT_PLYRGN;
// m_pt_app_info.m_PtCtrl_Idx_Prev = IDC_BN_PT_ZOOM - IDC_BN_PT_PLYRGN;
if(m_pt_app_info.m_PtCtrl_Table[m_pt_app_info.m_PtCtrl_Idx] != NULL)
m_pt_app_info.m_PtCtrl_Table[m_pt_app_info.m_PtCtrl_Idx]->PtCtrl_OnPaintStart(m_pt_app_info.m_PtCtrl_Table[m_pt_app_info.m_PtCtrl_Idx]);
return 0;
}
INT OnDrawItem(LPDRAWITEMSTRUCT lp)
{
LPDRAWITEMSTRUCT pdis = lp;
HBRUSH hbrush = NULL;
HPEN hpen = NULL;
HDC thdc;
switch(pdis->CtlID)
{
case IDC_BN_PT_PLYRGN:
case IDC_BN_PT_RECTRGN :
case IDC_BN_PT_ERASER:
case IDC_BN_PT_FILL:
case IDC_BN_PT_GETCOLOR:
case IDC_BN_PT_ZOOM:
case IDC_BN_PT_POINT:
case IDC_BN_PT_BRUSH:
case IDC_BN_PT_FROG:
case IDC_BN_PT_TEXT:
case IDC_BN_PT_LINE:
case IDC_BN_PT_BIZZER:
case IDC_BN_PT_RECT:
case IDC_BN_PT_POLY:
case IDC_BN_PT_CIRCLE:
case IDC_BN_PT_CIRRECT:
hbrush = CreatePatternBrush(m_pt_app_info.m_pt_ctrl_hbmp[pdis->CtlID - IDC_BN_PT_PLYRGN]);
thdc = CreateCompatibleDC(pdis->hDC);
SelectObject(thdc,m_pt_app_info.m_pt_ctrl_hbmp[pdis->CtlID - IDC_BN_PT_PLYRGN]);
SelectObject(thdc,hbrush);
PatBlt(thdc,0,0,14,14,PATCOPY);
if(m_pt_app_info.m_pt_ctrl_bn_hwnd[m_pt_app_info.m_PtCtrl_Idx] == pdis->hwndItem)
FillRect(pdis->hDC,&(pdis->rcItem),(HBRUSH)GetStockObject(LTGRAY_BRUSH));
else
FillRect(pdis->hDC,&(pdis->rcItem),(HBRUSH)GetStockObject(GRAY_BRUSH));
StretchBlt(pdis->hDC,2,2,pdis->rcItem.right - 1, pdis->rcItem.bottom - 1,thdc,0,0,14,14,SRCAND);
DeleteObject(hbrush);
DeleteDC(thdc);
break;
case IDC_BN_COLOR_CUR:
hbrush = CreateSolidBrush(m_pt_app_info.m_color_bk_cur);
hpen = CreatePen(PS_SOLID,2,RGB(127,127,127));
SelectObject(pdis->hDC,hbrush);
SelectObject(pdis->hDC,hpen);
Rectangle(pdis->hDC,
pdis->rcItem.left + (pdis->rcItem.right >> 2),pdis->rcItem.top + (pdis->rcItem.bottom >> 2),
pdis->rcItem.right,pdis->rcItem.bottom);
DeleteObject(hbrush);
hbrush = CreateSolidBrush(m_pt_app_info.m_color_cur);
SelectObject(pdis->hDC,hbrush);
Rectangle(pdis->hDC,
pdis->rcItem.left,pdis->rcItem.top,
pdis->rcItem.right - (pdis->rcItem.right >> 2),pdis->rcItem.bottom - (pdis->rcItem.bottom >> 2));
SelectObject(pdis->hDC,GetStockObject(WHITE_BRUSH));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -