MOOC清华《VC++面向对象与可视化程序设计》第3章:Windows文本-例(2)字体、颜色、下划线

#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
					HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
		HWND hwnd ;
		MSG Msg ;
		WNDCLASS wndclass ;
		char lpszClassName[] = "文本输出"; 
		char lpszTitle[]= "EXAMPLE FOR THE TEXT OUTPUT";
		wndclass.style = 0;
		wndclass.lpfnWndProc = WndProc ;
		wndclass.cbClsExtra	= 0 ;
		wndclass.cbWndExtra	= 0 ;
		wndclass.hInstance = hInstance ;
		wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
		wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;
		wndclass.hbrBackground =(HBRUSH)GetStockObject( WHITE_BRUSH) ;
		wndclass.lpszMenuName = NULL ;
		wndclass.lpszClassName = lpszClassName ;

		if( !RegisterClass( &wndclass))
		{
			MessageBeep(0) ;
			return FALSE ;
		}

		hwnd = CreateWindow
			(
			lpszClassName,
			lpszTitle,
			WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			NULL,
			NULL,
			hInstance,
			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;
	HFONT hF_black,hF_big;	//定义两种字体句柄
	PAINTSTRUCT ps;
	TEXTMETRIC tm;			//定义一个TEXTMETRIC结构,用以记录字体信息
	char lpsz_1[]="这是一行红色的、字体为SYSTEM_FONT的文字,红色代表未来";
	char lpsz_2[]="现在显示的是自定义绿色字体,绿色代表生机勃勃";
	char lpsz_3[]="这一行是蓝色的粗体字,蓝色代表广阔的海洋和天空";
	char lpsz_4[]="这是大号、斜体并带有下划线的文字";
	char lpsz_5[]="您掌握了字体的操作了吗?";
	char lpsz_6[]="祝您成功!";
	int X=0,Y=0;
	SIZE size;					//定义一个SIZE类型的结构
	switch(message)
	{
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);
			SetTextColor(hdc,RGB(255,0,0));	//设置文本颜色为红色
			GetTextMetrics(hdc,&tm);		//获取缺省字体,写入tm结构中
			TextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1));	//使用当前字体输出文本
			Y=Y+tm.tmHeight+tm.tmExternalLeading;//计算换行时下一行文本的输出坐标
			hF_black=CreateFont		//创建自定义字体
					(
						20,				//字体的高度
						0,				//由系统根据高宽比选取字体最佳宽度值
						0,				//文本的倾斜度为0,表示水平
						0,				//字体的倾斜度为0
						FW_HEAVY,		//字体的粗度,FW_HEAVY为最粗
						0,				//非斜体字
						0,				//无下划线
						0,				//无删除线
						GB2312_CHARSET,	//表示所用的字符集为ANSI_CHARSET
						OUT_DEFAULT_PRECIS,	//输出精度为缺省精度
						CLIP_DEFAULT_PRECIS,	//剪裁精度为缺省精度
						DEFAULT_QUALITY,		//输出质量为缺省值
						DEFAULT_PITCH|FF_DONTCARE,//字间距和字体系列使用缺省值
						"粗体字"				//字体名称
						);

				SetTextColor(hdc,RGB(0,255,0));	//设置文本颜色为绿色
				SelectObject(hdc,hF_black);		//将自定义字体选入设备环境
				GetTextMetrics(hdc,&tm);	//获取字体的信息,并写入tm结构中
				TextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2));	//使用当前字体输出文本
				Y=Y+tm.tmHeight+5*tm.tmExternalLeading;	
						//换行继续输出文本,计算新行的起始Y坐标位置
				GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size);
						//获取字符串的宽度
				SetTextColor(hdc,RGB(0,0,255));			//设置文本颜色为蓝色
				TextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3));	//用当前字体输出文本
				Y=Y+tm.tmHeight+5*tm.tmExternalLeading; 
				hF_big=CreateFont						//引入新字体
					(
					30,									//字体高度
					0,
					0,
					0,
					FW_NORMAL,
					1,									//定义斜体
					1,									//定义输出时带下划线
					0,
					GB2312_CHARSET,						//所使用的字符集
					OUT_DEFAULT_PRECIS,
					CLIP_DEFAULT_PRECIS,
					DEFAULT_QUALITY,
					DEFAULT_PITCH|FF_DONTCARE,
					"大号字"
					);

				SelectObject(hdc,hF_big);	  //将第二种自定义字体选入设备环境
				SetTextColor(hdc,RGB(155,155,155));		//设置文本颜色为灰色
				Y=Y+tm.tmHeight+5*tm.tmExternalLeading;	
 				TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4));	//以当前字体输出文本
				SetTextColor(hdc,RGB(255,0,0));			//设置文本颜色为红色
				Y=Y+tm.tmHeight+10*tm.tmExternalLeading;	
				TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5)); 	//输出文本
				//在该行继续输出文本
				GetTextExtentPoint32(hdc,lpsz_5,strlen(lpsz_5),&size);
													//获取字符串的宽度
				X=X+size.cx;							//获取起始坐标
				TextOut(hdc,X+5,Y,lpsz_6,strlen(lpsz_6)); 	//输出文本
				EndPaint(hwnd,&ps);
				DeleteObject(hF_black);		//删除自定义字体句柄
				DeleteObject(hF_big);
				break;

	case WM_DESTROY:
			PostQuitMessage(0);
			break;

	default:
		return  DefWindowProc(hwnd,message,wParam,lParam);
		}
		return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值