基本信息
源码名称:VC++ 实现包含“画图”菜单,该菜单中包含“圆形”、“矩形”、“退出”菜单项(visual s 2015)
源码大小:21.03M
文件格式:.rar
开发语言:C/C++
更新时间:2018-06-25
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


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




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;
}