风云it界

代码改变世界,软件横行网络

   :: 首页 :: 联系 ::  :: 管理

公告

个人简介: 小吴,据说酷爱软件,爱网络,爱游戏,爱数码,爱科技,各种控,各种宅……

常用链接

最新评论

阅读排行榜

评论排行榜

2014年1月13日 #

    现在网络天下的时代,什么事情都要在网络上交易,比如我们经常用的支付宝、网银、QQ密码、邮箱密码、博客的密码等等一大堆东西,这么多密码记起来难免会有所麻烦,于是很多人为了便于管理,大部分都设置成一个密码,那么一旦一个密码被别人知道的话,那就会造成不可预料的后果的,想要知道自己所设置的密码多久可以被别人破解吗?可以来 How Secure Is My Password 这个网站进行测试一下你的密码的安全级别。

1、首先进入 How Secure Is My Password 网站,在 【Enter Password 】 栏内输入所要测试的密码。

2.你一边输入密码,下方会一边显示密码可被破解的时间。

网站网址:http://www.howsecureismypassword.net/


如果有兴趣的话,不妨去尝试一下!网络混乱的江湖,还是把自己的密码设置的安全些才放心啊!
posted @ 2014-01-13 14:54 吴奇 阅读(159) | 评论 (0)编辑 收藏

2014年1月11日 #

      每次重转系统,都会先去备份驱动程序,然而对于国内的驱动安装更新备份软件越来越麻木了,烦人的广告,尤其是驱动有时候不能扫描出来,如果你也有这种有另谋东家的意愿的话,不妨考虑下Driver Magician,我主要看好它的驱动更新下载功能,下载的驱动程序都带数字签名。

    Driver Magician 是一个非常容易使用的驱动程序备份工具,程序可以帮助你快速的将系统中的驱动程序备份下来,以后如果重新安装操作系统的时候你就可以非常迅速的将系统中的驱动程序还原,节省你大量宝贵的时间!程序还可以备份我的文档,收藏夹,Outlook邮箱等相关信息!

软件特点:

四种模式备份设备驱动程序;
备份、还原设备驱动程序;
更新设备驱动程序,以提高系统的性能和稳定性;
卸载设备驱动程序;
实时更新的设备标识符数据库和驱动程序更新数据库;
写在最后:
这款软件并非免费的,跟驱动精灵、驱动人生不同的是,这款软件售价在在29.95美元,现在国外进行限时免费活动,凡是在活动时间内下载激活就可以获得一款价值29.95美元的超值驱动备份工具!

下载地址: Download Driver Magician 4.0下载页面

  PS:请在1月12号下载激活!
posted @ 2014-01-11 17:39 吴奇 阅读(179) | 评论 (0)编辑 收藏

  最近在跟朋友讨论一个关于计算机图形的问题,研究了一会终于搞定,特此写了一个多边形图形算法,于是贴出来跟大家分享一下!
void CPolyFillView::OnDraw(CDC* pDC)
{
CPolyFillDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
const int POINTNUM=6; //多边形点数.
/定义结构体用于活性边表AET和新边表NET/
typedef struct XET
{
float x;
float dx,ymax;
XET* next;
}AET,NET;
/定义点结构体point*/
struct point
{
float x;
float y;
}polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350,100,100};//多边形顶点
//mypoint[POINTNUM]={100,100,200,100,200,200,100,200};//正方形
/计算最高点的y坐标(扫描到此结束)**/
int MaxY=0;
int i;
for(i=0;i<POINTNUM;i++)
if(polypoint[i].y>MaxY)
MaxY=polypoint[i].y;
/*初始化AET表/
AET *pAET=new AET;
pAET->next=NULL;
/初始化NET表*/
NET *pNET[1024];
for(i=0;i<=MaxY;i++)
{
pNET[i]=new NET;
pNET[i]->next=NULL;
}
/扫描并建立NET表*/
for(i=0;i<=MaxY;i++)
{
for(int j=0;j<POINTNUM;j++)
if(polypoint[j].y==i)
{
if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y)
{
NET *p=new NET;
p->x=polypoint[j].x;
p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;
p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y);
p->next=pNET[i]->next;
pNET[i]->next=p;
}
if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y)
{
NET *p=new NET;
p->x=polypoint[j].x;
p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y;
p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);
p->next=pNET[i]->next;
pNET[i]->next=p;
}
}
}
/建立并更新活性边表AET/
for(i=0;i<=MaxY;i++)
{
//计算新的交点x,更新AET/
NET *p=pAET->next;
while(p)
{
p->x=p->x + p->dx;
p=p->next;
}
//更新后新AET先排序


  以上内容是从网络搜集整理而得的,本人对于MFC还不是很明白,主要还是使用OnDraw函数...希望大家多赐教!!!!
  大家多指教...
posted @ 2014-01-11 17:24 吴奇 阅读(417) | 评论 (0)编辑 收藏

     屏幕录制并非每个人的需求,但对于经常要制作软件教程、游戏视频录制等视频的用户来说,一款功能全面的屏幕录制工具就显得至关重要。市面上也不少屏幕录制工具,但很多工具的功能不够全面,无法做出出色的屏幕视频。

      Camtasia Studio是techsmith公司开发的一款非常专业的屏幕视频录制工具,它并非简单地将屏幕的各种动作录制下来,更是支持轨道编辑、支持加入其他音频视频,具备十分强大的录制视频后期处理能力,基于时间轴对视频片段进行各类剪辑操作、如添加各类标注、媒体库、Zoom-n-Pan、画中画、字幕特效、转场效果、旁白、标题剪辑等,当然也可以导入现有视频进行编辑操作,包括 AVI、MP4、MPG、MPEG、WMV、MOV、SWF 等文件格式。


      编辑完成后,你还可以利用Camtasia Studio将录制完成的视频导出为 MP4、WMV、AVI、M4V、MP3、GIF 等主流格式,并能灵活自定义输出配置,是制作录制屏幕、视频演示的绝佳工具,其中 MP4 格式是为 Flash 和 HTML5 播放优化过的。

      全新版本Camtasia Studio v8加入更多的社交元素,如你可以直接将你的作品上传到Google Drive;更高效率的性能,多个视频和音频轨道支持使得你对视频后期处理更得心应手,无论您是在录制高清视频,PowerPoint演示文稿或视频游戏,性能都表现出色;动态内容展示,可以随意添加上下跳动图像,文字滚动等效果;出色的视频效果处理,对视频进行润色,还有视频剪切功能让你感受视频处理工作室专业……

 Camtasia Studio v8绝对称得上顶级、一流的屏幕视频录制编辑工具,同是techsmith开发的优秀工具还有非常出色的截图工具Snagit。 

使用说明:
     基于官方原版制作 Camtasia Studio 8.1.2 Build 1327 英文+中文精简绿色版,第一次使用先运行 !)CamtasiaStudioPorable.exe 选择安装完成初始化,会提示选择中文还是英文界面,以后直接运行主程序即可,注意 Camtasia Studio 8 基于 .NET 4.0 开发,必须安装 .NET Framework 4 运行库后才能正常运行。
我几乎做过各个版本的 Camtasia Studio 绿色版,不喜欢的话可以下载官方原版,或者试试其他的录屏软件,如 DemoCreator、DemoCharge、Instant Demo 等,当然还有优秀的免费录屏软件 Wink。

相关文件下载地址:Camtasia Studio v8下载页面 
posted @ 2014-01-11 17:15 吴奇 阅读(935) | 评论 (0)编辑 收藏

2014年1月6日 #

核心提示:
#include "stdafx.h"
#include <iostream>
using namespace std;
template <class T>
class MyArray
{
int len;
public:
T *data;
MyArray()
{
data = NULL;
len = 0;
}
~MyArray()
{
delete[] data;
}
T& operator [](int index);
void push(T d);
};
template <class T>
T& MyArray<T>::operator [](int index)
{
if(index<0||index>(len-1))
{
cout<<"Bad subscript!"<<endl;
exit(1);
}
return data[index];
}
template <class T>
void MyArray<T>::push(T d)
{
T *pdata = data;
data = new T[len + 1];
if(pdata != NULL)
{
for(int i = 0 ; i < len ; i++)
{
data[i] = pdata[i];
}
delete[] pdata;
}
data[len] = d;
len++;
}
//测试代码
  int main(int argc, char* argv[])
{
MyArray<int>  a;
a.push(11);
a.push(22);
a.push(33);
a.push(55);
a[0]=44;
cout<<a[0]<<endl<<a[1]<<endl<<a[2]<<endl<<a[3]<<endl;
return 0;
}

问题:在类中建立一个int类型的数组   
方法一:(错误)   
class Test   
{   
const int size = 100;   
int array[size];   //……   
};   
错误原因:   
1:因为在一个类中,const恢复了它在c中的一部分意思,在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能被改变。所以在类中使用了const的意思是:在这个对象的生命周期内,它是一个常量。   
然而,每个对象可能包含不同的值。   
2:对const常量进行了初始化,C++中这个初始化必须由构造函数完成,如const常量在初始化列表中进行初始化。   
方法二:(正确,有缺陷)   
使用enum;   
class Test   
{   
enum { size = 100};   
int array[size];   //……   
};   
使用enum不会占用对象中的存储空间的,枚举常量在编译的时候被全部求值。   
缺点:   
假如定义一个非整型的常量该如何?enum无法完成此项操作,同时丧失了枚举本来的作用。   
方法三:(正确,最好)   
使用静态常量;   
class Test   
{   
static const int size;   int array[size];   //……   
};   
const int Test::size = 100;   
它既是常量,不能改变,又是静态,在类中只有一个定义点。所以能够完成任务。  
 同时,它可以定义任何与定义类型的常量。
posted @ 2014-01-06 14:02 吴奇 阅读(223) | 评论 (0)编辑 收藏

2013年12月23日 #

1. 窗口是通过查看句柄(HWND)来标识的。我们要对某个窗口进行操作,首先就得得到这个窗口的句柄(HANDLE)。

2. 窗口的创建:
  (1) 设计一个窗口类;
  (2) 注册窗口类;
  (3) 创建窗口.
  (4) 显示及更新窗口;

以上即为C++ MFC窗体创建过程,欢迎各位交流讨论!
posted @ 2013-12-23 14:31 吴奇 阅读(146) | 评论 (0)编辑 收藏

2013年12月20日 #

static的全部用法
  要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:
  int a;
  string s;
  其实就是:
  auto int a;
  auto string s;
  而static变量的声明是:
  static int a;
  static string s;
  这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected,public一样;
  对于static的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;所以,像这样的例子:
  void func()
  {
  int a;
  static int b;
  }
  每一次调用该函数,变量a都是新的,因为它是在进入函数体的时候被分配,退出函数体的时候被释放,所以多个线程调用该函数,都会拥有各自独立的变量a,因为它总是要被重新分配的;而变量b不管你是否使用该函数,在程序初始化时就被分配的了,或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),所以多个线程调用该函数的时候,总是访问同一个变量b,这也是在多线程编程中必须注意的!
  static的全部用法:
  1.类的静态成员:
  class A
  {
  private:
  static int s_value;
  };
  在cpp中必须对它进行初始化:
  int A::s_value = 0;// 注意,这里没有static的修饰!
  
  类的静态成员是该类所有实例的共用成员,也就是在该类的范畴内是个全局变量,也可以理解为是一个名为A::s_value的全局变量,只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的,所以只分配一次,所以就是共用的;
  类的静态成员必须初始化,道理也是一样的,因为它是在程序初始化的时候分配的,所以必须有初始化,类中只是声明,在cpp中才是初始化,你可以在初始化的代码上放个断点,在程序执行main的第一条语句之前就会先走到那;如果你的静态成员是个类,那么就会调用到它的构造函数;
  2.类的静态函数:
  class A
  {
  private:
  static void func(int value);
  };
  实现的时候也不需要static的修饰,因为static是声明性关键字;
  类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数:void A::func(int);
  静态成员函数可以继承和覆盖,但无法是虚函数;
  3.只在cpp内有效的全局变量:
  在cpp文件的全局范围内声明:
  static int g_value = 0;
  这个变量的含义是在该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量;
  如果不使用static声明全局变量:
  int g_value = 0;
  那么将无法保证这个变量不被别的cpp共享,也无法保证一定能被别的cpp共享,因为要让多个cpp共享一个全局变量,应将它声明为extern(外部)的;也有可能编译会报告变量被重复定义;总之不建议这样的写法,不明确这个全局变量的用法;
  如果在一个头文件中声明:
  static int g_vaule = 0;
  那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量;
  这里顺便说一下如何声明所有cpp可共享的全局变量,在头文件里声明为extern的:
  extern int g_value; // 注意,不要初始化值!
  然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:
  int g_value = 0; // 初始化一样不要extern修饰,因为extern也是声明性关键字;
  然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;
  4.只在cpp内有效的全局函数:
  在cpp内声明:
  static void func();
  函数的实现不需要static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;道理和如果不使用static会引起的问题和第3点一样;不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则在cpp内部声明需要加上static修饰;在C语言中这点由为重要!
posted @ 2013-12-20 15:34 吴奇 阅读(196) | 评论 (0)编辑 收藏

2013年12月19日 #

     函数返回指针。本来就是一个比较容易出问题的操作。在霍顿的《VC++ 入门经典》一书中,给出了一个很有代表性的例子,如下:
  // Ex5_11.cpp
  #include <iostream>
  using std::cout;
  using std::endl;
  double* treble(double); // Function prototype
  int main(void)
  {
  double num = 5.0; // Test value
  double* ptr = 0; // Pointer to returned value
  ptr = treble(num);
  cout << endl
  << "Three times num = " << 3.0*num;
  cout << endl
  << "Result = " << *ptr; // Display 3*num
  cout << endl;
  system("pause");
  return 0;
  }
  // Function to treble a value - mark 1
  double* treble(double data)
  {
  double result = 0.0;
  result = 3.0*data;
  return &result;
  }
  两个输出语句,一个直接输出3*5=15.另一个在一个函数中进行了乘法运算,也是5*3, 存到result变量中也没有任何问题。返回这个变量的指针,输出时再接触引用。貌似也没有错误。两条输出语句似乎都应该输出15.但事实不是这样。编译 器会抛出[Warning] address of local variable `result' returned 这样一个警告信息。程序运行后的结果也并非是我们预想的那样。第二条输出语句会输出一个不可预见的值。这是怎么回事呢?
  仔细分析一下,result是作用域在treble函数中的局部变量。当函数执行结束后。变量result会被析构。其原先占用的内存区域已经被系统回收,可以存储任何数据。而返回的指向该地址的指针也失去了其原有的意义。因此我们得到这样一条准则:
  永远不要从函数中返回局部自动变量的地址。
  如果你真的需要这样操作。你可以在函数的参数表中传入一个指针变量。然后将需要写入的数据写入到该指针变量指向的地址。由于该指针指向的变量,作用域在函数体 之外。因此不会在函数结束结束时被回收。
  现在回到我们遇到的问题。时间函数localtime就是一个返回指针的函数。返回值类 型:tm*
  该如何接收这个返回值?当然是声明一个与之类型相同的变量。
  于是你会这样写:tm* result;
  接下来呢?还用问?赋值嘛。是不是这样:result=localtime(....);
  返回什么类型,当然要给什么类型的变量 赋值。但是这样却发生了我们不想看到的结果。
  也许你想到了。就是这个指针!返回的指针在函数结束后不再有效。正确的方法可以是:
  tm result;
  result = *localtime(....);
  也可以是:
  tm* result;
  *result = *localtime(...);
  正确的方法的共同特点是在函数结束前,对返回的指针解除引用。然后用这个数值,为变量或指针指向的内存区域赋值。也就是说必须要复制函 数的返回值。因为函数体中变量会被析构。
  指针是灵活而强大的,避免低级错误,明确基本概念。才能让指针更好的为我们服务。
posted @ 2013-12-19 17:36 吴奇 阅读(312) | 评论 (4)编辑 收藏

2013年12月18日 #

众所周知,注册表的重要性就不需要在这里阐述了,但是我们如何用c++来读取注册表呢?
1.读注册表
  // 读取注册表
  CString ReadRegisteTable(CString root,CString path, CString key)
  {
  HKEY hAppKey;
  LPCTSTR WINDS_SERVICE_REGISTRY_KEY=path;
  LPCTSTR DATA_FILE_SUB_KEY=key;
  char szDataFile[80];
  if(root=="HKEY_LOCAL_MACHINE")
  {
  if (ERROR_SUCCESS == RegOpenKeyEx (
  HKEY_LOCAL_MACHINE,
  WINDS_SERVICE_REGISTRY_KEY,
  0,
  KEY_READ,
  &hAppKey))
  {
  ULONG cbSize = MAX_PATH*sizeof(TCHAR);
  DWORD dwFlag = RegQueryValueEx (
  hAppKey,
  DATA_FILE_SUB_KEY,
  NULL,
  NULL,
  (LPBYTE)szDataFile,&cbSize);
  RegCloseKey (hAppKey);
  if (ERROR_SUCCESS == dwFlag)
  {
  CString strDate=szDataFile; //MessageBox(strDate);
  if(strDate.GetLength()>0) return strDate;
  else return "";
  }
  return "";
  }
  }
  if(root=="HKEY_CURRENT_USER")
  {
  if (ERROR_SUCCESS == RegOpenKeyEx (
  HKEY_CURRENT_USER,
  WINDS_SERVICE_REGISTRY_KEY,
  
  0,
  KEY_READ,
  &hAppKey))
  {
  ULONG cbSize = MAX_PATH*sizeof(TCHAR);
  DWORD dwFlag = RegQueryValueEx (
  hAppKey,
  DATA_FILE_SUB_KEY,
  NULL,
  NULL,
  (LPBYTE)szDataFile,&cbSize);
  RegCloseKey (hAppKey);
  if (ERROR_SUCCESS == dwFlag)
  {
  CString strDate=szDataFile; //MessageBox(strDate);
  if(strDate.GetLength()>0) return strDate;
  else return "";
  }
  return "";
  }
  }
  return "";
  }[nextqage]
  2.写注册表
  // 修改注册表
  BOOL ModifyRegisteTable(CString root,CString path, CString key, CString value)
  {
  HKEY hAppKey;
  DWORD dwDisposition = MAX_PATH*sizeof(TCHAR);
  LPCTSTR WINDS_SERVICE_REGISTRY_KEY=path;
  LPCTSTR DATA_FILE_SUB_KEY=key;
  char szDataFile[80]; strcpy(szDataFile,value);
  if(root=="HKEY_LOCAL_MACHINE")
  {
  if (ERROR_SUCCESS != RegCreateKeyEx (
  HKEY_LOCAL_MACHINE,
  WINDS_SERVICE_REGISTRY_KEY,
  0,
  NULL,
  REG_OPTION_NON_VOLATILE,
  KEY_WRITE,
  NULL,
  &hAppKey,
  &dwDisposition))
  {
  return false;
  }
  else
  {
  if (ERROR_SUCCESS != RegSetValueEx (hAppKey,
  DATA_FILE_SUB_KEY,
  0,
  REG_SZ,
  (LPBYTE)szDataFile,
  (lstrlen (szDataFile)+1)*sizeof(TCHAR)))
  {
  return false;
  }
  RegCloseKey (hAppKey);
  }
  }
  if(root=="HKEY_CURRENT_USER")
  {
  if (ERROR_SUCCESS != RegCreateKeyEx (
  HKEY_CURRENT_USER,
  WINDS_SERVICE_REGISTRY_KEY,
  0,
  NULL,
  REG_OPTION_NON_VOLATILE,
  KEY_WRITE,
  NULL,
  &hAppKey,
  &dwDisposition))
  {
  return false;
  }
  else
  {
  if (ERROR_SUCCESS != RegSetValueEx (hAppKey,
  DATA_FILE_SUB_KEY,
  0,
  REG_SZ,
  (LPBYTE)szDataFile,
  (lstrlen (szDataFile)+1)*sizeof(TCHAR)))
  {
  return false;
  }
  RegCloseKey (hAppKey);
  }
  }
  return true;
  }

以上只是理论,未经实际操作证实,如有错误操作,敬请原谅1
posted @ 2013-12-18 16:15 吴奇 阅读(191) | 评论 (0)编辑 收藏

   c++控制台输出时如何设置字体的颜色呢?以及背景颜色又应该如何用c++语言控制呢?下面咱们就来探讨一下这个具体的代码!
    0.设置控制台输出行数和列数
  system("mode con:cols=100 lines=20000");
  1.改变整个控制台的颜色
  用 system("color 0A");
  其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
  0=黑色
  1=蓝色
  2=绿色
  3=湖蓝色
  4=红色
  5=紫色
  6=黄色
  7=白色
  8=灰色
  9=淡蓝色
  A=淡绿色
  B=淡浅绿色
  C=淡红色
  D=淡紫色
  E=淡黄色
  F=亮白色
  2.改变下一个输出或者输入字体和背景的颜色
  采用SetConsoleTextAttribute函数,如
  White on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
  Red on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_RED);
  Green on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_GREEN);
  Yellow on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_RED | FOREGROUND_GREEN);
  Blue on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_BLUE);
  Magenta on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_RED | FOREGROUND_BLUE);
  Cyan on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
  FOREGROUND_GREEN | FOREGROUND_BLUE);
  Black on Gray:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
  BACKGROUND_INTENSITY);
  Black on White:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
  FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
  Red on White:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
  FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE |
  FOREGROUND_RED);
  等等。
  需要引入头文件:
  windows.h
  函数原型:
  BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, WORD wAttributes );
  wAttributes 的取值含义对应如下:
  Attribute Meaning
  FOREGROUND_BLUE Text color contains blue.
  FOREGROUND_GREEN Text color contains green.
  FOREGROUND_RED Text color contains red.
  FOREGROUND_INTENSITY Text color is intensified.
  BACKGROUND_BLUE Background color contains blue.
  BACKGROUND_GREEN Background color contains green.
  BACKGROUND_RED Background color contains red.
  BACKGROUND_INTENSITY Background color is intensified.
  COMMON_LVB_LEADING_BYTE Leading byte.
  COMMON_LVB_TRAILING_BYTE Trailing byte.
  COMMON_LVB_GRID_HORIZONTAL Top horizontal.
  COMMON_LVB_GRID_LVERTICAL Left vertical.
  COMMON_LVB_GRID_RVERTICAL Right vertical.
  COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
  COMMON_LVB_UNDERSCORE Underscore.
posted @ 2013-12-18 16:12 吴奇 阅读(364) | 评论 (1)编辑 收藏

软件之家 | 三次元