功能设计如下:

1.Graphics菜单中可选择图形,支持Rectangle, Circle, Line,选择对应图形,则相应菜单项前面加上选中标志;
2.Options菜单中包含以下选项
  a.Color,设置颜色,选中此项,则弹出如下图所示对话框

  进入对话框时,默认值为当前颜色,单击"确定"后,则以选中颜色为当前前景色和填充色进行图形绘制
  
  b.Width 设置线条的宽度,选中此项则弹出如下对话框


进入对话框时,默认值为当前所使用的宽度值,单击"确定"按钮后,则以设定的值为当前宽度值进行图形绘制,宽度值范围1-10(注意:每次打开此对话框,显示当前正在使用的宽度值)

c.Fill和Opaque,设置填充的方式,Fill表示填充,Opaque表示透明,此两项为二选一,选中后,相应项目前面加上选中标志

3.绘制操作,单击鼠标左键,保持左键按下,移动鼠标,则在两点按下左键坐标点和当前鼠标坐标点间绘制出相应选中的图形。
4.Operation菜单
  a.Reverse菜单项(快捷键Ctrl + R),执行将图形沿水平方向翻转180度
  b.Reset菜单项(快捷键Ctrl + S),将图形从翻转状态恢复到正常状态

5.右键快捷菜单与4中a,b相同

程序源代码:

// exam.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include "resource.h"
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <commdlg.h>
#include <commctrl.h>#define MAX_LOADSTRING 100// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                              // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                // The title bar textCHOOSECOLOR  chc;
bool IsDraw=false;
bool IsReverse=false;
int g_iCount=0;RECT rect1;
int Graphics=0;
COLORREF clref[16]={0x00ff0000};
bool IsFill=false;
int iWidth=0;struct DATASTORE      //图形数据存储结构
{RECT rect1;            //起点,终点int Graphics;        //图形形状COLORREF pColor;      //画笔颜色bool IsFill;          //画笔风格int iWidth;           //画笔宽度//int bColor;         //画刷颜色
};struct DATASTORE DataStore[1000]; // Foward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    Width(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{// TODO: Place code here.MSG msg;HACCEL hAccelTable;// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_EXAM, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_EXAM);// Main message loop:while (GetMessage(&msg, NULL, 0, 0)) {if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;
}//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style          = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra     = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = LoadIcon(hInstance, (LPCTSTR)IDI_EXAM);wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = (LPCSTR)IDC_EXAM;wcex.lpszClassName  = szWindowClass;wcex.hIconSm       = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);
}//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HWND hWnd;hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{int wmId, wmEvent;PAINTSTRUCT ps;HDC hDC;HBRUSH hBrush;HPEN hPen;HMENU hMenu;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);WORD x,y;x = LOWORD(lParam);     //得到鼠标的位置.y = HIWORD(lParam);hMenu=GetMenu(hWnd);switch (message) {case WM_CREATE:            //选择颜色通用对话框chc.lStructSize = sizeof(CHOOSECOLOR);      //结构大小chc.hwndOwner = hWnd;                        //父窗口句柄chc.rgbResult = 0;                          //设定默认颜色chc.lpCustColors = clref;                  //指向用户自定义颜色数组的指针chc.Flags = 0;                             //标志chc.lCustData = 0;                         chc.lpfnHook = NULL;                       //钩子函数指针.同对话框处理函数功能一样chc.lpTemplateName = NULL;break;case WM_COMMAND:wmId    = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections:switch (wmId){case IDM_RECTANGLE:CheckMenuItem(hMenu,IDM_RECTANGLE,MF_CHECKED);CheckMenuItem(hMenu,IDM_CIRCLE,MF_UNCHECKED);CheckMenuItem(hMenu,IDM_LINE,MF_UNCHECKED);Graphics=2;break;case IDM_CIRCLE:CheckMenuItem(hMenu,IDM_CIRCLE,MF_CHECKED);CheckMenuItem(hMenu,IDM_RECTANGLE,MF_UNCHECKED);CheckMenuItem(hMenu,IDM_LINE,MF_UNCHECKED);Graphics=1;break;case IDM_LINE:CheckMenuItem(hMenu,IDM_LINE,MF_CHECKED);CheckMenuItem(hMenu,IDM_RECTANGLE,MF_UNCHECKED);CheckMenuItem(hMenu,IDM_CIRCLE,MF_UNCHECKED);Graphics=0;break;case IDM_COLOR:ChooseColor(&chc);break;case IDM_WIDTH:DialogBox(hInst, (LPCTSTR)IDD_WIDTH, hWnd, (DLGPROC)Width);break;case IDM_FILL:CheckMenuItem(hMenu,IDM_FILL,MF_CHECKED);CheckMenuItem(hMenu,IDM_OPAQUE,MF_UNCHECKED);IsFill=true;break;case IDM_OPAQUE:CheckMenuItem(hMenu,IDM_OPAQUE,MF_CHECKED);CheckMenuItem(hMenu,IDM_FILL,MF_UNCHECKED);IsFill=false;break;case IDM_REVERSE:IsReverse=true;InvalidateRect(hWnd,NULL,TRUE);break;case IDM_RESET:IsReverse=false;InvalidateRect(hWnd,NULL,TRUE);break;case IDM_ABOUT:DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_LBUTTONDOWN:IsDraw=true;rect1.left = x;          rect1.top = y;//MoveToEx(hDC,rect1.left = x,rect1.top = y,NULL);break;case WM_LBUTTONUP:DataStore[g_iCount].rect1 = rect1;//DataStore[g_iCount].ptEnd = ptEnd;DataStore[g_iCount].Graphics = Graphics;DataStore[g_iCount].pColor = chc.rgbResult;DataStore[g_iCount].IsFill = IsFill;DataStore[g_iCount].iWidth = iWidth;//DataStore[g_iCount].bColor = bSelection;g_iCount++;IsDraw=false;break;case WM_MOUSEMOVE:            rect1.right = x;       rect1.bottom = y;if(IsDraw==true){InvalidateRect(hWnd,NULL,TRUE);    //发出重绘信息.UpdateWindow(hWnd);}break;case WM_RBUTTONDOWN:POINT point;point.x=LOWORD(lParam);point.y=HIWORD(lParam);ClientToScreen(hWnd,&point);TrackPopupMenu(GetSubMenu(hMenu,3),TPM_LEFTALIGN,point.x,point.y,0,hWnd,NULL);break;case WM_PAINT:hDC = BeginPaint(hWnd, &ps);RECT rt;GetClientRect(hWnd, &rt);SetMapMode(hDC,MM_ANISOTROPIC);SetViewportOrgEx(hDC,(rt.left+rt.right)/2,(rt.bottom+rt.right)/2,NULL);  SetViewportOrgEx(hDC,0,0,NULL); int i;for(i = 0; i <g_iCount; i++){if(IsReverse==true){SetViewportExtEx(hDC,1,-1,0);SetViewportOrgEx(hDC,0,rt.bottom-rt.top ,NULL);}else{SetViewportExtEx(hDC,1,1,0);SetViewportOrgEx(hDC,0,0,NULL);}hPen=CreatePen(PS_SOLID,DataStore[i].iWidth,DataStore[i].pColor );if(DataStore[i].IsFill==true){hBrush=CreateSolidBrush(DataStore[i].pColor);}else{hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);}SelectObject(hDC,hBrush);SelectObject(hDC,hPen);if(DataStore[i].Graphics==0){MoveToEx(hDC,DataStore[i].rect1.left,DataStore[i].rect1.top,NULL);LineTo(hDC,DataStore[i].rect1.right,DataStore[i].rect1.bottom);}if(DataStore[i].Graphics==1){   Ellipse(hDC,DataStore[i].rect1.left,DataStore[i].rect1.top,DataStore[i].rect1.right,DataStore[i].rect1.bottom);}if(DataStore[i].Graphics==2){ Rectangle(hDC,DataStore[i].rect1.left,DataStore[i].rect1.top,DataStore[i].rect1.right,DataStore[i].rect1.bottom);}DeleteObject(hPen);DeleteObject(hBrush);}hPen=CreatePen(PS_SOLID,iWidth,chc.rgbResult);if(IsFill==true){hBrush=CreateSolidBrush(chc.rgbResult);}else{hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);}SelectObject(hDC,hBrush);SelectObject(hDC,hPen);// TODO: Add any drawing code here...//DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);if (IsDraw==true){if(Graphics==0){MoveToEx(hDC,rect1.left,rect1.top,NULL);LineTo(hDC,rect1.right,rect1.bottom);}if(Graphics==1){    Ellipse(hDC,rect1.left,rect1.top,rect1.right,rect1.bottom);}if(Graphics==2){  Rectangle(hDC,rect1.left,rect1.top,rect1.right,rect1.bottom);}}DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;
}
LRESULT CALLBACK Width(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{HWND   hWndSlider=GetDlgItem(hDlg, IDC_SLIDER);switch (message){case WM_INITDIALOG:SendMessage(hWndSlider, TBM_SETTICFREQ , 1, 0);SendMessage(hWndSlider, TBM_SETRANGE, 1, MAKELONG(1,10));return TRUE;case WM_SHOWWINDOW:SendMessageW(hWndSlider,TBM_SETPOS, 1,iWidth);//设置slider控件break;case WM_COMMAND:if (LOWORD(wParam) == IDOK) {iWidth= SendMessageW(hWndSlider, TBM_GETPOS, 0, 0);EndDialog(hDlg, LOWORD(wParam));return TRUE;}if (LOWORD(wParam) == IDCANCEL) {EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;
}

  

转载于:https://www.cnblogs.com/leftshine/p/5698688.html

基于win32的windows画板程序相关推荐

  1. 程序员的内涵之基于SDK的Windows应用程序框架代码详解

    基于SDK的Windows应用程序框架代码需要注意以下几个方面: 1.必须包含头文件windows.h WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含 ...

  2. 基于Win32框架的OpenGL程序

    本示例提供一个稳定的基于Win32的OpenGL程序框架结构,开发工具是Visual Studio 2010,编程之前应该确保OpenGL所使用的库函数都已被正确配置: 第一步,安装GLUT工具包: ...

  3. html5画图程序,基于HTML5的Windows画图程序

    Windows 画图程序一直伴随着 Windows 各个版本,这个很简单,几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦.HTML5 的 Canvas 对象使在线绘图成为可能,虽然 HTM ...

  4. 转 CanvasPaint—基于HTML5的Windows画板

    Windows 画图程序一直伴随着 Windows 各个版本,它"其貌不扬",几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦.HTML5 的 Canvas 对象使在线绘 ...

  5. VS2010 win32项目windows窗体程序 向导生成代码解析

    目录: 1.Win32项目的windows窗体程序的向导生成了如下代码 2.手工生成代码如下 3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务 1.Win32项目的window ...

  6. 基于DirectUI搭建Windows窗体程序

    使用DirectUI需要directuiCom.dll,包含IDirectUI.h和DirectuiDef.h.在你的应用程序中初始化CLSID_DirectUI,并获取IDirectUI(IID_I ...

  7. 自强不息系列之基于SDK的Windows应用程序框架代码详解

    1.必须包含头文件windows.h WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件.这些头文件中最重要的和最基本的是: WINDEF.H ...

  8. 基于.net之仿Windows画板设计

    基于.net之仿Windows画板设计 队 长:周 洋 小组成员:周寅莹 袁晓旭 江春鹏 蒋彬含 朱振宇 屈生辉 万里骏 彭子航 指导老师:余敦辉 所在班级:湖北大学计算机科学与技术2016级 摘要: ...

  9. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 参考文章: (1)C#/.NET基于Topshelf创建Windows ...

最新文章

  1. linux 正则 设置密码复杂度,Ubuntu修改密码及密码复杂度策略设置方法
  2. gram矩阵的性质_线性代数(十五)标准正交基(Orthonormal Bases)和Gram-Schmidt正交化...
  3. MySQL主从复制-双主结构
  4. 弱电工程数据中心计算机房内布线
  5. selenium截图模糊_Selenium截屏 图片未加载的问题解决--【懒加载】
  6. RMAN 的备份保留策略
  7. Listener监听器与Filter过滤器
  8. java虚拟机参数详解
  9. 美国只有两样东西比中国贵
  10. 零基础带你学习MySQL—加密函数和系统函数(十六)
  11. ROS-cmakelists的解释
  12. Pytorch报错解决:The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimensio
  13. 怎么识别伪装IP的网络攻击
  14. 看完这个,你还觉得SOME/IP测试难吗?
  15. docker安装步骤
  16. 多元正态分布的性质和定理
  17. .NET5.0 初始
  18. 【Unity】获取免费可商用的中文像素字体
  19. RAC+DG搭建过程
  20. struts2的通配符用法

热门文章

  1. CheckBox控件和数据库的关联
  2. pcl中ransac提取直线_多目标跟踪中的相机运动模型
  3. java 计时器归零_java - 如何每15秒运行一次计时器并取消并重新启动
  4. 生成jacoco报告_jacoco生成的覆盖率文件
  5. 支付宝服务商子商户_怎么成为支付宝刷脸支付服务商?
  6. php 通讯协议,通讯协议作用
  7. redis 高可用切换_Redis高可用架构演进
  8. python解析库详解_PyQuery库详解
  9. python读取日志错误信息_使用Python将Exception异常错误堆栈信息写入日志文件
  10. 计算机安装应用程序卸的步骤,电脑软件怎么卸载,干货在这里,如何卸载电脑上安装的软件...