在Windows 98中彩色文本的显示处理比较简单,主要通过调用如下3个Windows API函数
来设置背景和文本的颜色:
COLORREF SetText(HDC hdc,COLORREF clrColor);
COLORREF SetBkColor(HDC hdc,COLORREF clrColor);
int SetBkMode(HDC,int nMode);
参数是hdc设备文本句柄,clrColor是指定颜色,一般采用RGB值, 例如:SetText(hdc,
RGB(0,255,0)将当前文本的颜色置为纯绿色,Set BkColor(hdc,RGB(0,0,255)将当前背
景的颜色置为纯蓝色。要使SetB kColor()函数在输出时生效,还必须使用SetBkMode()
函数来控制屏幕背景色,SetBkMode()函数中nMode的值取OPAQUE或TRANSPARENT,若为
O PAQUE, 则每次输出时背景改为当前背景颜色;若为TRANSPARENT,不管 SetBkColor()
函数怎样调用,背景颜色都不改变。Win98中,nMode缺省值为OPAQUE。
程序中函数GetTextMetrics()用来取得有关字体信息,它的第2个参数结构类型为
TE XTMETRIC,该结构共有20个成员,各成员详细说明参见有关资料,程序中用到的成员
tmHei ght表示字符的高度,成员tmE xternalLeading表示两文本行之间的空隙。
渐变彩色文本的实现程序在中文Windows 98下,采用Visual C++ 5.0编辑、编译连接
通过,当运行后,选择"显示"命令,一定会看到奇妙的渐变彩色文本。
值得说明的是如果系统显示器设备的颜色若为256色或更少,那么只能获得有限的、
间断性较大的颜色,如果设置为16M色或更大的色彩数目,才能获得真正连续渐变的
彩色。 资源描述文件clrtext.rc内容为:
#include
#include"clrtext.h"
ClrTextMenu MENU
{
MENUITEM"显示(&S)",IDM_SHOW
MENUITEM"清除(&C)",IDM_CLEAR
MENUITEM"帮助(&H)",IDM_HELP
}
ClrTextMenu ACCELERATORS
{
VK_F2, IDM_SHOW, VIRTET
VK_F3, IDM_CLEAR, VIRTET
VK_F1, IDM_HELP, VIRTET
}
程序资源头文件clrtext.h内容为:
#define IDM_SHOW 101
#define IDM_CLEAR 102
#define IDM_HELP 103
程序源代码为:
//clrtext.c
#include
#include
#include
#include"clrtext.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
char *szWinName="Win98Main";//窗口类名
char tmp_str
char Font_Name="缺省";//字体名
int nMaxX,nMaxY;//屏幕分辨率
int X=0,Y=0;//显示起始位置
HDC memdc;//内存设备文本句柄
HBITMAP hBit;
HBRUSH hBrush;
int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE
hPrevInst,PSTR pszCmdLine,int nCmdShow)
HWND hwnd;
MSG uMsg;
WNDCLASS wndclass;
HACCEL hAclearcase/" target="_blank" >ccel;
//定义窗口类
wndclass.style=0;
wndclass.lpfnWndProc= WndProc
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hThisInst;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=
GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName="ClrTextMenu";
wndclass.lpszClassName=
szWinName;
//注册窗口类
RegisterClass(&wndclass);
//创建窗口类
hwnd=CreateWindow(szWinName,"Windows 98彩色文本处理",
WS_OVERLAPPEDWINDOW WS_
VSCROLL WS_HSCROLL,CW_
USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_ USEDEFAULT,HWND_DESKTOP,
NULL,hThisInst,NULL);
//加载加速键表
hAccel=LoadAccelerators(hThisInst,"ClrTextMenu");
//显示窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//循环处理消息
while(GetMessage(&uMsg,NULL,0,0)){
if(!TranslateAccelerator(hwnd,hAccel,&uMsg)){
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
}
return uMsg.wParam;
}
//由Windows 98调用的应用程序主窗口函数,
处理各种不同的消息
LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,WPARAM wParam,LPARAM lPatam)
{
HDC hdc;
PAINTSTRUCT ps;//为恢复窗口内容,定义画刷结构变量
TEXTMETRIC tm;//定义一个装载有关字体信息的结构变量
int i;
switch(message){
case WM_CREATE:
nMaxX=GetSystemMetrics(SM_CXSCREEN);
nMaxY=GetSystemMetrics(SM_CYSCREEN);
hdc=GetDC(hwnd);
memdc=CreateCompatibleDC(hdc);//创建内存设备文本
hBit=CreateCompatibleBitmap(hdc,nMaxX,nMaxY);
//建立设备文本与全屏幕的映射
SelectObject(memdc,hBit);//选择屏幕设备到内存设备文本中
hBrush=GetStockObject(WHITE_BRUSH);
//窗口背景为白色,并取得刷子句柄
SelectObject(memdc,hBrush);//选择刷子句柄到内存设备
PatBlt(memdc,0,0,nMaxX,nMaxY,
RATCOPY);//用白色清除整个屏幕
ReleaseDC(hwnd,hdc);
break;
case WM_COMMAND;
switch(LOWORD(wPatam)){
case IDM_SHOW;//从上到下渐变显示彩色文本
SetBkColor(memdc,RGB(0,0,255));//设置背景为纯蓝色
GetTextMetrics(memdc,&tm);//取得有关文本字体信息
Strcpy(tmp_str,"奇妙的彩色文本彩色渐变");
for(i=0;iSetTextColor(memdc,RGB (i*12,0,0));
//设置彩色文本为红色,红色逐渐加深
TextOut(memdc,X,Y,tmp_str,strlen(tmp_str));//显示出彩色文本
Y=Y+tm.tmHeight+tm.tm
ExternalLeading;//换行
}
InvalidateRect(hwnd,NULL,1);//告诉系统,
当前整个窗口和背景需要重画
break;
case IDM_CLEAR;
X=0;//将显示的起始位置X坐标置为0
Y=0;//将显示的起始位置Y坐标置为0
PatBlt(memdc,0,0,nMaxX,nMaxY,PATCOPY);//用白色清除整个屏幕
InvalidateRect(hwnd,NULL,1);
break;
case IDM_HELP;
MessageBox(hwnd, "Windows 98彩色文本处理
1998.8.25 By Mr.Wangyi ", "帮助",MB_OK);
break;
}
break;
case WM_PAINT;
hdc=BeginPaint(hwnd,&ps);//获取设备文本
BitBlt(hdc,0,0,nMaxX,nMaxY,memdc,0,0,SRCCOPY);
//将保存的虚屏幕拷贝到整个窗口
EndPaint(hwnd,&ps);
break;
case WM_DESTROY;
DeleteObject(memdc);//删除内存设备文本
PostQuitMessage(0);
break;
default;
return DefWindowProc(hwnd,message,wPatam,lPatam);
}
return 0;
}