在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例常规C/C++编程 → VC++ 实现包含“画图”菜单,该菜单中包含“圆形”、“矩形”、“退出”菜单项(visual s 2015)

VC++ 实现包含“画图”菜单,该菜单中包含“圆形”、“矩形”、“退出”菜单项(visual s 2015)

常规C/C++编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:21.03M
  • 下载次数:79
  • 浏览次数:1313
  • 发布时间:2018-06-25
  • 实例类别:常规C/C++编程
  • 发 布 人:yeziyue
  • 文件格式:.rar
  • 所需积分:2

实例介绍

【实例简介】


编写一个程序,包含“画图”菜单,该菜单中包含“圆形”、“矩形”、“退出”菜单项。单击“圆形”菜单项时,系统在“画图”菜单后建立一个动态菜单“圆形”,“圆形”菜单中包括“绘制图形”、“移动图形”、“放大”、“缩小”、“重绘”等菜单项。当单击“矩形”菜单项时,系统调出一个定制好的“矩形”菜单,加在“画图”菜单后面。“矩形”菜单中包含“绘制图形”、“移动图形”、“放大”、“缩小”、“重绘”等菜单项。当单击“绘制图形”时,利用“右箭头”键可以将图形长度增大;单击“左箭头”键时,可以将图形长度减小;单击“下箭头”键,可以将图形的高度增大;单击“上箭头”键,可以将图形的高度减小。当选择“移动图形”时,单击箭头键,可以将图形向相应的方向移动。单击“放大”、“缩小”菜单项时,可将图形放大或缩小。单击“重绘”菜单项时,重新开始绘制图形。


【实例截图】

from clipboardfrom clipboard



【核心代码】

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,
WPARAM wParam, LPARAM lParam)
{
HMENU hMenu1, hMenu2; //定义菜单句柄
HDC hDC; //定义设备环境句柄
static BOOL bCircle = FALSE, bRect = FALSE; //设置绘制圆和矩形的标志变量
static BOOL bMove = FALSE; //设置移动标志
PAINTSTRUCT ps; //定义绘图结构体变量
RECT clientRect;
GetClientRect(hWnd, &clientRect);
switch (iMessage)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_CIRCLE: //单击圆形菜单
hMenu1 = GetMenu(hWnd); //得到菜单句柄
CheckMenuItem(hMenu1, IDM_CIRCLE, MF_CHECKED); //设置选中标志
CheckMenuItem(hMenu1, IDM_RECTANGLE, MF_UNCHECKED);//删除标志
DeleteMenu(hMenu1, 1, MF_BYPOSITION); //删除“矩形”弹出菜单
hMenu2 = CreateMenu(); //动态创建菜单
//添加菜单项
AppendMenu(hMenu2, MF_ENABLED, IDM_DRAWCIRCLE, L"绘制圆形(&d)");
AppendMenu(hMenu2, MF_ENABLED, IDM_MOVECIRCLE, L"移动圆形(&m)");
AppendMenu(hMenu2, MF_ENABLED, IDM_ZOOMIN, L"放大(&i)");
AppendMenu(hMenu2, MF_ENABLED, IDM_ZOOMOUT, L"缩小(&o)");
AppendMenu(hMenu2, MF_ENABLED, IDM_REDRAW, L"重绘(&r)");
//插入菜单。
InsertMenu(hMenu1, 1, MF_POPUP | MF_BYPOSITION, (UINT)hMenu2, L"圆形(&c)");
DrawMenuBar(hWndMain); //刷新菜单
bCircle = FALSE; //绘圆标志为假
bRect = FALSE; //绘矩形标志为假
bMove = FALSE; //移动标志为假
rect1.left = (clientRect.left clientRect.right) / 2 - 5; //恢复矩形的初始状态
rect1.right = (clientRect.left clientRect.right) / 2 5;
rect1.top = (clientRect.top clientRect.bottom) / 2 - 5;
rect1.bottom = (clientRect.top clientRect.bottom) / 2 5;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
break;
case IDM_RECTANGLE: //单击矩形菜单
hMenu1 = GetMenu(hWnd); //得到菜单句柄
CheckMenuItem(hMenu1, IDM_CIRCLE, MF_UNCHECKED); //删除选中标志
CheckMenuItem(hMenu1, IDM_RECTANGLE, MF_CHECKED); //设置选中标志
DeleteMenu(hMenu1, 1, MF_BYPOSITION); //删除“圆形”弹出菜单
hMenu2 = LoadMenu(hInst, L"MENURECT"); //得到菜单句柄
//插入菜单
InsertMenu(hMenu1, 1, MF_POPUP | MF_BYPOSITION, (UINT)hMenu2, L"矩形(&r)");
DrawMenuBar(hWndMain); //刷新菜单
bCircle = FALSE; //绘圆标志为假
bRect = FALSE; //绘矩形标志为假
bMove = FALSE; //移动标志为假
rect1.left = (clientRect.left clientRect.right) / 2 - 5; //恢复矩形的初始状态
rect1.right = (clientRect.left clientRect.right) / 2 5;
rect1.top = (clientRect.top clientRect.bottom) / 2 - 5;
rect1.bottom = (clientRect.top clientRect.bottom) / 2 5;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
break;
case IDM_EXIT:
SendMessage(hWnd, WM_DESTROY, 0, 0); //发出关闭窗口信息
break;


case IDM_DRAWCIRCLE: //绘制圆形
bCircle = TRUE; //绘圆标志为真
bRect = FALSE; //绘矩形标志为假
bMove = FALSE; //移动标志为假
InvalidateRect(hWnd, NULL, TRUE);
break;
case IDM_DRAWRECT: //绘制矩形
bCircle = FALSE; //绘圆标志为假
bRect = TRUE; //绘矩形标志为真
bMove = FALSE; //移动标志为假
InvalidateRect(hWnd, NULL, TRUE);
break;
case IDM_MOVECIRCLE: //移动圆形
bMove = TRUE; //移动标志为真
break;
case IDM_MOVERECT: //移动矩形
bMove = TRUE; //移动标志为真
break;
case IDM_ZOOMIN: //放大
if (bCircle == TRUE || bRect == TRUE)
{
int nLength, nWidth;
nLength = abs(rect1.right - rect1.left); //计算长度
nWidth = abs(rect1.top - rect1.bottom); //计算宽度
//放大
rect1.left = (int)(rect1.left - nWidth / 1.2 / 2);
rect1.right = (int)(rect1.right nWidth / 1.2 / 2);
rect1.top = (int)(rect1.top - nWidth / 1.2 / 2);
rect1.bottom = (int)(rect1.bottom nWidth / 1.2 / 2);
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
break;
case IDM_ZOOMOUT: //缩小
if (bCircle == TRUE || bRect == TRUE)
{
int nLength, nWidth;
nLength = abs(rect1.right - rect1.left); //计算长度
nWidth = abs(rect1.top - rect1.bottom); //计算宽度
//缩小
rect1.left = (int)(rect1.left nWidth / 1.2/2);
rect1.right = (int)(rect1.right - nWidth / 1.2 / 2);
rect1.top = (int)(rect1.top nWidth / 1.2 / 2);
rect1.bottom = (int)(rect1.bottom - nWidth / 1.2 / 2);
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
break;
case IDM_REDRAW: //重新绘图
bMove = FALSE; //移动标志为假
rect1.left = (clientRect.left clientRect.right) / 2 - 5; //恢复矩形的初始状态
rect1.right = (clientRect.left clientRect.right) / 2 5;
rect1.top = (clientRect.top clientRect.bottom) / 2 - 5;
rect1.bottom = (clientRect.top clientRect.bottom) / 2 5;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
break;
}
break;
case WM_KEYDOWN:
if (bMove == TRUE)
{
if (wParam == VK_LEFT)
{ //按left键,向左移动
rect1.left -= 10;
rect1.right -= 10;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_RIGHT)
{ //按right键,向右移动
rect1.left = 10;
rect1.right = 10;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_UP)
{ //按up键时,向上移动
rect1.top -= 10;
rect1.bottom -= 10;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_DOWN)
{ //按down键,向下移动
rect1.top = 10;
rect1.bottom = 10;
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
}
else if (bCircle == TRUE || bRect == TRUE)
{
if (wParam == VK_RIGHT)
{
rect1.right = 10; //按下右箭头时矩形框长度加10
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_DOWN)
{
rect1.bottom = 10; //按下下箭头矩形框高度加10
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_UP)
{
rect1.bottom -= 10; //按下上箭头矩形框高度-10
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
else if (wParam == VK_LEFT)
{
rect1.right -= 10; //按下左箭头矩形框高度-10
InvalidateRect(hWnd, NULL, TRUE); //发出刷新信息
}
}
break;
case WM_PAINT:
HBRUSH hbr;
hDC = BeginPaint(hWnd, &ps);
if (bCircle == TRUE)
{
hbr = CreateSolidBrush(RGB(255, 127, 80));
SelectObject(hDC, hbr); //绘制圆形
Ellipse(hDC, rect1.left, rect1.top, rect1.right, rect1.bottom);
}
if (bRect == TRUE)
{
hbr = CreateSolidBrush(RGB(1705, 127, 80));
SelectObject(hDC, hbr); //绘制矩形
Rectangle(hDC, rect1.left, rect1.top, rect1.right, rect1.bottom);
}
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //处理退出窗口信息
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
return 0;
}

实例下载地址

VC++ 实现包含“画图”菜单,该菜单中包含“圆形”、“矩形”、“退出”菜单项(visual s 2015)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 元懿寒 发表于: 2020-06-16 18:44 30
里面没有源码文件,也运行不了

支持(0) 盖楼(回复)

第 2 楼 元懿寒 发表于: 2020-06-16 18:46 29
里面没有源码文件,也运行不了

元懿寒 2020-06-16 18:44 30

不好意思,打开错文件了

支持(0) 盖楼(回复)

第 3 楼 西雅 发表于: 2020-07-03 16:21 00
我使用VC++6.0 运行出现错误 fatal error C1083: Cannot open include file: 'SDKDDKVer.h': No such file or directory 初学这个,百度了错误,不太会修改

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有3条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警