Windows C

图形程序设计

清华大学出版社

根据教材制作讲稿

2003.3.3.

目录

Windows C 图形程序设计

C++语言 图形程序设计

C 语言 图形程序设计

 

正文

第2章 Visual C++ 6.0 基本操作

2.2 利用 Visual C++ 6.0 编写应用程序的一般过程

2.2.1 新建项目(P17)

  文件—新建—项目(Project)—Win32 应用—

  项目名:如,WCTCS(Windows C 图形程序设计);

  位置:如,F:/WCTCS;

  创建新的工作台(Workspace);

  平台(Platforms):Win32

  Win32应用—选下列要用的一种:

  空项目(An empty project):自己新建立项目;

  简单的Win32应用:已经有Win32应用程序;

  典型的"Hello World!"应用:已经有"Hello World!"应用程序。

2.2.2 添加代码(P18)

 * 新项目窗口—文件视图(File View)—展开 WCTCS File—

   右击源文件—添加文件到文件夹—文件名:如,WCTCS

   展开源文件—双击 WCTCS.cpp—添加代码;

 * 新项目窗口—文件—新建—选下列要用的一种:

   头文件(C++ Head File);

   源文件(C++ Source File);

   资源文件(Resource Script);

   填写选项:

   添加到项目:如,WCTCS;

   文件名:如,WCTCS

   位置:如,F:/WCTCS

 * 新项目窗口—项目—添加到项目—新建—文件卡—

   选下列要用的一种:

   头文件(C++ Head File);

   源文件(C++ Source File);

   资源文件(Resource Script);

   填写选项:

   添加到项目:如,WCTCS;

   文件名:如,WCTCS

   位置:如,F:/WCTCS

2.2.3 添加资源(P20)

2.2.3.1 新建资源文件

 新项目窗口—项目—添加到项目—新建—

  文件卡—资源文件(Resource Script);

   填写选项:

   添加到项目:如,WCTCS;

   文件名:如,WCTCS.rc

   位置:如,F:/WCTCS

  用户为项目添加的资源会自动保存在资源文件中。

2.2.3.2 新建资源

  插入—资源—快捷键、位图、光标、HTML、对话框、图标、

  菜单、字符串表、工具条、版本信息。

 * 添加包含文件:

   工作台—资源视图(Resource View)—资源文件—查看—包含文件。

 * 修改资源文件WCTCS.rc中的字符串表 IDS:

   工作台—文件视图(File View)—展开 WCTCS File—源文件—

   WCTCS.rc—WCTCS.rc的资源列表/资源文本—String Table—

   ID:IDS_WCTCS

   标题(Caption):Windows C 图形程序设计

 * 修改资源头文件 resorce.h 中的标识名 IDC_WCTCS、IDS_WCTCS:

   工作台—文件视图(File View)—展开 WCTCS File—头文件—

  resorce.h—IDC_WCTCS、IDS_WCTCS。

第3章 Visual C++ 6.0 编辑器的使用

3.3 资源及资源编辑器的概况

3.3.1 资源的概念(P37)

  Visual C++ 6.0 可以处理的资源:

  快捷键(Accelerator)

  对话框(Dialog)

  图标(Icon)

  菜单(Menu)

  工具栏(Toolbar)

  光标(Cursor)

  字符串列表(String Table)

 

第5章 Windows 编程基础

5.1 Windows 的界面特性(P86)

 1.窗口

   接收用户的输入或者显示输出,实现程序和用户的交互作用。

 2.客户区(工作区)

   显示文字和图形等内容,由应用程序管理和操作。

 3.非客户区

   包括标题栏、菜单栏、工具栏和状态栏等。由Windows系统管理。

5.2 一个 Windows 示范程序(P87)

  Windows 程序基本框架结构:

  头文件;

  源文件:

  1.调用初始化函数,处理消息循环。(P88)

    Windows 应用程序入口点:WinMain。

    初始化窗口,注册窗口:InitApplication。

    创建和显示窗口,初始化应用程序:InitInstance。

    进入消息循环,检索到WM_QUIT时,退出循环。

  2.初始化窗口,注册窗口

   填写窗口类结构参数,注册窗口类(RegisterClass)。

  3.保存实例句柄,创建主窗口(P89)

   创建主窗口:CreateWindow;

   显示窗口:ShowWindow;

   更新客户区:UpdateWindow。

  4.处理主窗口消息

   窗口过程函数 MainWndProc:接收和处理消息。

5.3 Windows 事件和消息概述

5.3.1 消息和消息处理(P91)

  消息类型:

  标准 Windows 消息:由窗口和视图处理。

  有鼠标消息、WM_PAINT消息……。

  控件通知:从控件传送给WM_COMMAND通知消息。

  命令消息:用户界面对象

 (如菜单项、工具栏按钮和快捷键等)的WM_COMMAND通知消息。

5.3.2 窗口过程

  窗口过程(函数):处理 WM_PAINT和WM_DESTROY。

5.4 Simpwin 程序的工作过程

5.4.1 WinMain( )函数(P92)

  注册窗口类、创建和显示窗口、初始化应用程序、

  进入消息循环,检取到WM_QUIT时,退出循环。

  命令行方式:CmdLine

  视窗显示方式:CmdShow

5.4.2 定义和注册窗口类(P93)

  窗口属性

  如标题栏文字、窗口大小和位置、图标、背景颜色等。

  定义窗口类:把属性填入WNDCLASS或WNDCLASSEX结构的相应成员。

5.5 基本的数据类型

 

第6章 使用基本资源

6.1 图标

6.2 菜单

6.2.1 创建菜单(P106)

 * 资源定义文件 Menu.rc

   MENUAPPMENU MENU DISCARDABLE

   BEGIN

     MENUITEM "退出(&X)",   IDM_EXIT

     POPUP "编辑(&E)"  //弹出式菜单

       BEGIN

       MENUITEM "撤消(&U)\tCtrl+Z",   IDM_EDITUNDO,GRAYED

      // MENUITEM 菜单项,

      // &符号后的字符为助记符,通过键盘 Alt+U访问菜单。

      // IDM 菜单标识符的值

      //在 Menu.h 或resource.h头文件中定义。

       END

   END

6.2.2 处理菜单消息(P108)

 * 定义菜单项动作,选中菜单项执行相应命令。

   在窗口过程的 WM_COMMAND 消息处理代码中实现。

 例如:Menu.c

   case WM_COMMAND:  // Windows Menu

     switch(LOWORD(wParam))  //wParam参数的低位字

     {

      ...

      // 菜单选项,判定wParam参数的低位字为 IDM_EXIT 时,

   // 调用函数 PostQuitMessage(0) 响应退出应用程序。

      case IDM EXIT:

     PostQuitMessage(0);

     break;

   default;

     return(DefWindowProc(hWnd,message,wParam,lParam));

    }

6.3 快捷键

6.3.4 示范程序(P114)

 * 头文件 Menu.h

   // 菜单命令

   // [编辑]菜单

   # define IDM_EDITUNDO       210

   # define IDM_EDITCUT        211

   # define IDM_EDITCOPY       212

   # define IDM_EDITPASTE      213

   # define IDM_EDITDELETE     214

   # define IDM_EDITSELECTALL  215

 

 * 资源文件 Menu.rc

   POPUP "编辑(&E)"

   BEGIN

     MENUITEM"撤消(&U)\tCtrl+Z",  IDM_EDITUNDO,GRAYED

     MENUITEM SEPARATOR  // 菜单分隔线

     MENUITEM"(剪切&T)\tCtrl+X",  IDM_EDITCUT

     MENUITEM"(复制&C)\tCtrl+C",  IDM_EDITCOPY

     MENUITEM"(粘贴&P)\tCtrl+V",  IDM_EDITPASTE

     MENUITEM"(删除&D)\tDel",     IDM_EDITDELETE

     MENUITEM SEPARATOR  // 菜单分隔线

     MENUITEM"(全选&A)\tCtrl+A",  IDM_EDITSELECTALL

   END

 

 * 程序文件 Menu.c

   // 窗口过程

   LRESULT APIENTRY MainWndProc(

       HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

   {

   ....

   // 消息处理

   case WM_COMMAND:

        idCommand = LOWORD(wParam);

        switch( idcommand)

        {

         case IDM_EDITUNDO;

         EnableMenuItem(GetMenu(hWnd),

               IDMEDITUNDO,MF_BYCOMMAND | MF_GRAYED);

         break;

         }

       }

 

6.4 对话框

 

第8章 绘图工具和图形设备接口

  图形设备接口:GDI

8.1 设备描述表(P174)

  1.应用程序—设备描述表句柄HDC—设备描述表DC(Device Context)。

    调用获取设备描述表GetDC( ),画图准备BeginPaint( )—

   检取显示设备描述表句柄—图形设备接口(GDI)画图—

    释放设备描述表 ReleaseDC( ),结束画图EndPaint( )。

 2.获取设备描述表

   HDC GetDC(HWND hWnd);

 * 设备描述表句柄HDC(Handle Device Context):

   获取或释放显示器设备描述表。

 * 窗口句柄hWnd(handle Windwos):

   窗口建立后,系统反馈的信息。

   利用窗口句柄对窗口进行初始化、注册、创建、显示和销毁。

 3.SelectObject函数(P176)

   把位图、画笔和画刷等对象选入指定的设备描述表中。

   原型:HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);

 4.DeleteObjec( )函数

   删除逻辑画笔、画刷、字体、位图、区域或调色板对象,

   释放相关系统资源。

8.2 画点(P177)

  COLORREF:RGB颜色值。

  COLORREF SetPixel(HDC hdc,int x,int y,COLORREF crColor);

  例如:

  hdc = GetDC(hWnd);

  SetPixel(hdc,400,300,RGB(255,0,0);

  ReleaseDC(hWnd,hdc);

 * 点集(P180)

  PixelSet.h

  int DrawMyRect(HDC,int,int,int,int); //画矩形

  PixelSet.c

  int DrawMyRect(HDC hdc,int x0,int y0,int x1,int y1);

  {

    MoveToEx(hdc,x0,y0,NULL);

    LineTo(hdc,x1,y0);

    LineTo(hdc,x1,y1);

    LineTo(hdc,x0,y1);

    LineTo(hdc,x0,y0);

    return 1;

   }

x0,y0 ——→x1,y0
  ↑          |
  |          |
  |          ↓
x0,y1←—— x1,y1

8.3 画直线(P187)

  MoveToEx( )原型:

  BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);

  LineTo( )原型:

  BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);

 例如:MoveToEx(hdc,x0,y0,NULL);     LineTo(hdc,x1,y1);
                       o————————————→o

8.4 画折线和曲线

8.4.2 画弧线(P193)

 * Arc( ) 函数原型

   BOOL Arc (HDC hdc,

   int Xleft, int Ytop, int Xright, int Ybottom,

   int Xstart, int Ystart, int Xend, int Yend);

   圆弧外接矩形的左上角和右下角的坐标,

   逆时针方向的圆弧起始点和终点坐标。

8.5 画笔

8.5.1 画笔的属性(P200)

  风格:实线 PS_SOLID、划线 PS_DASH、点划线 PS_DASHDOT。

8.6 画封闭曲线(P207)

 * 矩形函数原开型:

   BOOL Rectangle

  (HDC hdc,int nLeft,int nTop,int nRignt,int Bottom);

   矩形的左上和右下角坐标。

 例如:Rectangle(hdc,10,10,790,590);

 * 椭圆形函数原开型:

   BOOL Ellipse

  (HDC hdc,int nLeft,int nTop,int nRignt,int Bottom);

   椭圆外接矩形的左上和右下角坐标。

 例如:Ellipse(hdc,10,10,790,590);

8.7 字体选择和文字输出

8.7.1 逻辑字体(P218)

 * 逻辑字体 LOGFONT 结构描述

   typedef struct tagLOGFONT {

    LONG lfHeight;

    .............

   } LOGFONT;

8.7.4 文字输出(P221)

 1. 简单的文字输出 TextOut( )

 例如:TextOut(hdc,30,60,"矩形",4 );

                   x,y坐标

 2. 支持矩形剪裁、字符间距和背景颜色的文字输出。

    BOOL ExtTextOut(

      HDC hdc,

      int x,

      int y,

      UINT fuOptions,    //文字输出选项

      CONST RECT *lprc,  //外接矩形

      LPCTSTR lpString,  //字符串指针

      UINT cbCount,      //字符数目

      CONST INT * lpDx   //字符间距值数组的指针

      };

8.7.5 文字格式化(222)

 * 设置设备描述表的文字格式化属性

 1.设置对齐方式:SetTextAlign( );

   UINT SetTextAlign(

     HDC hdc

     UINT fMode  

     //文字对齐方式,如 TA_CENTER 水平居中

     );

  2.设置文字前景色:SetTextColor( );(P231)

    SetTextColor(hDC,RGB(255,0,0));

  3.设置文字背景色:SetBKColor( );默认白色

    SetBKColor(hDC,RGB(0,255,0));

  4.设置背景颜色方式:SetBKMode( );默认不透明

Windows C 图形程序设计 WCTCS.EXE

 实例:顺序演示图形(用点、线、矩形、圆形、圆弧函数画图)

 1.矩形圆形,矩形内白色(用矩形圆形函数画图)

 1.1 水平青色填充(用点函数画连续的彩色点)

 2.紫绿青色边框(用点函数画连续的彩色点)

 3.圆形圆弧(用圆形圆弧函数画图)

 3.1 垂直黄色填充

 4.正弦波(用椭圆弧函数画图)

 4.1 水平青色填充

 5.水平线和直方图(用点函数画连续的彩色点)

 5.1 垂直青色填充

 6.五角星(用直线函数画线)

C++语言

图形程序设计

计算机专业教材

根据教材制作讲稿

2000.9.

第一节 图形模式的设置

* 图形初始化函数(P168)

  设置图形模式的函数:把屏幕显示80列25行的字符模式设置成

    640点480行图形模式(VGA)。

0,0

 

x=639

 

x,y

 

y=479

 

 

  格式:initgraph(&graphdriver,&graphmode,&pathtodriver);

1.图形驱动器代码(graphdriver):

符号常量

代码

意义

DETECT

0

自动检测显示卡类型

VGA

9

VGA显示器

图形驱动程序

EGAVGA.BGI

 2.初始图形模式代码(graphmode)

 例如:graphdriver=DETECT  //自动检测显示卡类型

 3.图形驱动程序搜索路径(pathtodriver)

  为空" "时,图形驱动程序必须在当前目录。

 4.颜色代码值(P171)

代码

0

1

2

3

4

5

6

7

8

颜色

绿

粉红

浅灰

代码

9

10

11

12

13

14

15

颜色

浅蓝

浅绿

浅青

浅红

浅粉红

第二节 基本图形对象

一、点

 * 用类描述点特征,具体的点是这个类的对象。

   point.h

上机内容:彩色正弦波   CSZXB.CPP(P172)

    for(i=0;i<=2PI;i+=PI/99999)

    x=640/6.28*i;

    y=240-(100+100/6.28*i)sin(i);

   c=15/6.28*i+1

C++语言 图形程序设计

彩色正弦波演示

七彩、黑色、红色、绿色、蓝色正弦波

佛山职业技术学院

计算机及应用 984

2000.11.20.

按任意键继续!

C++图形程序设计

1.把图形驱动程序、英文字库复制到当前目录。

    E:\CPP>COPY C:\BC30\BGI\EGAVGA.BGI 图形显示接口

    E:\CPP>COPY C:\BC30\BGI\*.CHR 英文字库

2. 把VGA图形显示接口EGAVGA.BGI加到GRAPHICS.LIB图形库中。

   C:\BC30\BGI>BGIOBJ EGAVGA

   C:\BC30\LIB>TLIB GRPHICS.LIB+EGAVGA

3. 环境设置

    Option/Linker/Libraties/Libraties: Graphics Library 打开图形库

    /Directories/Include Directories: C:\BC30\Include 包含文件的路径

    /Library Directories: C:\BC30\Lib 库函数的路径

    /Output Directories: E:\CPP 输出文件.EXE的路径

    /Source Directories: E:\CPP 源文件.CPP的路径

4.彩色正弦波群  CSZXBQ.CPP

 (1)循环变化线宽、颜色、位置、幅值、波峰数、背景、速度和方向

(2)循环变化方向

   case 0 I=0~n*pi  //向下或向右

   case 1 I=n*pi~0  //向上或向左

   case 0 x=640/(n*pi)*i  //水平向左或向右

              y=yh-25*sin(I)

   case 1 y=480/(n*pi)*i  //垂直向上或向下

              x=xa-25*sin(I)

Point.h Point.h Point.h Point.h Point.h Point.h Point.h 公式
p 0 1 2 3 4 5  
坐标X X±0 X±1 X±2 X±3 X±4 X±5 逐一加
坐标Y Y±0 Y±1 Y±2 Y±3 Y±4 Y±5 逐一加
线宽W 1 3 5 7 9 11 W=1+2*p
颜色C 14 13 12 11 10 9 C=14-p
位置Yh

120
40+1+8

180
49+3+8

240
60+5+8

300
73+7+8

360
88+9+8

420
105+11+8

(2+P)*480/8
yh=yh+w+b

幅值A 12 15 18 21 24 27 A=a+3
波峰数M 1 2 3 4 5 6 M=p+1
半波数n 1 3 5 7 9 11 N=n+2
背景Bk 1 2 3 4 5 6 Bk=p+1
速度V 1 9 25 49 81 121 V=n*n

 

X-5  X-4  X-3  X-2  X-1

Y-5

Y-4

Y-3

Y-2

Y-1

X+0  X+1  X+2  X+3  X+4  X+5

 

Y+0

Y+1

Y+2

Y+3

Y+4

Y+5

 

C 语言

图形程序设计

TXCXSJ

计算机专业教材

根据教材制作讲稿

1999.2.

 * Turbo C 图形语句或图形函数丰富。

3.1.3 图形系统初始化和模式控制

 1.图形系统初始化和关闭

 例3.3

 # include"graphics.h"

 main()

 {

  int gdriver = DETECT,gmode;

  /* 自动搜寻显示器类型和显示模式 */

  initgraph(&gdrever,&gmode," ");

  /* 初始化:启动图形系统,进入绘图状态,屏幕显示"."光标;*/

 /* 如TVGA 1024*768点 */

  bar3d(10,20,50,80,0,0);

  getch();

  /* 按键继续 */

  closegraph();

  /* 关闭图形系统,释放图形系统驱动程序占用的内存空间;*/

  /* 返回文本模式,屏幕显示"_"光标,如VGA 80列25行 */

 }

3.1.4 图形坐标的设置

 1.定点

   把当前光标移到所需的位置

   void far moveto (int x,int y);

   以增量方式移动当前光标

   void far moverel(int deltax,int deltay);  /* △x,△y */

3.1.5 屏幕窗口操作

 1.图形屏幕处理

   清除图形屏幕

   void far cleardevice(void);

 2.屏幕窗口操作

   ckcz_dm ckcz.exe

   ckcz_dm ckcz.exe

   清除当前图形窗口

   void far clearviewport(void);

   设置图形窗口

   void far setviewport

   (int left,int top,int right,int bottom,int clipflag);

   /* clipflag:用值(1,0)设置超出窗口是否剪裁 */

3.2 图形颜色设置

 * 前景色:图形点的颜色。

 * 背景色:整个屏幕显示的颜色。

3.2.1 颜色的设置

 1.设置当前背景颜色

   void far setbkcolor(int color);

 2.设置当前画图颜色

  画笔颜色

   void far setcolor(int color);

3.3 线的特性设定和填充

3.3.1 线的特性设定  线型线宽

   void far setlinestyle

   (int linestyle,unsigned pattem,int width);

   linestyle线型:实线 0,中心线 2。

   unsigned pattem无符号整型数:

   用户自定义线型 1,系统定义 0。

   width线宽:1,3个像素。

3.3.2 填充模式和颜色设置 HLLSTC

 viod far setfillstyle(int pattem,in color);

3.4 图形模式下文本处理

3.4.1 文本输出函数

 1.把一字符串输出到屏幕当前位置

   void far outtext(char * textstring);

 2.在屏幕指定位置输出一字符串

   void far outtextxy(int x,int y,char textstring);

3.4.2 输出文本的设置

 1.设置输出文本字体、方向与字符大小

    字体演示 ZTYS 放大字号 FDZH 缩小字号 SXZH 

    放大缩小 FDSX 横写竖写 HXSX

   void far settextstyle

   (int font,int direction,int charsize)

 2.设置文本对齐方式

   void far settextjustify(int horiz,int vert);

   void far settextjustify(1,1); /* 水平垂直居中 */

3.6 常用画图函数简介

    线弧圆函数 XHYHS 填充方圆 TCFY 晶体管

  JTG图形移动 TXYD 电波发射 DBFS 红花绿叶生长 HHLYSZ

  直线:

  void far line(int x1,int y1,int x2,int y2);

  矩形:

  void far rectangle(int left,int top,int right,int bottom);

  void far bar(int left,int top,int right,int bottom);

  圆形:

  void far circle(int x,int y,int radius);

  椭圆:

  void far ellipse

  (int x,int y,int start,int end,int xradius,int yradius,);

   圆心(x,y),起始角,终止角,x轴y轴半径。