《可视化编程技术》实验报告实验五

更新时间:2024-06-11 07:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验报告 实验一

《可视化编程技术》实验报告

—— 实验五

一、实验目的和要求

1.了解资源的的概念;

2.熟练掌握菜单资源的创建过程;

3.掌握加速键资源、光标资源、图标资源的创建过程; 二、实验内容 :

问题描述:

在保持实验四程序功能的基础上进行简单扩充。首先,分别取自己姓名中的一个字作为应用程序的图标和光标。其次,为窗口添加主菜单,主菜单上只有一个弹出式菜单“Move(Alt+M为热键)”,下面分别有四个菜单项Up(Ctrl+U为热键,shift+U为加速键)、Down(Ctrl+D为热键,shift+D为加速键)、Left(Ctrl+L为热键,shift+L为加速键)、Right(Ctrl+R为热键,shift+R为加速键),分别实现键上四个方向键所对应的相同功能。所不同的是,当通过菜单的操作将绘制图形移动至窗口边界时,不再弹出提示消息框,而是使相应的菜单项变为灰色,当可再次向窗口边界移动时,相应菜单项变为激活状态。

窗口标题栏写明姓名和学号。

三、程序代码

#include #include #include

实验报告 实验一

#include \

long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam,

LONG lParam);

//消息处理函数声明.

//初始化窗口类声明

BOOL InitWindowsClass(HINSTANCE hInstance);

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow);//初始化窗口声明.

HWND hWndMain; //定义全局窗口句柄. RECT rect1; //定义矩形结构体.记录了图形的信息. RECT ClientRect;

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

//主函数

{

MSG Message;

if(!InitWindowsClass(hInstance)) return FALSE;

//初始化窗口类.

if(!InitWindows(hInstance,nCmdShow)) //初始化窗口. return FALSE;

while(GetMessage(&Message,0,0,0)) {

TranslateMessage(&Message); DispatchMessage(&Message);

//消息循环.

}

return Message.wParam;

}

long WINAPI WndProc(HWND hWnd,

UINT iMessage, UINT wParam, LONG lParam)

//消息处理函数.

{

HMENU hMenu;

HDC hDC; //定义设备环境句柄. HBRUSH hB1,hB2;

WORD x,y; //定义鼠标的位置坐标.

static BOOL bCircle=FALSE,bRect=FALSE; //设置绘制圆和矩形的标志变

//定义绘图结构体变量. //得到鼠标的位置.

量.

PAINTSTRUCT ps;

x = LOWORD(lParam); y = HIWORD(lParam);

GetClientRect(hWnd,&ClientRect); // 获得窗口大小

实验报告 实验一

static int flag=0;

switch(iMessage) {

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDM_UP:

rect1.top -=10; rect1.bottom -=10;

if(bRect == TRUE || bCircle == TRUE) {

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.bottom

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_DOWN,MF_HILITE); CheckMenuItem(hMenu,IDM_DOWN,MF_UNCHECKED); }

if(rect1.top<=0) {

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_UP,MF_GRAYED); CheckMenuItem(hMenu,IDM_UP,MF_CHECKED); } } }

break;

case IDM_DOWN:

rect1.top +=10;

rect1.bottom +=10;

if(bRect == TRUE || bCircle == TRUE)

{

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.top>0)

{ }

if(rect1.bottom>=ClientRect.bottom) {

hMenu=GetMenu(hWnd);

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_UP,MF_HILITE); CheckMenuItem(hMenu,IDM_UP,MF_UNCHECKED);

实验报告 实验一

EnableMenuItem(hMenu,IDM_DOWN,MF_GRAYED);

CheckMenuItem(hMenu,IDM_DOWN,MF_CHECKED); } } }

break;

case IDM_RIGHT:

rect1.left +=10; rect1.right +=10;

if(bRect == TRUE || bCircle == TRUE) {

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.left>0)

{

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_LEFT,MF_HILITE); CheckMenuItem(hMenu,IDM_LEFT,MF_UNCHECKED); }

if(rect1.right>=ClientRect.right) {

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_RIGHT,MF_GRAYED); CheckMenuItem(hMenu,IDM_RIGHT,MF_CHECKED); }

} }

break;

case IDM_LEFT:

rect1.left -=10;

rect1.right -=10;

if(bRect == TRUE || bCircle == TRUE)

{

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.right

{

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_RIGHT,MF_HILITE); CheckMenuItem(hMenu,IDM_RIGHT,MF_UNCHECKED);

}

if(rect1.left<=0) {

实验报告 实验一

}

}

hMenu=GetMenu(hWnd);

EnableMenuItem(hMenu,IDM_LEFT,MF_GRAYED); CheckMenuItem(hMenu,IDM_LEFT,MF_CHECKED); }

break; }

break;

//处理按下鼠标左键消息.

if(wParam&MK_CONTROL) //同时按下Ctrl键时. {

flag=0;

bCircle = TRUE; bRect = FALSE;

//画圆.

//圆的左上角坐标为当前鼠标位置.

case WM_LBUTTONDOWN:

rect1.left = x; rect1.top = y; }

else if(wParam&MK_SHIFT) //同时按下shift键时. {

flag=0;

bRect = TRUE; bCircle = FALSE; rect1.left = x; rect1.top = y;

//画矩形.

//矩形的左上角坐标为当前鼠标位置.

}

break;

case WM_KEYDOWN: switch(wParam) {

case VK_UP: rect1.top -=10;

//按UP键时,向上移动.

rect1.bottom -=10;

if(bRect == TRUE || bCircle == TRUE) {

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.top<=0) {

MessageBox(hWnd,\已经到达顶点\ } } }

break;

实验报告 实验一

case VK_DOWN: //按DOWN键,向下移动. rect1.top +=10; rect1.bottom +=10;

if(bRect == TRUE || bCircle == TRUE) {

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.bottom>=ClientRect.bottom) {

MessageBox(hWnd,\已经到最低点\ }

}

}

break;

case VK_LEFT: //按LEFT键,向左移动. rect1.left -=10; rect1.right -=10;

if(bRect == TRUE || bCircle == TRUE)

{ }

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.left<=0) {

MessageBox(hWnd,\已经到最左点\ } }

动.

break;

case VK_RIGHT:

//按RIGHT键,向右移

rect1.left +=10; rect1.right +=10;

if(bRect == TRUE || bCircle == TRUE) {

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. {

if(rect1.right>=ClientRect.right) {

MessageBox(hWnd,\已经到最右点\ }

} }

实验报告 实验一

break;

} break;

case WM_LBUTTONUP:

bRect = FALSE; bCircle = FALSE; flag=1; break;

//处理鼠标移动信息.

//当松开左键时.绘图标志为false.

// //

case WM_MOUSEMOVE:

if(flag==0 )

{

rect1.right = x; rect1.bottom = y;

//图形的右下角坐标为当前鼠标位置.

InvalidateRect(hWnd,NULL,TRUE); //发出重绘信息. }

break;

case WM_PAINT:

hDC = BeginPaint(hWnd,&ps); if(bCircle == TRUE )

{ //绘制圆形.

hB1=CreateSolidBrush(RGB(0,255,0));//创建绿色画刷 SelectObject(hDC,hB1);

Ellipse(hDC,rect1.left,rect1.top,rect1.right,rect1.bottom); }

if(bRect == TRUE)

{ //绘制矩形

hB2=CreateSolidBrush(RGB(0,0,255));//创建蓝色画刷 SelectObject(hDC,hB2);

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

实验报告 实验一

BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口 {

HWND hWnd;

hWnd=CreateWindow(\

//生成窗口

\学号:Xb09620113;姓名:林哈特\WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,

CW_USEDEFAULT, 0, NULL, NULL,

hInstance,

NULL); if(!hWnd)

return FALSE; hWndMain=hWnd;

//显示窗口

ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE; }

BOOL InitWindowsClass(HINSTANCE hInstance) {

WNDCLASS WndClass;

WndClass.cbClsExtra=0; //无窗口类扩展. WndClass.cbWndExtra=0; //无窗口实例扩展.

WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//背景为白色.

WndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)); //光标为为箭头.

WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

//采用缺省图标.

WndClass.hInstance=hInstance;

//当前实例.

WndClass.lpfnWndProc=WndProc; //消息处理函数. WndClass.lpszClassName=\ //窗口类名称. WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);

//缺省窗口风格.

//

无菜单.

WndClass.style=0;

实验报告 实验一

return RegisterClass(&WndClass); //返回窗口注册值. }

四、运行结果及分析

五、实验心得

本次实验学习到了如何创建菜单,使得程序应用变得更加方便了。

本文来源:https://www.bwwdw.com/article/lx86.html

Top