win32实现画图小程序

本周我们的三级项目是用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
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值