IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Visual C++ 6.0 开发win32 窗口程序 -- 学习(3) -> 正文阅读

[C++知识库]Visual C++ 6.0 开发win32 窗口程序 -- 学习(3)

今天来学习用windows应用程序编程的窗口绘图功能

首先是主函数,还是四部曲:窗口类注册,窗口生成,显示窗口,消息循环


// 主程序
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	MSG Message;
	HWND hWnd;
	WNDCLASS WndClass;

	//1-定义窗口类
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=0;
	WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,"END");
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=WndProc;
	WndClass.lpszClassName="WinFill";
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW|CS_VREDRAW;
	RegisterClass(&WndClass);

	//2-生成窗口
	hWnd=CreateWindow("WinFill","填充示例",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);

	//3-显示窗口
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);

	//4-消息循环
	while(GetMessage(&Message,0,0,0))
	{
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

这些程序段其实都可以写成子函数形式,比如InitWindowClass之类的,其实也可以直接放在WinMain函数里,更直观。写完主程序,还需要调用的窗口函数,这里就是用来处理消息的,当消息为WM_PAINT时,就执行绘图操作,具体代码如下:

// 窗口函数
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
	HDC hDC;   			//定义指向设备上下文的句柄
	HBRUSH hBrush;  	//定义指向画刷的句柄
	HPEN hPen;			//定义指向画笔的句柄
	PAINTSTRUCT PtStr; 	//定义指向包含绘图信息的结构体变量
	switch(iMessage)  	//处理消息
	{
	case WM_PAINT:    						//处理绘图消息
		hDC=BeginPaint(hWnd,&PtStr);
		SetMapMode(hDC,MM_ANISOTROPIC);  	//设置映射模式
		hPen=(HPEN)GetStockObject(BLACK_PEN);			//设置画笔为系统预定定义的黑色画笔
		hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);	//采用系统预定义的深灰色画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		SelectObject(hDC,hPen);    			//选择画笔
		RoundRect(hDC,50,120,100,200,15,15);//圆角矩形
		hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);	//采用系统预定义的淡灰色画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		Ellipse(hDC,150,50,200,150); 		//椭圆
		hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);	//采用系统预定义的虚画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		Pie(hDC,250,50,300,100,250,50,300,50);  		//饼形
		EndPaint(hWnd,&PtStr);  			//结束绘图
		return 0;
	case WM_DESTROY: 						//结束应用程序
		PostQuitMessage(0);
		return 0;
	default:								//其他消息处理程序
		return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
		}
}

这段代码比较长,其实就是处理消息内容,其他的和Hello World里的一致,就是遇到WM_PAINT消息时,执行绘图操作。整体程序就一个文件,如下所示:

#include<windows.h>

// 窗口函数
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
	HDC hDC;   			//定义指向设备上下文的句柄
	HBRUSH hBrush;  	//定义指向画刷的句柄
	HPEN hPen;			//定义指向画笔的句柄
	PAINTSTRUCT PtStr; 	//定义指向包含绘图信息的结构体变量
	switch(iMessage)  	//处理消息
	{
	case WM_PAINT:    						//处理绘图消息
		hDC=BeginPaint(hWnd,&PtStr);
		SetMapMode(hDC,MM_ANISOTROPIC);  	//设置映射模式
		hPen=(HPEN)GetStockObject(BLACK_PEN);			//设置画笔为系统预定定义的黑色画笔
		hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);	//采用系统预定义的深灰色画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		SelectObject(hDC,hPen);    			//选择画笔
		RoundRect(hDC,50,120,100,200,15,15);//圆角矩形
		hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);	//采用系统预定义的淡灰色画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		Ellipse(hDC,150,50,200,150); 		//椭圆
		hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);	//采用系统预定义的虚画刷
		SelectObject(hDC,hBrush);  			//选择画刷
		Pie(hDC,250,50,300,100,250,50,300,50);  		//饼形
		EndPaint(hWnd,&PtStr);  			//结束绘图
		return 0;
	case WM_DESTROY: 						//结束应用程序
		PostQuitMessage(0);
		return 0;
	default:								//其他消息处理程序
		return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
		}
}




// 主程序
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	MSG Message;
	HWND hWnd;
	WNDCLASS WndClass;

	//1-定义窗口类
	WndClass.cbClsExtra=0;
	WndClass.cbWndExtra=0;
	WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
	WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	WndClass.hIcon=LoadIcon(NULL,"END");
	WndClass.hInstance=hInstance;
	WndClass.lpfnWndProc=WndProc;
	WndClass.lpszClassName="WinFill";
	WndClass.lpszMenuName=NULL;
	WndClass.style=CS_HREDRAW|CS_VREDRAW;
	RegisterClass(&WndClass);

	//2-生成窗口
	hWnd=CreateWindow("WinFill","填充示例",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);

	//3-显示窗口
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);

	//4-消息循环
	while(GetMessage(&Message,0,0,0))
	{
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

直接编译这个文件,就可以出来绘图后的窗体效果了。

这里,需要重点关注一下绘图过程:

hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);  	//设置映射模式
hPen=(HPEN)GetStockObject(BLACK_PEN);			//设置画笔为系统预定定义的黑色画笔
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);	//采用系统预定义的深灰色画刷
SelectObject(hDC,hBrush);  			//选择画刷
SelectObject(hDC,hPen);    			//选择画笔
RoundRect(hDC,50,120,100,200,15,15);//圆角矩形
hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);	//采用系统预定义的淡灰色画刷
SelectObject(hDC,hBrush);  			//选择画刷
Ellipse(hDC,150,50,200,150); 		//椭圆
hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);	//采用系统预定义的虚画刷
SelectObject(hDC,hBrush);  			//选择画刷
Pie(hDC,250,50,300,100,250,50,300,50);  		//饼形
EndPaint(hWnd,&PtStr);  			//结束绘图

(1) hDC=BeginPaint(hWnd,&PtStr);

?这个主要是用来获取设备环境,也就是说通过句柄hWnd来传入设备参数。注意,使用这种方式绘图,最后要通过EndPaint来释放。

(2)SetMapMode(hDC,MM_ANISOTROPIC); ??? ?//设置映射模式

映射关系大致就是说对屏幕坐标系做出规定。

(3)hPen=(HPEN)GetStockObject(BLACK_PEN);?? ??? ??? ?//设置画笔为系统预定定义的黑色画笔

画笔用于画线,画刷用于填充区域。

(3)hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);?? ?//采用系统预定义的深灰色画刷

(4)SelectObject(hDC,hBrush); ??? ??? ??? ?//选择画刷
?? ??? ?SelectObject(hDC,hPen); ? ??? ??? ??? ?//选择画笔

将画笔 画刷选入设备环境。画完以后,要删除对应的画笔,画刷。(好像也可以不删除)

(5)?? ??? ?RoundRect(hDC,50,120,100,200,15,15);//圆角矩形

绘制圆角矩形,参数意义为:左上角x 左上角y 长度dx 长度dy 角度宽度ax 角度宽度ay。

因为画笔和画刷都选用了,所以填充出有深灰色的圆角矩形:

(6)hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);?? ?//采用系统预定义的淡灰色画刷

将画刷改为灰色,就画出来第二个图形。

(7)?? ??? ?SelectObject(hDC,hBrush); ??? ??? ??? ?//选择画刷
?? ??? ?Ellipse(hDC,150,50,200,150); ?? ??? ?//椭圆

绘制椭圆,参数为左上角x 左上角y 右下角x 右下角y

(8)?? ??? ?hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);?? ?//采用系统预定义的虚画刷

我怀疑这个就是不填充色。

(9)?? ??? ?SelectObject(hDC,hBrush); ??? ??? ??? ?//选择画刷
?? ??? ?Pie(hDC,250,50,300,100,250,50,300,50); ??? ??? ?//饼形

画饼。参数为:左上角x 左上角y 右下角x 右下角y 起始点半径确定点坐标,终止点半径确定点坐标

这个可能不太好理解,看图就好了:

主要是把从哪开始,到哪结束定好就行了。

(10)?? ?EndPaint(hWnd,&PtStr); ??? ??? ??? ?//结束绘图

这就完成了我们画图的hello world。

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:32:07  更:2021-07-23 10:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 1:10:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码