实验报告 实验一
《可视化编程技术》实验报告
—— 实验五
一、实验目的和要求
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 \
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;