可视化编程学习笔记·实验三

实验三 基于 SDK 编程(二) 
一、实验目的 

  1. 掌握设备驱动程序翻译的常用虚拟码 
  2. 掌握两类键盘消息 

二、实验要求 

  1. 预习本次实验的实验要求和任务 
  2. 熟悉基于 SDK 的键盘操作技术和方法,并独立完成本次实验 

三、实验环境 

  1. 软件:VC++ 6.0 或 Visual Studio 

四、实验内容 

  1. 创建一个键盘操作的 VC 工程,创建 cpp 文件 
  2. 编写 WinMain 函数进行本工程窗口定义与设计等任务,并完成窗口函数中的基本消息处理过程 
  3. 按照要求对"ctrl"键、"shift"键、下左或右箭头、Home 及 End 键、PageUp 及PageDown 键编写相应的消息响应代码,以实现单击这些按钮时,分别可以完成不同图形的绘制以及移动等操作。 

五、实验过程及结果描述 

  1. 依照实验一步骤创建一个基于 SDK 的工程及相应其它文件 
  2. 在本工程的 cpp 文件中输入以下代码: 
#include<windows.h> 
int nMode; 
RECT rect; 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 

  WinMain函数如下:

int WINAPI WinMain(HINSTANCE hinstaance, HINSTANCE pre, LPSTR lpszCmdLine, int nCmdShow)
{
	HWND hwnd;  
	MSG msg; 
	WNDCLASS wndclass; 
	wchar_t lpszClassName[] = L" ";
	wchar_t Title[] = L"实验三";  
	wndclass.cbClsExtra = 0; 
	wndclass.cbWndExtra = 0;  
	wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hIcon = LoadIcon(NULL, IDI_QUESTION); 
	wndclass.hInstance = hinstaance;
	wndclass.lpfnWndProc = WndProc;  
	wndclass.lpszClassName = lpszClassName; 
	wndclass.lpszMenuName = NULL;  
	wndclass.style = 0; 
	RegisterClass(&wndclass); 
	hwnd = CreateWindow(lpszClassName, Title, WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, 100, 100, 500, 500, NULL, NULL, hinstaance, NULL); 
	ShowWindow(hwnd, nCmdShow); 
	UpdateWindow(hwnd); 
	while (GetMessage(&msg, NULL, 0, 0)) 
	{ 
		TranslateMessage(&msg); 
		DispatchMessage(&msg);
	}  
	return msg.wParam;
}

窗口函数代码如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
	HDC hdc; 
	HPEN hp; 
	HBRUSH hb; 
	static int Circle; 
	PAINTSTRUCT ps;   
	switch (message)
	{
	case WM_KEYDOWN:   
		if (wParam == VK_CONTROL) 
		{ 
			Circle = 1;  
			rect.left = 0;    
			rect.right = 50;  
			rect.top = 0;   
			rect.bottom = 50;         
			InvalidateRect(hwnd, NULL, 1);
		}
		else if (wParam == VK_HOME)
		{ 
			rect.left = rect.left - 10;  
			rect.right = rect.right - 10;  
			if (Circle == 1) 
			{ 
				InvalidateRect(hwnd, NULL, 1);
			}
		}
		else if (wParam == VK_END)
		{ 
	rect.left = rect.left + 10;   
	rect.right = rect.right + 10;  
	if (Circle == 1) 
	{
	InvalidateRect(hwnd, NULL, 1); 
	} 
		}   
	break;  
	case WM_PAINT:  
		hdc = BeginPaint(hwnd, &ps);      
		SetMapMode(hdc, MM_ISOTROPIC); 
		SetWindowExtEx(hdc, 1, 1, NULL);   
		SetViewportExtEx(hdc, 1, 1, NULL); 
		hp = CreatePen(PS_SOLID, 0, RGB(0, 0, 255)); 
		hb = CreateSolidBrush(RGB(0, 255, 0)); 
		SelectObject(hdc, hb);  
		SelectObject(hdc, hp);  
		if (Circle == 1) 
		{
			Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom);
		}  
		EndPaint(hwnd, &ps);
	break;  
	case WM_DESTROY:  
	PostQuitMessage(0);     
	break; 
	default:  
		return(DefWindowProc(hwnd, message, wParam, lParam));
	} 
	return 0;
}

3.在此基础上,添加如下功能:

(1)按下"shift"键时,进行矩形绘制;  

(2)按下左或右箭头,矩形或椭圆高度或长度加 10;  

(3)按下 PageUp 或 PageDown 时,矩形或椭圆向上或向下移动。 

 

窗口函数添加如下代码:

static int Rec;
case WM_KEYDOWN:
    else if (wParam == VK_SHIFT)
		{
		    	Rec = 1;
		    	rect.left = 0;
		    	rect.right = 50;
		    	rect.top = 0;
		    	rect.bottom = 50;
		    	InvalidateRect(hwnd, NULL, 1);
	    	}
    else if (wParam == VK_UP)
		{
			rect.top -= 10;
			rect.bottom -= 10;
			if (Rec == 1) {
				InvalidateRect(hwnd, NULL, 1);
			}
		}
	else if (wParam == VK_DOWN)
		{
			rect.top += 10;
			rect.bottom += 10;
			if (Rec == 1) {
				InvalidateRect(hwnd, NULL, 1);
			}
		}
    else if (wParam == VK_RIGHT)
		{
			rect.right += 10;
			rect.bottom += 10;
			if (Circle == 1||Rec == 1)
			{
				InvalidateRect(hwnd, NULL, 1);
			}
		}
	else if (wParam == VK_LEFT)
		{
			rect.left -= 10;
			rect.bottom += 10;
			if (Circle == 1 || Rec == 1)
			{
				InvalidateRect(hwnd, NULL, 1);
			}
		}
    break;
case WM_PAINT:
    if (Rec == 1)
    {
		Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一课 Windows编程和面向对象技术   1.1 Windows发展历史   1.2 Windows操作系统特点   1.3 Windows应用程序设计的特点   1.4 Windows应用程序的开发工具   1.5 面向对象和Windows编程 第二课 使用Visual C++ 5.0   2.1 Visual C++可视化集成开发环境   2.2 创建、组织文件、工程和工作区   2.3 WIN32开发   2.4 MFC编程   2.5 移植C Windows程序到MFC   2.6 Visual C++5.0新特性 第三课 窗口、菜单与消息框   3.1 编写第一个窗口程序   3.2 AppWizard所创建的文件   3.3 编译和链接Hello程序   3.4 应用程序执行机制   3.5几种窗口类型   3.6 使用菜单   3.7 更新命令用户接口(UI)消息   3.8 快捷菜单 第四课 工具条和状态栏   4.1 工具条的可视化设计   4.2 工具条的编程技术   4.3 状态栏的设计与实现 第五课 对话框   5.1对话框和控件的基本概念   5.2 对话框模板的设计   5.3 对话框类的设计   5.4 非模态对话框   5.5 标签式对话框   5.6 公用对话框   5.7 小结 第六课 控件 6.1 传统控件   6.2 新型Win32控件   6.3 控件的技术总结   6.4 在非对话框窗口中使用控件   6.5 如何设计新的控件   6.6 小结 第七课 文档视结构   7.1 文档/视图概念   7.2 文档视结构程序实例   7.3 让文档视结构程序支持卷滚   7.4 定制串行化   7.5 不使用串行化的文档视结构程序   7.6 小 结 第八课 多文档界面MDI   8.1多文档界面窗口   8.2图形设备接口(GDI)   8.3 绘图程序   8.4访问当前活动视图和活动文档   8.5分隔视图   8.6打印和打印预览   8.7支持多个文档类型的文档视结构程序   8.8防止应用程序运行时创建空白窗口   8.9小结 第九课 创建用户模块   9.1用户模块   9.2静态连接库   9.3创建动态库   9.4小结 第十课 数据库编程   10.1 数据库的基本概念   10.2 ODBC基本概念   10.3 MFC的ODBC类简介   10.4 CDatabase类   10.5 CRecordset类   10.6 CRecordView类   10.7 编写Enroll数据库应用例程   10.8 DAO和DAO类   10.9 自动注册DSN和创建表   10.10 小结 第十一课 多媒体编程   11.1 调色板   11.2位图   11.3依赖于设备的位图(DDB)   1.4与设备无关的位图(DIB)   11.5动画控件   11.6媒体控制接口(MCI).   11,7小结  第十二章 多线程与串行通信   12.1 多任务、进程和线程   12.2 线程的同步   12.3 串行通信与重叠I/O   12.4 一个通信演示程序   12.5 小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值