Windows98中渐变彩色文本的实现

发表于:2007-06-17来源:作者:点击数: 标签:
在 Windows 98中彩色文本的显示处理比较简单,主要通过调用如下3个WindowsAPI函数 来设置背景和文本的颜色: COLORREFSetText(HDChdc,COLORREFc lr Color); COLORREFSetBkColor(HDChdc,COLORREFclrColor); intSetBkMode(HDC,intnMode); 参数是hdc设备文本句柄,

          在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;
  }

原文转自:http://www.ltesting.net