C++难吗, C++程序员躲到哪去了?


[原文发表地址] C++ killed my grandpappy – Is C++ hard and where are the C++ coders hiding?

[原文发表时间] 2010-06-28 05:41 PM

在学习了Basic和ASM语言以后,为了一份 工作,我开始 编写C程序的工作,当时在Windows上Hello World有92行代码。(当然现在Hello World 变简单了 , Pete Brown如是说)

我的第一个大型项目之一是编写一个叫做Foolproof的应用程序,用来防止高中孩子们侵入学校实验室的计算机。它包括一个C的核心引擎,一个TurboVision DOS组件和一个16位的Windows C++应用程序。我全部使用C++参与了DOS、Win16以及之后Win32的API。在那之后我又做了些关于VB3,Delphi的工作,然后是在Nike写Java(恰逢RMI开始兴起,而且HotJava一次编写可以在任何地方调试)。直到现在,我关注于托管代码,主要是C#。

一些朋友不太知道Microsoft 有一个免费的 C++ Express Edition of Visual Studio 2010,这个版本是市面上被使用最多的免费版本之一,一些人在写 C++代码,并且用它做了许多工作。

亲爱的读者,您在用C++编程吗?您写了些什么呢?

很多“托管代码拥趸” 畏惧使用C++,觉得C++也许是过时的一种语言,甚至认为没有硕士学位的话,想用C++写一个Windows应用程序甚至是不可能的。

然而,我最近发现有一个称为Hilo的新项目 ,向人们展示了如何用C++在Windows 7中使用那些闪亮的新特性,以及如何制作现代的Windows应用程序,它们拥有动画和神奇的特效,托管代码拥趸以为这些只属于他们。

Hilo的第一版显然是许多的第一个之一,一切迈向建立一个更大的应用程序。用来编译发布一个大型的应用程序。第一个例子是一个内容浏览器(可触摸的哦),用来浏览视频和照片(是啊,也许功能比较单一),但是你完全可以用它来浏览其他东西或者在自己的程序中将它作为底层使用。以下来自Windows 团队的博客:

Hilo使用的主要技术有:Direct2DWindows Animation ManagerWindows Touch,类库和Shell API

clip_image001 Direct2D: 用来保证高性能及高质量的图片渲染.

clip_image001[1] Windows Animation Manager: 赋予应用程序一些独特的个性和更好的用户体验。

clip_image001[2] Windows Touch: 提供更自然的用户操作界面,用户只需要动动手指尖。

clip_image001[3] 类库: 使程序可以提供给用户单独的,连贯的浏览文件视图。

clip_image001[4] Shell API:图片导航,用预建的缩略图缓存进行优化,从实际的内容提供图标。

即使你不准备写C++代码,“看看另一些人是怎么做到的”总是一个好主意。对我来说,这是对我自以为知道的东西的回顾,也是以新的眼光来看C++的一种方式。

让我惊奇的是这个应用程序是针对Windows本身编写的,不需要任何的框架,我总是以为会需要MFC或一些其他的类库才能工作。

我不知道为什么我记得是这样,但是C++老是让我想到正则表达式,老是觉得我的代码会都是像**be &all like->this.you ~ know?,你懂的。你得对Windows了解更多一些,而且似乎十年经验的托管代码程序员已经忘记了消息泵的概念,但它并不像我记得的那样令人畏惧。

Hilo Browser

只要下载C++ Express,然后下载Hilo的源代码,并编译它。在圆盘传送带上有一些很酷的特效,例如带有惯性的旋转,缩放,Z轴排序,硬件图形加速等。现在他们需要的是一个设计师! 😉

作为一个有趣的例子,它使用了Direct 2D并实现了一个环状旋转的动画。我将所有 if(SUCCEED(hr))代码从下面的片段中移除了,因为这仍然是C++Windows上的功能,我对此感到厌烦。不要指责,指责我为了简化代码而滥竽充数。

这个源代码极为保守,在每一步都尽职尽责的检查HResults的值。我的意思是,认真的说,如果执行不成功的话,你将会怎么做呢?If(NOTSCREWED(hr)),你懂得。

对这段代码来讲,最突出的特点就是其中包含了一些很不错的高层次的动画结构,像计时器,转换器和故事板。由于某些错误原因,我曾认为这是一堆数学操作的堆砌,让我感到惊喜。

HRESULT OrbitAnimation::Setup(D2D1_ELLIPSE targetEllipse, double targetOpacity, double duration)
{
    HRESULT hr = S_OK;
   
    // Animation objects
    ComPtr<IUIAnimationManager> animationManager;
    ComPtr<IUIAnimationTimer> animationTimer;
    ComPtr<IUIAnimationTransitionLibrary> transitionLibrary;
    ComPtr<IUIAnimationStoryboard> storyboard;
    // Transition objects
    ComPtr<IUIAnimationTransition> centerXTransition;
    ComPtr<IUIAnimationTransition> centerYTransition;
    ComPtr<IUIAnimationTransition> radiusXTransition;
    ComPtr<IUIAnimationTransition> radiusYTransition;
    ComPtr<IUIAnimationTransition> opacityTransition;
    // Initialize animation variables if necessary
    if (nullptr == m_centerX)
    {
        hr = Initialize(targetEllipse, targetOpacity);
    }
    // Retrieve animation objects
    hr = AnimationUtility::GetAnimationManager(&animationManager);
    hr = AnimationUtility::GetTransitionLibrary(&transitionLibrary);
    hr = AnimationUtility::GetAnimationTimer(&animationTimer);
    // Initialize storyboard
    hr = animationManager->CreateStoryboard(&storyboard);
       
    // Create one transition for each orbit variable
    hr = transitionLibrary->CreateLinearTransition(duration, targetEllipse.point.x, &centerXTransition);
    hr = storyboard->AddTransition(m_centerX, centerXTransition);
    hr = transitionLibrary->CreateLinearTransition(duration, targetEllipse.point.y, &centerYTransition);
    hr = storyboard->AddTransition(m_centerY, centerYTransition);
    hr = transitionLibrary->CreateLinearTransition(duration, targetEllipse.radiusX, &radiusXTransition);
    hr = storyboard->AddTransition(m_radiusX, radiusXTransition);
    hr = transitionLibrary->CreateLinearTransition(duration, targetEllipse.radiusY, &radiusYTransition);
    hr = storyboard->AddTransition(m_radiusY, radiusYTransition);
    hr = transitionLibrary->CreateLinearTransition(duration, targetOpacity, &opacityTransition);
    hr = storyboard->AddTransition(m_opacity, opacityTransition);
    hr = AnimationUtility::ScheduleStoryboard(storyboard);
    return hr;
}

我还高兴地看到代码智能感知(intellisense)功能对一切类型运行, 还有-〉指针的支持相当此棒,如下截图中所见。你可以叫我智能感知依赖症患者或懒得动脑的人,但是一旦你知道你要找的是什么,它确实能提高编程速度。C++Express版还是一个较小的下载。

我并没说C++编程那么容易,但是也不是世界末日对吧。接下来我将如同在今年学习另一种编程语言(同Scala一起)那样详细的从另一个角度来介绍C++。当这个应用程序变得更大跟有意思的时候,我会再向大家报告。

Comments (0)

Skip to main content