本周我们的三级项目是用win32完成一个画图软件。今天我们也进行一个总结。如果大家觉得下面表述不清,想直接看代码,可以到我的资源页下载源代码:http://download.csdn.net/download/mr_zhaoz/9849315。
该画图软件要求实现功能:颜色选择、工具选择、画笔宽度设置、画图进行保存和打开文件、调色板的停靠、工具栏和调色板的显示和隐藏
功能演示截图如下:
颜色选择
工具选择
画笔宽度设置
画图进行保存和打开文件
调色板的隐藏和显示
工具栏和调色板的停靠
创建了三个窗口,一个是主窗口,完成画板的主要操作;一个是调色板子窗口,用来进行画图颜色的选择和将选择颜色传给主窗口,完成颜色选择操作;另一个是工具栏窗口,用来进行画图工具的选择和将选择工具传给主窗口,完成工具选择操作。
方法一:在画图的同时,将参数存入列表中,重绘、保存、打开文件和清除窗口,都通过对这个列表进行调用来实现。
方法二:在画图时,将参数存入数组中,具体操作与方法一类似。
以下代码中,我两种方法都进行了编辑,但未区分,且方法二只完成了重绘、文件的相关操作未进行编写,还请读者注意。
主窗口的回调函数:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static TCHAR szFullFileName[300],szFileName[300];
static HWND hWndcolorbox,hWndtoolbox;
static COLORREF color,col[10];
static DRAWSTRU ds;
static PDRAWFUN pMouseDown,pMouseMove,pMouseUp;
static POINT ptstart,ptend;
static POINT pts[10],pte[10];
static int shapeindex=0;
static int iPenWidth=2;
static HMENU hMenu;
static bool bMouseDown=FALSE;
static bool colorboxdock=false;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_FILE_NEW:
_tcscpy_s(szFullFileName,TEXT(""));
case IDM_EDIT_CLEAR:
ClearGraphic(ds.g);
InvalidateRect(hWnd,NULL,TRUE);
break;
case IDM_FILE_OPEN:
ClearGraphic(ds.g);
if(!PopFileOpenDlg(hWnd,szFullFileName,szFileName))
break;
OpenGraphic(szFullFileName,ds.g);
InvalidateRect(hWnd,NULL,TRUE);
break;
case IDM_FILE_SAVE:
if(_tcslen(szFullFileName)==0)
{
if (!PopFileSaveDlg(hWnd,szFullFileName,szFileName))
break;
}
SaveGraphic(szFullFileName,ds.g);
break;
case IDM_FILE_SAVEAS:
if (!PopFileSaveDlg(hWnd,szFullFileName,szFileName))
break;
SaveGraphic(szFullFileName,ds.g);
break;
case IDM_EDIT_PENWIDTH:
if(DialogBoxParam(hInst, (LPCTSTR)IDD_PENWIDTH,hWnd,(DLGPROC)PenWidth,(LPARAM)&iPenWidth)==IDOK)
{
SendMessage(hWnd,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);
}
break;
case IDM_VIEW_COLORBOXDOCK:
if(colorboxdock)
{
colorboxdock=false;
ShowWindow(hWndcolorbox,SW_HIDE);
hWndcolorbox=CreateWindow(szColorBtnClass,L"11",WS_CHILD|WS_BORDER|WS_VISIBLE,0,0,280,40,hWnd,NULL,hInst,(LPVOID)RGB(0,0,0));
CheckMenuItem(hMenu,IDM_VIEW_COLORBOXDOCK,MF_BYCOMMAND|MF_CHECKED);
}
else
{
colorboxdock=true;
ShowWindow(hWndcolorbox,SW_HIDE);
hWndcolorbox=CreateWindow(szColorBtnClass,L"11",(WS_POPUP |WS_CAPTION|WS_SYSMENU|WS_VISIBLE),0,0,330,90,hWnd,NULL,hInst,(LPVOID)RGB(0,0,0) CheckMenuItem(hMenu,IDM_VIEW_COLORBOXDOCK,MF_BYCOMMAND|MF_UNCHECKED);
}
break;
case IDM_VIEW_COLORBOXHIDE:
//ShowWindow(hWndcolorbox,SW_HIDE);
{
if(IsWindowVisible(hWndcolorbox))
{
ShowWindow(hWndcolorbox,SW_HIDE);
CheckMenuItem(hMenu,IDM_VIEW_COLORBOXHIDE,MF_BYCOMMAND|MF_CHECKED);
}
else
{
ShowWindow(hWndcolorbox,SW_SHOWNORMAL);
CheckMenuItem(hMenu,IDM_VIEW_COLORBOXHIDE,MF_BYCOMMAND|MF_UNCHECKED);
}
}
break;
case IDM_VIEW_TOOLHIDE:
if(IsWindowVisible(hWndtoolbox))
{
ShowWindow(hWndtoolbox,SW_HIDE);
CheckMenuItem(hMenu,IDM_VIEW_TOOLHIDE,MF_BYCOMMAND|MF_CHECKED);
}
else
{
ShowWindow(hWndtoolbox,SW_SHOWNORMAL);
CheckMenuItem(hMenu,IDM_VIEW_TOOLHIDE,MF_BYCOMMAND|MF_UNCHECKED);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
{
hWndtoolbox=CreateWindow(szShapeBtnClass,L"工具栏",(WS_POPUP |WS_CAPTION | WS_SYSMENU|WS_VISIBLE),500,100,72,122,hWnd,NULL,hInst,NULL);
hWndcolorbox=CreateWindow(szColorBtnClass,L"11",WS_CHILD|WS_BORDER|WS_VISIBLE,0,0,280,40,hWnd,NULL,hInst,(LPVOID)RGB(0,0,0));
hMenu=GetMenu(hWnd);
pMouseDown=PenMouseDown;
pMouseUp=PenMouseUp;
pMouseMove=PenMouseMove;
PopFileInitialize(hWnd);
ds.color=RGB(255,0,0);
ds.bFill=false;
ds.iPenWidth =2;
ds.hBr=CreateSolidBrush(ds.color);
ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color);
CheckMenuItem(hMenu,IDM_VIEW_COLORBOXDOCK,MF_BYCOMMAND|MF_CHECKED);
}
break;
case WM_HIDECOLORBOX:
CheckMenuItem(hMenu,IDM_VIEW_COLORBOXHIDE,MF_BYCOMMAND|MF_UNCHECKED);
break;
case WM_LBUTTONDOWN:
{
pMouseDown(&ds,hWnd,wParam,lParam);
}
break;
case WM_MOUSEMOVE:
{
pMouseMove(&ds,hWnd,wParam,lParam);
}
break;
case WM_LBUTTONUP:
{
pMouseUp(&ds,hWnd,wParam,lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
DrawGraphics(hdc,ds.g);(列表重绘)
//for (int i = 0; i <= iShNum; i++)
//{
// HPEN pen=CreatePen(PS_SOLID,ds.iPenWidth,SHAPESTR[i].color);
// SelectObject(hdc,pen);
// SHAPESTR[i].hBr=Crea