基于C++的htm静态页面读取脚本

前些天帮hxd写了一个脚本,因为这些天考试什么的一直没空,考完试了抽空来分享一下。
需求: 自动爬取静态htm页面的某些字段值放入excel表中。比如说一个某人期末考试成绩的静态页面,就需要自动把一个学校上万份的成绩直接导入excel表。
分析: 我首先想到的就是使用C++写。第一是因为C++基础相对其它较好,python很久没用了。第二是主要原因,python脚本发给朋友用需要有python环境,而C++生成了exe可以直接发过去使用。
整体思路: 将生成的exe可执行文件与htm页面放在同一个文件路径下,双击运行程序即可。那么首先我们需要获取文件的当前目录。其次获取该目录下的所有文件。然后读取指定文件(这里就是htm文件)的内容,然后使用正则表达式匹配html语言标签的值,再写入excel。

getcwd
首先第一个问题是,如何获取当前程序所在的路径。gcc提供了getcwd直接获取当前路径,需要注意的是,当我想查看其底层源码时,却只能找到下面的代码:

extern inline __attribute__((__always_inline__)) char *
getcwd (char *__buf, size_t __size)
{
  if (__ssp_bos (__buf) != (size_t) -1 && __size > __ssp_bos (__buf))
    __chk_fail ();
  return __getcwd_alias (__buf, __size);
}

这是因为,getcwd是由编译器gcc提供的内置函数,并不是C库函数。
所以,如果我们用llvm等其它编译器进行编译时,这类函数是用不了的。__getcwd_alias的具体函数就看不到,只能溯源到一些宏定义。不过我们还是大概能看懂什么意思,第一次参数是一个指针,然后第二个参数是指向的内存区域的大小,如果判断大小不对就不会报错。所以我实际的用法是:

	char   buffer[MAX_P];
    getcwd(buffer, MAX_P);
extern char *__SSP_REDIRECT (__getcwd_alias,
			     (char *__buf, size_t __size), getcwd);
# define __SSP_REDIRECT(name, proto, alias) \
  name proto __asm__ (__SSP_ASMNAME (#alias))
# define __SSP_ASMNAME(cname)  __SSP_ASMNAME2 (__USER_LABEL_PREFIX__, cname)
# define __SSP_ASMNAME2(prefix, cname) __SSP_ASMNAME3 (prefix) cname
# define __SSP_ASMNAME3(prefix) #prefix

上面的代码并没有看懂,不过感觉其底层实现和汇编有关系。想要具体了解,可能得去看看gcc中patch的实现了,瞄了一眼,不想再看了…贴出链接
传送门
GetAllFiles
然后我们需要获取当前路径下的所有文件

void GetAllFiles( string path, vector<string>& files)  
{  

    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;//用来存储文件信息的结构体  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1) 
    {  
        do  
        {   
            if((fileinfo.attrib &  _A_SUBDIR))  //如果查找到的是文件夹
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0) //不能是当前目录和上一级目录
                {
                    files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
                    GetAllFiles( p.assign(path).append("\\").append(fileinfo.name), files ); //递归搜索
                }
            }  
            else //如果查找到的不是是文件夹 
            {  
                files.push_back(p.assign(fileinfo.name) ); //保存文件名
            } 

        }while(_findnext(hFile, &fileinfo)  == 0);  

        _findclose(hFile); //结束查找
    } 

}

首先需要是使用 _finddata_t 来存储文件信息,分别表示:文件的类型,文件的创建时间,文件最后一次被访问时间,文件最后一次修改时间,文件的大小,文件的名称。

#define _finddata_t _finddata32_t
struct _finddata32_t {
    unsigned attrib;
    __time32_t time_create;
    __time32_t time_access;
    __time32_t time_write;
    _fsize_t size;
    char name[260];
  };

接着使用_findfirst查找文件。_findfirst起始是_findfirst32的宏定义,而_findfirst32函数的第一个参数是const char * 类型的,这也是为什么在传参时要加一个c_str()函数,就是把string类型转换成const char * 类型。该函数返回查找成功的文件句柄,把文件信息存储在结构体中,查找失败返回-1.

// io.h
_CRTIMP intptr_t __cdecl _findfirst32(const char *_Filename,struct _finddata32_t *_FindData);

这里的_Filename路径中可以包括*这种通配符,这样就可以方便地表示某目录下地所有文件。显然,这里可以直接定义文件的类型,不需要后面再加条件进行判断htm文件,但是为了保持函数的统一性,就没有更改,也没有在函数上加参数。另外可惜的是,在io.h定义的内容无法搜索到其源码实现。
同时在io.h中宏定义了一些值来表示文件的类型。

#define _A_NORMAL 0x00  //普通文件
#define _A_RDONLY 0x01 //只读
#define _A_HIDDEN 0x02 //隐藏
#define _A_SYSTEM 0x04 //系统
#define _A_SUBDIR 0x10 //文件夹
#define _A_ARCH 0x20   //存档

所以整体的思路就是,利用_findfirst搜索第一个文件,然后判断是否是文件夹进行递归查询,再用得到的文件句柄使用_findnext继续搜索,最后使用_findclose结束查询。
正则表达式进行匹配
然后就是读取这些文件,并利用正则表达式进行匹配。
正则如何匹配就不讲了,网上一大堆都能搜到。这里给出一个例子。

regex tableReg("<SPAN style=\"COLOR: teal\">姓名 </SPAN>[^ -~]{2,}");
auto ret = regex_search(p,m,tableReg);
if(ret2){
            string oo = m2[0];
            e.WriteCell(ans, 1, oo.substr(19).data());
            cout << oo.substr(19).data() << endl;
        }

我就是用上面这种方式进行匹配特定标签值的。因为我提前查看的所有的htm页面的源码,他们都使用的是同一种格式,所以为了方便我直接计算字符位数截取想要的数值,但是显然这不是一种聪明的方法,有更好的方法欢迎讨论。
写excel
刚开始说实话没想到写excel会这么麻烦,后来在网上看了一圈才明白,excel不像普通文件可以直接读写,网上的大多数方案是导入excel的库,常见的是odbe,ole等方式。但是其实这样做起来是挺麻烦的,短时间内不想深入探究。于是这里想到一个曲线救国的方案,写csv,然后再讲csv文件复制到excel中,反正只是一个自动化实现功能的小脚本。
于是可以直接写一个读写csv的类,这比直接写excel简单多了。

class ExcelProcess
{
public:
    ExcelProcess(){pf=NULL;};
    ~ExcelProcess(void){ if (pf) EndWrite(); };
    
    void WriteCell(ushort row, ushort col, const char *value)
    {
        ushort iLen = (ushort)strlen(value);
        ushort clData[] = { 0x0204, ushort(8 + iLen), row, col, 0, iLen };
        WriteArray(clData, 12);
        WriteArray(value, iLen);
    }

    void WriteCell(ushort row, ushort col, int value)
    {
        ushort clData[] = { 0x027E, 10, row, col, 0 };
        WriteArray(clData, 10);
        int iValue = (value << 2) | 2;
        WriteArray(&iValue, 4);
    }

    void WriteCell(ushort row, ushort col, double value)
    {
        ushort clData[] = { 0x0203, 14, row, col, 0 };
        WriteArray(clData, 10);
        WriteArray(&value, 8);
    }

    void WriteCell(ushort row, ushort col)
    {
        ushort clData[] = { 0x0201, 6, row, col, 0x17 };
        WriteArray(clData, 10);
    }

    bool BeginWrite(const char *fileName)
    {
        pf = fopen(fileName, "wb+");
        if (!pf) return false;
        ushort clBegin[] = { 0x0809, 0x08, 0x0, 0x10, 0x0, 0x0 };
        WriteArray(clBegin, 12);
        return true;
    }

    void EndWrite()
    {
        ushort clEnd[] = { 0x0A, 0x0 };
        WriteArray(clEnd, 4);
        fclose(pf);
        pf = 0;
    }
    bool IsOpen()
    {
        if (pf!=NULL)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    void WriteArray(const void *value, ushort len)
    {
        if (pf)
            fwrite(value, 1, len, pf);
    }
private:
    FILE *pf;
};

这个类可以直接拿去用。
编码问题
当我以为所有的问题都解决时,我使用编译运行,却发现写入的值出现了乱码,于是首先在控制台中对读取的文件内容进行输出,发现在这里就出现乱码。请添加图片描述
为了解决这个问题,首先需要一些编码的基础知识,看了不少文章,这里直接给总结一下:

  1. 先从ascii编码开始,ascii使用7位来表示128个基础字符,如大小写英文字母等等
  2. 中国人通过对ascii编码进行扩展,发明了 GB2312 编码,以表示6000多个常用汉字。
  3. 但是汉字很多,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。所以GB2312是GBK编码的子集。
  4. 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
  5. 然后iso为了统一提出了UNICODE编码。但是起始准确的说,UNICODE是字符集,能够表示任何一种字符,但只是提供字符的二进制码,没有规定如何编码。
  6. 然后出现了3中对unicode进行编码的方式,分别是utf-8,utf-16le,utf-16be。简单的说就是,unicode编码分为3中,分别是utf-8、utf-16le,utf-16be。
  7. 不得不提的是BOM标志,即byte order mask. 就是放在文件的最开始位置,用来表示编码的顺序,这是一种很容易理解的思维方式。
  8. utf-16 这里的16是指16位,也就是2字节。即每两个字节编码一个字符。(离谱的是就算是英文字符也是要两个字节)。然后utf-16是必有BOM的,分别是LE(0xFF 0xFE) 和 BE(0xFE 0xFF)。这也是为什么utf-16有be和le了。这里的be和le的意思是big endian, low endian,即大段和小端的意思。
  9. utf-8分为有BOM和没有BOM的。utf-8是不定长的,可能是1-3字节。有BOM的utf-8的BOM为3个字节的前缀0xEE BB EF。
  10. 其实正常情况下utf-8编码是不带BOM的,但是是微软的习惯,为了区分uft-8和ascii等编码,一个原因是,英文大小写等基础字母在utf-8和ascii编码中是一样的。同时也是微软的习惯,默认把utf-16le成为unicode编码。

有了以上基础知识,相信一定对编码有了一个宏观的了解,至少不会凌乱了。然后下面回归我们的问题,基于上面的知识,我们可以做出以下分析:

  1. vscode 在写代码的时候默认是utf-8,这在右下角可以看到。
  2. 出现乱码问题的原因是:
    请添加图片描述
    当我试图用vscode打开htm文件时,发现编码是utf-16le。仔细看看上面的乱码,其实就是两个字节编码的原因,导致字符变宽了。
    而代码的编写编码是utf-8,这就导致了正则表达式中的汉字无法匹配的问题,以及控制台终端的编码是gbk的原因,所以显示乱码,以及写入csv的汉字出现乱码。请添加图片描述
  3. 统一编码来解决乱码问题。首先的想法是,因为htm文件打开的默认编码是utf-16le,所以不如把代码编码和控制台编码全部改成utf-16le。vscode里面更改编码很简单,右下角直接改然后重新写代码里面的中文即可。但是在终端窗口中却不好改。网上给出的两种更改方式其实本质都一样,就是利用chcp命令更改,在存在的缺点是,不够自动化。当我把脚本给朋友时,我无法做到直接使用代码更改他的环境上的控制台的编码。所以更好的方式就是,既然windows默认是gbk,那就全部统一为gbk编码。
  4. 如何把文件从utf-16le转换成gbk编码呢?最简单的方式就是用windows记事本打开文件,保存的时候选择编码。
    在这里插入图片描述
    可以看到,这里出现的编码,正好对应上面讲过的编码,utf-8带物料清单就是带BOM头的utf-8.
    那么ANSI是什么编码呢?
    在这里插入图片描述

----引用[ANSI是什么编码](https://blog.csdn.net/imxiangzi/article/details/77370160) 所以其实我们就可以暂且认为,在我们的环境下,ANSI编码就是GBK编码,但是我们不可能一个一个打开文件转换编码吧,我们需要用代码的方式转换文件的编码。

文件编码转换为ANSI编码

/*
 * 将路径fpath所指的文件从各种编码格式,转换为ANSI格式
 *
 * Copyright (c) 2013 赵子清, All rights reserved.
 *
 */
#include <bits/stdc++.h>
#include <windows.h>
#define CODE_FORMAT_ANSI        1
#define CODE_FORMAT_UTF8        2
#define CODE_FORMAT_UNICODE_LE  3
#define CODE_FORMAT_UNICODE_BE  4

typedef int ErrorCode;
#define    ERR_OK                  0
#define    ERR_FILE_OPEN_FAILED    1001

#define SWAP16(x) \
    ((((x) & 0x00ff) << 8) | \
    (((x) & 0xff00) >> 8) )

#define SWAP32(x) \
    ((((x) & 0x000000ff) << 24) | \
    (((x) & 0x0000ff00) <<  8) | \
    (((x) & 0x00ff0000) >>  8) | \
    (((x) & 0xff000000) >> 24) )

#define SAFE_DELETE(x) if((x)!=0) {delete[] (x); (x) = 0; }

ErrorCode  ConvertFormat(const char* fpath)
{
    assert(fpath != 0);

    FILE* fp = ::fopen(fpath, "rb");
    if(fp == NULL)
        return ERR_FILE_OPEN_FAILED;

    int fmtFlag;
    int fmt = CODE_FORMAT_ANSI;
    ::fread(&fmtFlag, sizeof(int), 1, fp);
    ::fclose(fp);

    fmtFlag = SWAP32(fmtFlag);
    if((fmtFlag & 0xffffff00) == 0xefbbbf00)
        fmt = CODE_FORMAT_UTF8;
    else if((fmtFlag & 0xffff0000) == 0xfffe0000)
        fmt = CODE_FORMAT_UNICODE_LE;
    else if((fmtFlag & 0xffff0000) == 0xfeff0000)
        fmt = CODE_FORMAT_UNICODE_BE;


    if(fmt == CODE_FORMAT_ANSI)
        return ERR_OK;

    fp = ::fopen(fpath, "rb");
    char* txt = 0;
    wchar_t* wtxt = 0;
    long flen = 0L;
    ::fseek(fp, 0L, SEEK_END);
    flen = ftell(fp);
    ::rewind(fp);
    if(fmt == CODE_FORMAT_UTF8)
    {
        txt = new char[flen+1];
        ::fread(txt, 1, flen, fp);
        txt[flen] = '\0';
    }
    else if(fmt == CODE_FORMAT_UNICODE_LE || fmt == CODE_FORMAT_UNICODE_BE)
    {
        wtxt = new wchar_t[flen/2 +1];
        ::fread(wtxt, 2, flen/2, fp);
        if(fmt == CODE_FORMAT_UNICODE_BE)
        {
            for(int i=0; i < flen/2; i++)
                wtxt[i] = SWAP16(wtxt[i]);
        }
        wtxt[flen/2] = L'\0';
    }

    ::fclose(fp);

    int nLen;
    wchar_t* pwstr = 0;
    char* pstr = 0;
    switch (fmt)
    {
    case CODE_FORMAT_UTF8:
        nLen = ::MultiByteToWideChar(CP_UTF8, 0, txt+3, -1, NULL, 0);
        pwstr = new wchar_t[nLen+1];
        nLen = ::MultiByteToWideChar(CP_UTF8, 0, txt+3, -1, pwstr, nLen);
        nLen = ::WideCharToMultiByte(CP_ACP, 0, pwstr, -1, NULL, 0, NULL, NULL);
        pstr = new char[nLen];
        ::memset(pstr, 0, nLen);
        nLen = ::WideCharToMultiByte(CP_ACP, 0, pwstr, -1, pstr,
                                nLen, NULL, NULL);
        break;
    case CODE_FORMAT_UNICODE_LE:
    case CODE_FORMAT_UNICODE_BE:
        nLen = ::WideCharToMultiByte(CP_ACP, 0, wtxt+1, -1, NULL, 0, NULL, NULL);
        pstr = new char[nLen];
        ::memset(pstr, 0, nLen);
        nLen = ::WideCharToMultiByte(CP_ACP, 0, wtxt+1, -1, pstr,
                                        nLen, NULL, NULL);
        break;
    default:
        break;
    }

    fp = ::fopen(fpath, "wb");
    ::fwrite(pstr, 1, nLen-1, fp);
    ::fclose(fp);

    SAFE_DELETE(txt);
    SAFE_DELETE(wtxt);
    SAFE_DELETE(pstr);
    SAFE_DELETE(pwstr);

    return ERR_OK;
}

代码引用自赵子清的博客
其本质是使用WideCharToMultiByte函数,在windows.h的头文件中,不具有通用性。
首先,需要知道,::可以表示全局作用域,这是因为有可能定义的局部函数或者变量和全局的名字一样,编译器可能找不到,所以加上::来确定是全局的函数与变量。
其次,读取文件的第一个字节的内容,根据BOM的内容,判断是哪种编码方式。

	#define SWAP32(x) \
    ((((x) & 0x000000ff) << 24) | \
    (((x) & 0x0000ff00) <<  8) | \
    (((x) & 0x00ff0000) >>  8) | \
    (((x) & 0xff000000) >> 24) )
	fmtFlag = SWAP32(fmtFlag);
    if((fmtFlag & 0xffffff00) == 0xefbbbf00)
        fmt = CODE_FORMAT_UTF8;
    else if((fmtFlag & 0xffff0000) == 0xfffe0000)
        fmt = CODE_FORMAT_UNICODE_LE;
    else if((fmtFlag & 0xffff0000) == 0xfeff0000)
        fmt = CODE_FORMAT_UNICODE_BE;

这里SWAP32其实就是交换32位的高低16位,比如0xABCDEF00就会转换为0x00EFCDAB,就是大小端的转换。但是其实这里我认为不需要转换也是可以的,后面作&运算时判断低位即可。
接着,求得file的文件大小。其中fseek定位到seek_end即文件末尾,然后使用ftell求得fp指针所在位置,即flen为文件的大小。

	::fseek(fp, 0L, SEEK_END);
    flen = ftell(fp);

然后再利用rewind讲fp重新指向文件的最开头。

::rewind(fp);

接着就需要读文件了。如果读入的文件是utf-8的形式,直接读,一次一个字节,flen的长度。

if(fmt == CODE_FORMAT_UTF8)
    {
        txt = new char[flen+1];
        ::fread(txt, 1, flen, fp);
        txt[flen] = '\0';
    }

如果是unicode的形式,因为两个字节编码,所以使用wchar_t来存,因为wchar_t其实就是unsigned short 两字节,并且长度减半,接着大小端转换,把所有大段全部转换成小端,这样utf-16be就也转换成了utf-16le,这样就全部当作小端来处理了。

typedef unsigned short wchar_t; //unsigned short两字节

else if(fmt == CODE_FORMAT_UNICODE_LE || fmt == CODE_FORMAT_UNICODE_BE)
    {
        wtxt = new wchar_t[flen/2 +1];
        ::fread(wtxt, 2, flen/2, fp);
        if(fmt == CODE_FORMAT_UNICODE_BE)
        {
            for(int i=0; i < flen/2; i++)
                wtxt[i] = SWAP16(wtxt[i]);
        }
        wtxt[flen/2] = L'\0';
    }

读完文件内容之后,就开始转码了,就是利用WideCharToMultiByte这个由windows提供的api进行转换。utf-8转换成ansi就是先把utf-8转换成utf16,再转成ansi,所以我们直接看utf-16

case CODE_FORMAT_UNICODE_LE:
    case CODE_FORMAT_UNICODE_BE:
        nLen = ::WideCharToMultiByte(CP_ACP, 0, wtxt+1, -1, NULL, 0, NULL, NULL);
        pstr = new char[nLen];
        ::memset(pstr, 0, nLen);
        nLen = ::WideCharToMultiByte(CP_ACP, 0, wtxt+1, -1, pstr,
                                        nLen, NULL, NULL);
        break;

这里简单的讲就是, ::WideCharToMultiByte(CP_ACP的意思是,它的意思是:我已经是utf-16了,我要转化成cp_ acp(ansi)。
同样的,utf-8的步骤中,后两步和这个是一样的,前两步就是先把utf-8转成utf-16 (WideChar 顾名思义就是宽字符,就是两个字节,utf-16两个字节编码)。::MultiByteToWideChar(CP_UTF8 就是意思为: 我现在已经是utf-8了,要转成utf-16.

至此,全部结束,就可以没有乱码地提取出htm文件中相应的属性值了。相关的资源也上传了,可以拿来参考。点击下载

References:

  1. https://www.cnblogs.com/zzqcn/archive/2013/04/25/3043730.html
  2. https://www.cnblogs.com/ranjiewen/p/5770639.html
  3. http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  4. https://blog.csdn.net/imxiangzi/article/details/77370160
  5. https://blog.csdn.net/yu704645129/article/details/79907625
  6. https://blog.csdn.net/qq1623803207/article/details/89398435
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
含本书教程PDF 共399个实例: 第1章 窗体与界面设计   1.1 菜单应用实例   cc实例001 在系统菜单中添加菜单项   cc实例002 带图标的程序菜单   cc实例003 根据表中数据动态生成菜单   cc实例004 浮动的菜单   1.2 弹出菜单应用实例   cc实例005 在控件上单击右键弹出菜单   cc实例006 个性化的弹出菜单   cc实例007 任务栏托盘弹出菜单   1.3 工具栏应用实例   cc实例008 带背景的工具栏   cc实例009 带图标的工具栏   cc实例010 带下拉菜单的工具栏   cc实例011 可调整按钮位置的工具栏   cc实例012 浮动工具栏   cc实例013 根据表中数据动态生成工具栏   cc实例014 具有提示功能的工具栏   1.4 状态栏应用实例   cc实例015 带进度条的状态栏   cc实例016 动画效果的状态栏   cc实例017 滚动字幕的状态栏   1.5 导航界面应用实例   cc实例018 Outlook导航界面   cc实例019 树状导航界面   cc实例020 按钮导航界面   cc实例021 类QQ导航菜单   1.6 界面窗体应用实例   cc实例022 背景为渐变色的程序界面   cc实例023 椭圆形的程序界面   cc实例024 自绘窗体界面   cc实例025 类似WindowscXP的程序界面   cc实例026 窗体融合技术   cc实例027 限制对话框最大时的窗口大小   1.7 多媒体宣传光盘应用实例   cc实例028 多媒体宣传光盘主界面   cc实例029 自动运行的多媒体宣传光盘   1.8 多媒体触摸屏程序应用实例   cc实例030 采购中心多媒体触摸屏程序   cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 窗体标题栏应用实例   cc实例036 闪烁的窗体标题栏   cc实例037 拖动没有标题栏的窗体   cc实例038 禁用标题栏上的最大化.c最小化或关闭按钮   1.11 窗体形状及应用   cc实例039 半透明窗体   cc实例040 创建字型窗体   cc实例041 百叶窗窗体   cc实例042 类似Office助手  第2章 控件应用   2.1 按钮控件典型实例   cc实例043 AVI动画按钮   cc实例044 GIF动画按钮   cc实例045 图文按钮   cc实例046 不规则按钮   2.2 EditBox控件典型实例   cc实例047 为EditBox设置新的系统菜单   cc实例048 为EditBox控件添加列表选择框   cc实例049 多彩边框的编辑框   cc实例050 改变编辑框文本颜色   2.3 ListBox控件典型实例   cc实例051 利用ListBox控件实现标签式数据选择   cc实例052 在ListBox控件间实现数据交换   cc实例053 列表项的提示条   2.4 ComboBox控件典型实例   cc实例054 将数据表中的字段添加到ComboBox控件   cc实例055 带查询功能的ComboBox控件   cc实例056 自动调整组合框的宽度   cc实例057 颜色组合框   cc实例058 多列显示的组合框   2.5 ListControl控件典型实例   cc实例059 将数据库中的数据表添加到ListControl控件   cc实例060 利用ListControl控件浏览数据   cc实例061 利用ListControl控件制作导航界面   cc实例062 在列表视图中拖动视图项   cc实例063 利用列标题对列表视图进行数据排序   cc实例064 具有文本录入功能的ListControl控件   2.6 TreeControl控件典型实例   cc实例065 多级数据库树状结构数据显示   cc实例066 可动态修改节点的树状结构   cc实例067 带复选功能的树状结构   cc实例068 显示磁盘目录   cc实例069 树型提示框   2.7 RichEdit控件典型实例   cc实例070 利用RichEdit显示Word文档   cc实例071 利用RichEdit控件实现文字定位与标识   cc实例072 利用RichEdit控件显示图文数据   2.8 图形类控件典型实例   cc实例073 图文数据录入   cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形技术   3.1 绘制图形   cc实例078 绘制正弦曲线   cc实例079 绘制艺术图案   cc实例080 画图程序   cc实例081 绘制立体模型   cc实例082 利用IFS算法绘制自然景物   3.2 图像预览   cc实例083 图片自动预览程序   cc实例084 图片批量浏览   cc实例085 浏览大幅BMP图片   cc实例086 放大和缩小图片   cc实例087 可随鼠标移动的图形   cc实例088 随图像大小变换的图像浏览器   3.3 图片效果   cc实例089 图片马赛克效果   cc实例090 图片百叶窗效果   cc实例091 电影胶片特效   cc实例092 翻转图片效果   3.4 图片颜色转换   cc实例093 图像的锐化处理   cc实例094 图片反色处理   cc实例095 图像的灰度化转换   cc实例096 显示JPG图片   3.5 图形转换与缩放   cc实例097 将位图转换为JPG   cc实例098 将位图转为GIF图标   cc实例099 图片的平滑缩放   3.6 图像的剪切与合成   cc实例100 图像的剪切   cc实例101 图像的合成  3.7 图像识别   cc实例102 获取鼠标任意位置的颜色值   cc实例103 提取图片中的对象   cc实例104 手写数字识别   3.8 图像字体  cc 实例105 旋转的文字   cc实例106 当前系统字体列表   cc实例107 空心文字   cc实例108 如何在图片上平滑移动文字   3.9 图像管理   cc实例109 管理计算机内图片文件的程序   cc实例110 提取并保存应用程序图标   3.10 图片动画   cc实例111 利用图片制作屏幕保护程序   cc实例112 图片动画   3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例118 利用OpenGL绘制NURBS曲线  第4章 多媒体技术   4.1 动画   cc实例119 利用Image控件制作小动画   cc实例120 透明的Flash动画   cc实例121 播放GIF动画   cc实例122 播放AVI动画   cc实例123 播放VCD   4.2 制作与播放音频   cc实例124 可以选择播放曲目的CD播放器   cc实例125 MP3播放器   cc实例126 声音录制与播放   cc实例127 制作RealOne播放器   4.3 多媒体控制   cc实例128 部队早起军号程序   cc实例129 利用PC喇叭播放声音   cc实例130 c控制左右声道   4.4 屏幕保护相关程序   cc实例131 电子相册屏幕保护程序   cc实例132 产品宣传屏幕保护程序   4.5 DirectShow程序设计   cc实例133 音频捕捉   cc实例134 视频捕捉  第5章 文件系统   5.1 文件的基本操作   cc实例135 创建和删除文件夹   cc实例136 把文件删除到回收站中   cc实例137 清空回收站   5.2 查找文件   cc实例138 搜索文件   cc实例139 检查文件是否存在   cc实例140 提取指定文件夹目录到INI文件   5.3 与文件目录相关的命令操作   cc实例141 删除文件目录   cc实例142 重命名文件目录   5.4 文件.c文件夹的复制和移动   cc实例143 批量移动文件   cc实例144 网络文件夹复制   cc实例145 文件复制过程中显示进度条   5.5 文件修改   cc实例146 更改文件夹图标   cc实例147 批量删除指定类型的文件   cc实例148 批量重命名文件   cc实例149 修改文件属性   cc实例150 修改文件及目录的名称   5.6 文件的读取与保存   cc实例151 顺序读取文件   cc实例152 制作日志文件   5.7 文件管理   cc实例153 分类整理磁盘文件   cc实例154 计算机磁盘空间报警程序   cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例160 用WinRar压缩和解压文件   cc实例161 判断文件是否被改动   第6章 操作系统与Windows相关程序   6.1 启动相关设置   cc实例162 进入WindowscXP前发出警告   cc实例163 实现关机.c重启计算机   cc实例164 将程序设置成为开机自动执行的程序   6.2 磁盘相关设置   cc实例165 判断驱动器属性   cc实例166 获取磁盘空间信息   cc实例167 获取磁盘序列号   cc实例168 取消磁盘共享   cc实例169 格式化磁盘   6.3 桌面相关设置   cc实例170 隐藏.c显示“开始”按钮   cc实例171 隐藏.c显示桌面文件   cc实例172 隐藏.c显示Windows任务栏   6.4 系统相关设置   cc实例173 获得Windows和System的路径   cc实例174 控制光驱的弹开与关闭   cc实例175 启动控制面板   cc实例176 为程序添加快捷键   6.5 系统监控   cc实例177 检测系统启动模式   cc实例178 内存使用状态   cc实例179 监视剪贴板内容   cc实例180 利用钩子技术实现键盘监控   6.6 程序相关设置   cc实例181 用列表显示系统正在运行的程序   cc实例182 为程序添加快捷方式   cc实例183 设置其他程序中编辑框内的文本   cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用临界区实现线程同步   cc实例189 用信号量实现线程同步   cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c“网上邻居”   cc实例194 隐藏.c显示驱动器   7.2 IE设置   cc实例195 修改IE标题栏内容   cc实例196 隐藏IE浏览器的右键关联菜单   cc实例197 设置IE的默认主页   cc实例198 清空上网历史记录   7.3 文件控制   cc实例199 如何建立文件关联   cc实例200 控制光驱的自动运行功能   7.4 游戏设置   cc实例201 设置“蜘蛛纸牌”游戏   cc实例202 修改“扫雷”游戏的设置   7.5 应用软件设置   cc实例203 设置Wordc2000文档及图片的保存路径   cc实例204 更改Photoshop安装时的登记信息  第8章 数据库技术   8.1 连接数据库   cc实例205 使用ODBCcDSN连接SQLcServer数据库   cc实例206 用ADO动态连接数据库   cc实例207c连接Oracle数据库   8.2 添加数据   cc实例208 利用INSERT语句批量插入数据   cc实例209 利用SELECTcINTO生成临时表   8.3 更新数据   cc实例210 批量修改数据   cc实例211 将指定字段数据为空的记录添上数据   8.4 删除数据   cc实例212 删除单条数据   cc实例213 删除数据库中无用处的记录   8.5 视图   cc实例214 动态创建视图   cc实例215 通过视图更改数据   cc实例216 删除视图   8.6 触发器   cc实例217 创建触发器   cc实例218 在程序中使用触发器   8.7 存储过程   cc实例219 创建存储过程   cc实例220 删除存储过程   cc实例221 在程序中使用存储过程   cc实例222 调用具有输出参数的存储过程   8.8 数据库结构的读取与修改   cc实例223 读取Access数据库结构   cc实例224 读取SQLcServer数据库结构   8.9 图片.c多媒体数据录入技术   cc实例225 对Access数据库进行录入和提取图片   cc实例226 对SQLServer数据库进行录入和提取多媒体文件   cc实例227 对SQLcServer数据库进行录入和存储Word文档   8.10 数据备份恢复   cc实例228 Access数据库备份与还原   cc实例229 SQLcServer数据库备份与恢复   cc实例230 定时数据备份   8.11 其他数据库技术    实例231 断开SQLcServer数据库与其他应用程序的连接   cc实例232 在VisualcC++中执行事务   cc实例233 在程序中执行SQL脚本   cc实例234 利用SQL语句执行外围命令  第9章 SQL查询相关技术   9.1 通用查询   cc实例235 SQL语句的应用方法   cc实例236 SQL语句的模糊查询   cc实例237 利用查询语句复制表结构   9.2 查询控件   cc实例238 查询指定控件内字符串   cc实例239 查询日期控件内数据   cc实例240 控件作为字段.c操作符和内容进行查询   cc实例241 巧妙获取年龄   cc实例242 格式化金额   cc实例243 如何随机显示记录   9.3 查询前若干名数据   cc实例244 查询前10名数据   cc实例245 取出数据统计结果前3名数据   9.4 周期.c日期查询   cc实例246 查询指定日期的数据   cc实例247 查询指定时间段的数据   cc实例248 按月查询数据   9.5 大小比较.c逻辑查询.c重复记录查询   cc实例249 查询数据大于指定条件的数据   cc实例250 NOT与谓词进行组合条件的查询   cc实例251 查询时不显示重复记录   9.6 排序.c分组统计   cc实例252 对数据进行降序查询   cc实例253 对数据进行多条件排序   cc实例254 按仓库分组统计图书库存(多列)   cc实例255 多表分组统计   9.7 HAVING语句应用   cc实例256 利用HAVING语句过滤分组数据   cc实例257 将HAVING语句应用在多表查询中   9.8 聚集函数   cc实例258 利用聚集函数SUM对销售额进行汇总   cc实例259 利用聚集函数AVG求某班学生的平均年龄   cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc实例264 复杂嵌套查询   9.11 子查询   cc实例265 用子查询作派生的表   cc实例266 把子查询作为表达式   cc实例267 在UPDATE语句中应用子查询   9.12 联合语句UNION   cc实例268 使用联合查询   cc实例269 多表联合查询   cc实例270 对联合查询后的结果进行排序   9.13 内连接查询   cc实例271 简单内连接查询   cc实例272 复杂内连接查询   cc实例273 使用内连接选择一个表与另一个表中行相关的所有行   9.14 外连接查询   cc实例274 LEFTcOUTERcJOIN查询   cc实例275 RIGHTcOUTERcJOIN查询   cc实例276 使用外连接进行多表联合查询   9.15 利用IN进行查询   cc实例277 使用IN引入子查询限定查询范围   cc实例278 用IN查询表中的记录信息   9.16 交叉表查询   cc实例279 利用TRANSFORM分析数据   cc实例280 利用TRANSFORM动态分析数据   cc实例281 静态交叉表(SQLcServerc2000)   cc实例282 动态交叉表(SQLcServerc2000)   9.17 函数查询   cc实例283 在查询语句中使用字符串函数   cc实例284 在查询中使用日期函数   cc实例285 在查询时为表中的空字段添加默认信息  第10章 打印与报表技术   10.1 基础报表打印   cc实例286 基于文档/视图结构的打印   cc实例287 基于对话框结构的打印程序   10.2 打印窗体   cc实例288 打印对话框及其控件中的数据   cc实例289 打印对话框文本   10.3 打印图片   cc实例290 打印图片   cc实例291 打印简历   10.4 利用报表生成器设计报表   cc实例292 简单报表   cc实例293 分组统计报表   cc实例294 主明细报表   10.5 打印邮寄单   cc实例295 打印汇款单   cc实例296 打印信封标签   10.6 打印证件   cc实例297 批量打印工作证   cc实例298 批量打印证书   10.7 打印单据   cc实例299 库存盘点单打印   cc实例300 连续纸销售单打印   cc实例301 发票打印   10.8 打印条形码和标签   cc实例302 批量打印条形码   cc实例303 打印连续号码的标签   10.9 其他格式报表打印   cc实例304 将DataGrid表格中的查询结果输出到Excel中   cc实例305 利用Word打印   cc实例306 利用Excel打印   10.10 控制打印   cc实例307 打印超长字符串自动换行   cc实例308 批量打印文档   cc实例309 实现横向打印   cc实例310 设置打印纸大小   cc实例311 获取打印纸的左边距和上边距   10.11 打印预览   cc实例312 修改文档/视图结构默认的打印预栏工具栏   cc实例313 自定义具有滚动条的打印预览窗口  第11章 图表技术   11.1 简单图表   cc实例314 利用图表分析产品价格行情   cc实例315 对图表数据进行打印   11.2 柱形图表   cc实例316 将汇总数据利用图表分析   cc实例317 对比数据分析   11.3 饼形图表   cc实例318 饼形图分析公司男女比例   cc实例319 商品日销售额图表分析  第12章 硬件相关开发技术   12.1 串口控制   cc实例320 通过串口传递数据   cc实例321 通过串口控制对方计算机关闭   12.2 加密狗   cc实例322 将密码写入加密狗   cc实例323 使用加密狗进行身份验证   12.3 IC卡的应用   cc实例324 向IC卡中写入数据   cc实例325 读取IC卡中的数据   cc实例326 利用IC卡制作考勤程序   12.4 监控   cc实例327 利用简易摄像头编写监控程序   cc实例328 编写监控录像程序   cc实例329 定时监控程序   cc实例330 医疗行业数字视频监控系统   cc实例331 远程视频监控系统   12.5 扫描.c条形码.cPOS控制   cc实例332 利用条形码扫描器销售商品   cc实例333 设计钱箱控制程序   cc实例334 设计扫描仪控制程序   cc实例335 设计发票机控制程序   12.6 语音卡控制   cc实例336 语音卡电话呼叫系统   cc实例337 语音卡实现来电显示   cc实例338 利用语音卡实现电话录音   cc实例339 利用语音卡实现点歌祝福   12.7 手机程序的开发   cc实例340 利用短信猫发送短信   cc实例341 利用短信远程关闭计算机   12.8 其他程序   cc实例342 利用神龙卡制作练歌房程序  第13章 网络开发技术   13.1 获取计算机信息   cc实例343 获取计算机名称和工作组  cc 实例344 通过计算机名获取IP地址   cc实例345 获取本机MAC地址   cc实例346 获得系统打开的端口和状态   13.2 局域网控制与管理   cc实例347 获取局域网中的计算机名称和IP地址   cc实例348 远程控制局域网中的计算机   13.3 局域网资源管理   cc实例349 局域网屏幕监控   cc实例350 提取局域网信息到数据库   13.4 网上资源共享   cc实例351 获得网上共享资源   cc实例352 映射网络驱动器   cc实例353 定时网络共享控制   13.5 网络连接与通信   cc实例354 编程实现ping操作   cc实例355 网络语音电话   cc实例356 网络流量监控   cc实例357 取得Modem的状态   cc实例358 检测TCP/IP是否安装   cc实例359 实现进程间的通信   cc实例360 利用内存映射实现进程间的通信   13.6 局域网应用   cc实例361 局域网聊天程序   cc实例362 网上调查   13.7 其他   cc实例363 获得拨号网络的列表   cc实例364 获取计算机上串口的数量   cc实例365 检测系统中安装的协议   cc实例366 域名解析  第14章 Web编程   14.1 上网控制   cc实例367 定时登录Internet   cc实例368 根据网络连接控制IE启动   14.2 文件上传与下载   cc实例369 FTP文件上传程序   cc实例370 利用VisualcC++实现软件下载   cc实例371 HTTP服务器多线程文件下载   14.3 邮件管理   cc实例372 邮件接收程序  cc 实例373 发送电子邮件附件   14.4 上网监控   cc实例374 监控上网过程   cc实例375 网络监听工具   14.5 浏览器应用   cc实例376 制作自己的网络浏览软件   cc实例377 XML数据库文档的浏览   14.6 网上信息提取   cc实例378 定时提取网页源码   cc实例379 网上天气预报   cc实例380 网页链接提取器   14.7 其他   cc实例381 利用TAPI实现网络拨号  第15章 加密.c安全与软件注册   15.1 数据加密与解密   cc实例382 数据加密技术   cc实例383 文本文件的加密与解密  cc 实例384 利用图片加密文件   15.2 Access数据库安全   cc实例385 编程修复Access数据库   cc实例386 对数据库中的表锁定和解锁   cc实例387 改变Accessc2000数据库头文件来加密数据库   15.3 软件注册与加密   cc实例388 利用INI文件对软件进行注册   cc实例389 利用注册表设计软件注册程序   cc实例390 利用网卡序列号设计软件注册程序   cc实例391 根据CPU序列号和磁盘序列号设计软件注册程序   15.4 计算机安全   cc实例392 设置计算机的安全等级  第16章 实用工具   16.1 数据库工具   cc实例393 自动配置ODBC的程序   cc实例394 制作SQLcServer提取器   cc实例395 自动附加SQLcServer数据库   16.2 个人工具   cc实例396 个人通讯录   cc实例397 电子名片盒   16.3 单位应用   cc实例398 局域网投票管理   cc实例399 加班网上管理 
含本书PDF教程 共399个实例: 第1章 窗体与界面设计   1.1 菜单应用实例   cc实例001 在系统菜单中添加菜单项   cc实例002 带图标的程序菜单   cc实例003 根据表中数据动态生成菜单   cc实例004 浮动的菜单   1.2 弹出菜单应用实例   cc实例005 在控件上单击右键弹出菜单   cc实例006 个性化的弹出菜单   cc实例007 任务栏托盘弹出菜单   1.3 工具栏应用实例   cc实例008 带背景的工具栏   cc实例009 带图标的工具栏   cc实例010 带下拉菜单的工具栏   cc实例011 可调整按钮位置的工具栏   cc实例012 浮动工具栏   cc实例013 根据表中数据动态生成工具栏   cc实例014 具有提示功能的工具栏   1.4 状态栏应用实例   cc实例015 带进度条的状态栏   cc实例016 动画效果的状态栏   cc实例017 滚动字幕的状态栏   1.5 导航界面应用实例   cc实例018 Outlook导航界面   cc实例019 树状导航界面   cc实例020 按钮导航界面   cc实例021 类QQ导航菜单   1.6 界面窗体应用实例   cc实例022 背景为渐变色的程序界面   cc实例023 椭圆形的程序界面   cc实例024 自绘窗体界面   cc实例025 类似WindowscXP的程序界面   cc实例026 窗体融合技术   cc实例027 限制对话框最大时的窗口大小   1.7 多媒体宣传光盘应用实例   cc实例028 多媒体宣传光盘主界面   cc实例029 自动运行的多媒体宣传光盘   1.8 多媒体触摸屏程序应用实例   cc实例030 采购中心多媒体触摸屏程序   cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动的窗体   cc实例033 始终在最上面的窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 窗体标题栏应用实例   cc实例036 闪烁的窗体标题栏   cc实例037 拖动没有标题栏的窗体   cc实例038 禁用标题栏上的最大化.c最小化或关闭按钮   1.11 窗体形状及应用   cc实例039 半透明窗体   cc实例040 创建字型窗体   cc实例041 百叶窗窗体   cc实例042 类似Office助手  第2章 控件应用   2.1 按钮控件典型实例   cc实例043 AVI动画按钮   cc实例044 GIF动画按钮   cc实例045 图文按钮   cc实例046 不规则按钮   2.2 EditBox控件典型实例   cc实例047 为EditBox设置新的系统菜单   cc实例048 为EditBox控件添加列表选择框   cc实例049 多彩边框的编辑框   cc实例050 改变编辑框文本颜色   2.3 ListBox控件典型实例   cc实例051 利用ListBox控件实现标签式数据选择   cc实例052 在ListBox控件间实现数据交换   cc实例053 列表项的提示条   2.4 ComboBox控件典型实例   cc实例054 将数据表中的字段添加到ComboBox控件   cc实例055 带查询功能的ComboBox控件   cc实例056 自动调整组合框的宽度   cc实例057 颜色组合框   cc实例058 多列显示的组合框   2.5 ListControl控件典型实例   cc实例059 将数据库中的数据表添加到ListControl控件   cc实例060 利用ListControl控件浏览数据   cc实例061 利用ListControl控件制作导航界面   cc实例062 在列表视图中拖动视图项   cc实例063 利用列标题对列表视图进行数据排序   cc实例064 具有文本录入功能的ListControl控件   2.6 TreeControl控件典型实例   cc实例065 多级数据库树状结构数据显示   cc实例066 可动态修改节点的树状结构   cc实例067 带复选功能的树状结构   cc实例068 显示磁盘目录   cc实例069 树型提示框   2.7 RichEdit控件典型实例   cc实例070 利用RichEdit显示Word文档   cc实例071 利用RichEdit控件实现文字定位与标识   cc实例072 利用RichEdit控件显示图文数据   2.8 图形类控件典型实例   cc实例073 图文数据录入   cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形技术   3.1 绘制图形   cc实例078 绘制正弦曲线   cc实例079 绘制艺术图案   cc实例080 画图程序   cc实例081 绘制立体模型   cc实例082 利用IFS算法绘制自然景物   3.2 图像预览   cc实例083 图片自动预览程序   cc实例084 图片批量浏览   cc实例085 浏览大幅BMP图片   cc实例086 放大和缩小图片   cc实例087 可随鼠标移动的图形   cc实例088 随图像大小变换的图像浏览器   3.3 图片效果   cc实例089 图片马赛克效果   cc实例090 图片百叶窗效果   cc实例091 电影胶片特效   cc实例092 翻转图片效果   3.4 图片颜色转换   cc实例093 图像的锐化处理   cc实例094 图片反色处理   cc实例095 图像的灰度化转换   cc实例096 显示JPG图片   3.5 图形转换与缩放   cc实例097 将位图转换为JPG   cc实例098 将位图转为GIF图标   cc实例099 图片的平滑缩放   3.6 图像的剪切与合成   cc实例100 图像的剪切   cc实例101 图像的合成  3.7 图像识别   cc实例102 获取鼠标任意位置的颜色值   cc实例103 提取图片中的对象   cc实例104 手写数字识别   3.8 图像字体  cc 实例105 旋转的文字   cc实例106 当前系统字体列表   cc实例107 空心文字   cc实例108 如何在图片上平滑移动文字   3.9 图像管理   cc实例109 管理计算机内图片文件的程序   cc实例110 提取并保存应用程序图标   3.10 图片动画   cc实例111 利用图片制作屏幕保护程序   cc实例112 图片动画   3.11 简单游戏设计   cc实例113 拼图游戏   cc实例114 网络五子棋   cc实例115 彩票抽奖机   3.12 OpenGL程序设计   cc实例116 制作OpenGL动画   cc实例117 利用OpenGL绘制立体模型   cc实例118 利用OpenGL绘制NURBS曲线  第4章 多媒体技术   4.1 动画   cc实例119 利用Image控件制作小动画   cc实例120 透明的Flash动画   cc实例121 播放GIF动画   cc实例122 播放AVI动画   cc实例123 播放VCD   4.2 制作与播放音频   cc实例124 可以选择播放曲目的CD播放器   cc实例125 MP3播放器   cc实例126 声音录制与播放   cc实例127 制作RealOne播放器   4.3 多媒体控制   cc实例128 部队早起军号程序   cc实例129 利用PC喇叭播放声音   cc实例130 c控制左右声道   4.4 屏幕保护相关程序   cc实例131 电子相册屏幕保护程序   cc实例132 产品宣传屏幕保护程序   4.5 DirectShow程序设计   cc实例133 音频捕捉   cc实例134 视频捕捉  第5章 文件系统   5.1 文件的基本操作   cc实例135 创建和删除文件夹   cc实例136 把文件删除到回收站中   cc实例137 清空回收站   5.2 查找文件   cc实例138 搜索文件   cc实例139 检查文件是否存在   cc实例140 提取指定文件夹目录到INI文件   5.3 与文件目录相关的命令操作   cc实例141 删除文件目录   cc实例142 重命名文件目录   5.4 文件.c文件夹的复制和移动   cc实例143 批量移动文件   cc实例144 网络文件夹复制   cc实例145 文件复制过程中显示进度条   5.5 文件修改   cc实例146 更改文件夹图标   cc实例147 批量删除指定类型的文件   cc实例148 批量重命名文件   cc实例149 修改文件属性   cc实例150 修改文件及目录的名称   5.6 文件的读取与保存   cc实例151 顺序读取文件   cc实例152 制作日志文件   5.7 文件管理   cc实例153 分类整理磁盘文件   cc实例154 计算机磁盘空间报警程序   cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例160 用WinRar压缩和解压文件   cc实例161 判断文件是否被改动   第6章 操作系统与Windows相关程序   6.1 启动相关设置   cc实例162 进入WindowscXP前发出警告   cc实例163 实现关机.c重启计算机   cc实例164 将程序设置成为开机自动执行的程序   6.2 磁盘相关设置   cc实例165 判断驱动器属性   cc实例166 获取磁盘空间信息   cc实例167 获取磁盘序列号   cc实例168 取消磁盘共享   cc实例169 格式化磁盘   6.3 桌面相关设置   cc实例170 隐藏.c显示“开始”按钮   cc实例171 隐藏.c显示桌面文件   cc实例172 隐藏.c显示Windows任务栏   6.4 系统相关设置   cc实例173 获得Windows和System的路径   cc实例174 控制光驱的弹开与关闭   cc实例175 启动控制面板   cc实例176 为程序添加快捷键   6.5 系统监控   cc实例177 检测系统启动模式   cc实例178 内存使用状态   cc实例179 监视剪贴板内容   cc实例180 利用钩子技术实现键盘监控   6.6 程序相关设置   cc实例181 用列表显示系统正在运行的程序   cc实例182 为程序添加快捷方式   cc实例183 设置其他程序中编辑框内的文本   cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用临界区实现线程同步   cc实例189 用信号量实现线程同步   cc实例190 多线程cc实例   6.8 鼠标.c键盘相关设置   cc实例191 动画鼠标   cc实例192 限制鼠标移动区域  第7章 注册表   7.1 显示与隐藏  cc 实例193 隐藏.c显示“我的电脑”.c“回收站”.c“网上邻居”   cc实例194 隐藏.c显示驱动器   7.2 IE设置   cc实例195 修改IE标题栏内容   cc实例196 隐藏IE浏览器的右键关联菜单   cc实例197 设置IE的默认主页   cc实例198 清空上网历史记录   7.3 文件控制   cc实例199 如何建立文件关联   cc实例200 控制光驱的自动运行功能   7.4 游戏设置   cc实例201 设置“蜘蛛纸牌”游戏   cc实例202 修改“扫雷”游戏的设置   7.5 应用软件设置   cc实例203 设置Wordc2000文档及图片的保存路径   cc实例204 更改Photoshop安装时的登记信息  第8章 数据库技术   8.1 连接数据库   cc实例205 使用ODBCcDSN连接SQLcServer数据库   cc实例206 用ADO动态连接数据库   cc实例207c连接Oracle数据库   8.2 添加数据   cc实例208 利用INSERT语句批量插入数据   cc实例209 利用SELECTcINTO生成临时表   8.3 更新数据   cc实例210 批量修改数据   cc实例211 将指定字段数据为空的记录添上数据   8.4 删除数据   cc实例212 删除单条数据   cc实例213 删除数据库中无用处的记录   8.5 视图   cc实例214 动态创建视图   cc实例215 通过视图更改数据   cc实例216 删除视图   8.6 触发器   cc实例217 创建触发器   cc实例218 在程序中使用触发器   8.7 存储过程   cc实例219 创建存储过程   cc实例220 删除存储过程   cc实例221 在程序中使用存储过程   cc实例222 调用具有输出参数的存储过程   8.8 数据库结构的读取与修改   cc实例223 读取Access数据库结构   cc实例224 读取SQLcServer数据库结构   8.9 图片.c多媒体数据录入技术   cc实例225 对Access数据库进行录入和提取图片   cc实例226 对SQLServer数据库进行录入和提取多媒体文件   cc实例227 对SQLcServer数据库进行录入和存储Word文档   8.10 数据备份恢复   cc实例228 Access数据库备份与还原   cc实例229 SQLcServer数据库备份与恢复   cc实例230 定时数据备份   8.11 其他数据库技术    实例231 断开SQLcServer数据库与其他应用程序的连接   cc实例232 在VisualcC++中执行事务   cc实例233 在程序中执行SQL脚本   cc实例234 利用SQL语句执行外围命令  第9章 SQL查询相关技术   9.1 通用查询   cc实例235 SQL语句的应用方法   cc实例236 SQL语句的模糊查询   cc实例237 利用查询语句复制表结构   9.2 查询控件   cc实例238 查询指定控件内字符串   cc实例239 查询日期控件内数据   cc实例240 控件作为字段.c操作符和内容进行查询   cc实例241 巧妙获取年龄   cc实例242 格式化金额   cc实例243 如何随机显示记录   9.3 查询前若干名数据   cc实例244 查询前10名数据   cc实例245 取出数据统计结果前3名数据   9.4 周期.c日期查询   cc实例246 查询指定日期的数据   cc实例247 查询指定时间段的数据   cc实例248 按月查询数据   9.5 大小比较.c逻辑查询.c重复记录查询   cc实例249 查询数据大于指定条件的数据   cc实例250 NOT与谓词进行组合条件的查询   cc实例251 查询时不显示重复记录   9.6 排序.c分组统计   cc实例252 对数据进行降序查询   cc实例253 对数据进行多条件排序   cc实例254 按仓库分组统计图书库存(多列)   cc实例255 多表分组统计   9.7 HAVING语句应用   cc实例256 利用HAVING语句过滤分组数据   cc实例257 将HAVING语句应用在多表查询中   9.8 聚集函数   cc实例258 利用聚集函数SUM对销售额进行汇总   cc实例259 利用聚集函数AVG求某班学生的平均年龄   cc实例260 利用聚集函数COUNT求日销售额大于某值的商品数   9.9 多表查询   cc实例261 利用FROM子句进行多表查询   cc实例262 合并多个结果集   9.10 嵌套查询   cc实例263 简单嵌套查询   cc实例264 复杂嵌套查询   9.11 子查询   cc实例265 用子查询作派生的表   cc实例266 把子查询作为表达式   cc实例267 在UPDATE语句中应用子查询   9.12 联合语句UNION   cc实例268 使用联合查询   cc实例269 多表联合查询   cc实例270 对联合查询后的结果进行排序   9.13 内连接查询   cc实例271 简单内连接查询   cc实例272 复杂内连接查询   cc实例273 使用内连接选择一个表与另一个表中行相关的所有行   9.14 外连接查询   cc实例274 LEFTcOUTERcJOIN查询   cc实例275 RIGHTcOUTERcJOIN查询   cc实例276 使用外连接进行多表联合查询   9.15 利用IN进行查询   cc实例277 使用IN引入子查询限定查询范围   cc实例278 用IN查询表中的记录信息   9.16 交叉表查询   cc实例279 利用TRANSFORM分析数据   cc实例280 利用TRANSFORM动态分析数据   cc实例281 静态交叉表(SQLcServerc2000)   cc实例282 动态交叉表(SQLcServerc2000)   9.17 函数查询   cc实例283 在查询语句中使用字符串函数   cc实例284 在查询中使用日期函数   cc实例285 在查询时为表中的空字段添加默认信息  第10章 打印与报表技术   10.1 基础报表打印   cc实例286 基于文档/视图结构的打印   cc实例287 基于对话框结构的打印程序   10.2 打印窗体   cc实例288 打印对话框及其控件中的数据   cc实例289 打印对话框文本   10.3 打印图片   cc实例290 打印图片   cc实例291 打印简历   10.4 利用报表生成器设计报表   cc实例292 简单报表   cc实例293 分组统计报表   cc实例294 主明细报表   10.5 打印邮寄单   cc实例295 打印汇款单   cc实例296 打印信封标签   10.6 打印证件   cc实例297 批量打印工作证   cc实例298 批量打印证书   10.7 打印单据   cc实例299 库存盘点单打印   cc实例300 连续纸销售单打印   cc实例301 发票打印   10.8 打印条形码和标签   cc实例302 批量打印条形码   cc实例303 打印连续号码的标签   10.9 其他格式报表打印   cc实例304 将DataGrid表格中的查询结果输出到Excel中   cc实例305 利用Word打印   cc实例306 利用Excel打印   10.10 控制打印   cc实例307 打印超长字符串自动换行   cc实例308 批量打印文档   cc实例309 实现横向打印   cc实例310 设置打印纸大小   cc实例311 获取打印纸的左边距和上边距   10.11 打印预览   cc实例312 修改文档/视图结构默认的打印预栏工具栏   cc实例313 自定义具有滚动条的打印预览窗口  第11章 图表技术   11.1 简单图表   cc实例314 利用图表分析产品价格行情   cc实例315 对图表数据进行打印   11.2 柱形图表   cc实例316 将汇总数据利用图表分析   cc实例317 对比数据分析   11.3 饼形图表   cc实例318 饼形图分析公司男女比例   cc实例319 商品日销售额图表分析  第12章 硬件相关开发技术   12.1 串口控制   cc实例320 通过串口传递数据   cc实例321 通过串口控制对方计算机关闭   12.2 加密狗   cc实例322 将密码写入加密狗   cc实例323 使用加密狗进行身份验证   12.3 IC卡的应用   cc实例324 向IC卡中写入数据   cc实例325 读取IC卡中的数据   cc实例326 利用IC卡制作考勤程序   12.4 监控   cc实例327 利用简易摄像头编写监控程序   cc实例328 编写监控录像程序   cc实例329 定时监控程序   cc实例330 医疗行业数字视频监控系统   cc实例331 远程视频监控系统   12.5 扫描.c条形码.cPOS控制   cc实例332 利用条形码扫描器销售商品   cc实例333 设计钱箱控制程序   cc实例334 设计扫描仪控制程序   cc实例335 设计发票机控制程序   12.6 语音卡控制   cc实例336 语音卡电话呼叫系统   cc实例337 语音卡实现来电显示   cc实例338 利用语音卡实现电话录音   cc实例339 利用语音卡实现点歌祝福   12.7 手机程序的开发   cc实例340 利用短信猫发送短信   cc实例341 利用短信远程关闭计算机   12.8 其他程序   cc实例342 利用神龙卡制作练歌房程序  第13章 网络开发技术   13.1 获取计算机信息   cc实例343 获取计算机名称和工作组  cc 实例344 通过计算机名获取IP地址   cc实例345 获取本机MAC地址   cc实例346 获得系统打开的端口和状态   13.2 局域网控制与管理   cc实例347 获取局域网中的计算机名称和IP地址   cc实例348 远程控制局域网中的计算机   13.3 局域网资源管理   cc实例349 局域网屏幕监控   cc实例350 提取局域网信息到数据库   13.4 网上资源共享   cc实例351 获得网上共享资源   cc实例352 映射网络驱动器   cc实例353 定时网络共享控制   13.5 网络连接与通信   cc实例354 编程实现ping操作   cc实例355 网络语音电话   cc实例356 网络流量监控   cc实例357 取得Modem的状态   cc实例358 检测TCP/IP是否安装   cc实例359 实现进程间的通信   cc实例360 利用内存映射实现进程间的通信   13.6 局域网应用   cc实例361 局域网聊天程序   cc实例362 网上调查   13.7 其他   cc实例363 获得拨号网络的列表   cc实例364 获取计算机上串口的数量   cc实例365 检测系统中安装的协议   cc实例366 域名解析  第14章 Web编程   14.1 上网控制   cc实例367 定时登录Internet   cc实例368 根据网络连接控制IE启动   14.2 文件上传与下载   cc实例369 FTP文件上传程序   cc实例370 利用VisualcC++实现软件下载   cc实例371 HTTP服务器多线程文件下载   14.3 邮件管理   cc实例372 邮件接收程序  cc 实例373 发送电子邮件附件   14.4 上网监控   cc实例374 监控上网过程   cc实例375 网络监听工具   14.5 浏览器应用   cc实例376 制作自己的网络浏览软件   cc实例377 XML数据库文档的浏览   14.6 网上信息提取   cc实例378 定时提取网页源码   cc实例379 网上天气预报   cc实例380 网页链接提取器   14.7 其他   cc实例381 利用TAPI实现网络拨号  第15章 加密.c安全与软件注册   15.1 数据加密与解密   cc实例382 数据加密技术   cc实例383 文本文件的加密与解密  cc 实例384 利用图片加密文件   15.2 Access数据库安全   cc实例385 编程修复Access数据库   cc实例386 对数据库中的表锁定和解锁   cc实例387 改变Accessc2000数据库头文件来加密数据库   15.3 软件注册与加密   cc实例388 利用INI文件对软件进行注册   cc实例389 利用注册表设计软件注册程序   cc实例390 利用网卡序列号设计软件注册程序   cc实例391 根据CPU序列号和磁盘序列号设计软件注册程序   15.4 计算机安全   cc实例392 设置计算机的安全等级  第16章 实用工具   16.1 数据库工具   cc实例393 自动配置ODBC的程序   cc实例394 制作SQLcServer提取器   cc实例395 自动附加SQLcServer数据库   16.2 个人工具   cc实例396 个人通讯录   cc实例397 电子名片盒   16.3 单位应用   cc实例398 局域网投票管理   cc实例399 加班网上管理 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值