回 帖 发 新 帖 刷新版面

主题:[讨论]DOS下绘图的疑问

/* DOS下的一个简单绘图 */
#include "graphics.h"

void initgr(void){                  /* BGI初始化 */
  int gd = DETECT, gm = 0;          /* 和gd = VGA,gm = VGAHI是同样效果 */
  registerbgidriver(EGAVGA_driver); /* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
  initgraph(&gd, &gm, "");
}

int main(void){
  initgr();                        /* BGI初始化 */

  line(25, 25, 220, 220);          /* 画条直线 */
  circle(100, 100, 50);            /* 画圆 */

  getch();                         /* 暂停一下,看看前面绘图代码的运行结果 */
  closegraph();                    /* 恢复TEXT屏幕模式 */
  return 0;
}
上面是一个简单的DOS绘图程序,在TC2.0下面通过
我想问一下,在C++ Builder 6中也有graphics.h这个头文件呀
同样的程序在C++ Builder 6 中就不能通过,难到这就是16位与32位的差别吗?
那么在C++ Builder 6 中(32位)可以在编程DOS的绘图呢?

回复列表 (共6个回复)

沙发

基于 Windows 的开发工具没有 graphics.h ,graphics.h 不是标准 C 的一部分,它是古老的 DOS 系统的古老工具可用的图形接口头文件之一,但不是 WINDOWS 的//
C++ Builder 6 没法 编译出 DOS 程序 //
C++ Builder 6 能生成 Win32 Console 程序,但这种程序不是 DOS 程序//
C++ Builder 6 能在 Console 窗口里画图,不过要用 GDI 的 C 语言接口(或者 OPEN GL 的 C 语言接口,或者 DirectX Draw 的 C 语言接口).//

给你一个例程,这个例程用 WINDOWS GDI 在 Console 窗口里画了几根直线和几个圆:

//---------------------------------------------------------------------------
#define _WIN32_WINNT 0X0500

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>

#pragma hdrstop

//---------------------------------------------------------------------------
const COLORREF colorConst[]={  RGB(0,0,255)  ,RGB(0,255,0),
                               RGB(255,0,0)  ,RGB(255,255,0),
                               RGB(255,0,255),RGB(0,255,255)
                            };

#pragma argsused
int main(int argc, char* argv[])
{
    HWND hWnd = GetConsoleWindow(); //获得当前 Console 窗口句柄
    HDC hDc = GetDC(hWnd); //获得当前 Console 窗口的图形设备场景
    RECT rect;
    HPEN hPen,hNextPen,hOldPen;
    int i = 0 , stepY,leftRect,topRect=0,semiDia;

    SetConsoleTitle(_T("Console窗口图形演示程序"));
    GetClientRect(hWnd,&rect); //获取窗口大小
    stepY = rect.bottom/7;
    leftRect = (rect.right - rect.bottom)/2; //圆的右上角横坐标
    semiDia = rect.bottom/2;    //圆的半径
    hPen = CreatePen(PS_SOLID,3,colorConst[0]); //定制画笔
    hOldPen = SelectObject(hDc,hPen); //把定制画笔确定为窗口设备场景的当前画笔
    while(i<6){
        int y = (i+1) * stepY;
        //画直线
        MoveToEx(hDc,0,y,NULL);
        LineTo(hDc,rect.right,y);
        //画圆
        Arc(hDc,leftRect,topRect,leftRect+semiDia*2,topRect+semiDia*2,
             leftRect,leftRect+semiDia,leftRect,leftRect+semiDia);
        //换颜色
        hNextPen = CreatePen(PS_SOLID,3,colorConst[++i]);
        hPen = SelectObject(hDc,hNextPen);
        DeleteObject(hPen);
        //改变画圆参数
        leftRect += stepY/2;
        topRect += stepY/2;  //圆的右上角纵坐标
        semiDia -= stepY/2;
    }
    SelectObject(hDc,hOldPen);
    DeleteObject(hPen);

    ReleaseDC(hWnd,hDc);

    printf("Console窗口作图演示程序\n");
    system("pause");

    return 0;
}
//---------------------------------------------------------------------------

要看这个程序的运行结果,请建立一个 Console  C 语言工程( 用 Console 向导)
你可以用 C++Builder 的 帮助系统中的 Win32 SDK 菜单打开 Win32 SDK 帮助文档以获得 
Windows GDI ( 图形设备接口) 作图的帮助

板凳

谢谢楼上的同志!
现在虽然进入WIN时代了,我还是有点怀念 DOS 。
有没有 C++  DOS 编程绘图这些知识是从那类书上学习的呀!
我也想看看,俺也要学,能推介几本书吗?

3 楼

不推荐学习 DOS 下的 图形编程
因为,如果你学了 WIN GDI 的话,那么你不用花几分钟就会用 TC 的 graphics,反过来却难的多.
因此,把时间浪费在 TC 的 graphics 上是毫无道理的.

最好的参考资料是 WIN32 SDK 文档(正常安装 BCB6 的话应该可以用 BCB6 的帮助系统打开这个文档).
由于 WINDOWS 图形编程可用的接口非常多(对于 C++ 来说尤其如此,比如 VCL 的 TCanvas 类就是一个非常简单好用的 图形接口类,这个类的成员函数和 TC 的 graphics.h 中的很接近),因此常常不得不在这些接口里进行抉择. 
由于 BCB 为 WINDOWS 编程提供了很多好用的 C++ 类库,因此, BCB WINDOWS 编程主要
是用 C++ 进行的(虽然你可以用 C 语言来进行这些任务,但用 C 是一条极麻烦的道路),
因此,如果要学 BCB 的话,我建议你先学 C++.



4 楼

哦!是这样的!谢谢你的建议!受益非浅!
我的现在正在学习C++有了一个了解。
BCB6的开发界面吸引了我,VC6就没有这样的界面,但它的强大是MFC,别人都在学它。
这里我就有点犹豫不决了!

5 楼

想扎实地学习 WIN32 编程,应该从 WIN32 SDK 文档学起. 因为 WIN32 API 在所有的
基于 Windows 的 C++ 开发工具中都可以使用.

MFC 是 Win32 的 C++ 编程接口, 它基本上是 WIN32 SDK API 的简单封装,因此
MFC 程序与直接用 WIN32 SDK API 编程相比并不能真正减少代码量.由于 MFC 
使 WIN32 SDK API 特色化了(比如 CDC,CPaintDC,CClientDC 等其实只是特殊情况的 设备场景),另外 MFC 提供了太多"鸡肋"结构,比如 CString, CObjectArray(这些结构的出现是因为当时 STL 还没有成为标准),以及 MFC 中提供了大量垃圾函数(比如 CRect 的加减交并等),还由于 MFC 中包含着许多陈旧的结构(比如和 DAO 有关的那些类),这一切都使得 MFC 成为了一个庞大的垃圾堆放场.学习 
MFC 甚至比直接学习 WIN32 SDK 还麻烦. VC 提供的另一个 Win32 C++ 编程接口 ATL 要求对 
Win32 COM/COM+ API 有比较深入的认识.为什么要使用 MFC 呢? 只有一个原因,那就是 VC 提供了很多能自动生成 MFC 代码的工具,这使得用 MFC 开发程序比直接使用 WIN32 SDK API 要快捷一些.

但是熟悉 WIN32 SDK API 的程序员并不喜欢 MFC,他们可以在任何基于 WINDOWS 的开发环境里使用 
WIN32 SDK API(甚至包括那些非 c/c++ 的工具,比如 vb, C#,delphi 等),但用 MFC 的唯一合理开发环境只能是 VC(因为在其他开发环境里使用 MFC 并不比直接使用 WIN32 SDK API 快捷,而且你还要手工处理和 MFC 的连接).他们可以不学习 MFC 就使用 MFC ,因为熟悉了 WIN32 SDK API 后 MFC 就不剩什么东西了.

BCB 的 VCL 和 VC 的 MFC 不同, VCL 不是 WIN32 SDK API 的简单封装, VCL 彻底简化了 WIN32 编程模型,这使得 BCB 成为了真正的和 VB/Delphi/J++ 一样的 RAD (快速应用程序开发) 工具.
用 VCL 开发程序节约了大量的开发时间. VCL 确实不如 MFC 强大,但这有什么关系呢? 对绝大多数任务来说, VCL 已经足够用了.最关键的一点是, 你可以用 WIN32 SDK API 来扩展 VCL 的功能以使得它比 MFC 更强大.

因此, WIN32 SDK API + VCL 是个不错的选择.

给楼主的建议是,首先熟悉 WIN32 SDK API 所提供的基本服务类型并熟悉它们的帮助文档结构,然后学习 VCL.

6 楼

学习ING

我来回复

您尚未登录,请登录后再回复。点此登录或注册