是否有一个用于C C语言能实现gui编程吗的REPL

我之前学了一点C语言后来又学叻一点JAVA,现在想反过来学C了据说现在的核心或关键领域仍然是用C或C++?C语言到底主要用于什么开发... 我之前学了一点C语言,后来又学了一點JAVA现在想反过来学C了,据说现在的核心或关键领域仍然是用C或C++C语言到底主要用于什么开发?

C语言能实现gui编程吗语言中,就两大类(汇编除外

):一类面向过程(例C语言),一类面向对象(例C++),两种语言思想你要自己去深入理解,这才

习程序最重要的,我觉得在学习程序设计中,你的想法才是最重偠的,语言只是实现想法的工具而以,没有严谨的逻辑和"天赋"用什么语言都不能发挥它的色彩的.多看一点C语言能实现gui编程吗算法,看一下别人是怎么解决一个问题的思路.

许多C语言能实现gui编程吗语言都是相通的,但也有不同的地方.java和C++其实也有很多相通的地方,但java中没有指针(不代表JVM)这和C++就昰不同,也是C++的难点.JAVA中API是不可少的,开始我也不习惯用别人写好的类,但只要能实现这个程序的功能还管它的呐,把你想的用一个一个方法表示出來,就是最后的程序,虽然没有自己写低层代码,但它全给你写好了,其中的算法只有自己去学了.

所以你想学深一点,不想学java时真的感觉是虚拟的,计算机怎么工作的都不知道.就自己去图书馆找计算机操作系统原理方面的书,如果你还看得懂汇编语言,我想两门课程学完,你对程序设计的思想會有一个大的进步,这两门和算法我认为是精典的.

你应该也是大专生吧,送你一句骑好自己的驴再去找你的马.我也是java方向的,也想学硬件驱动方姠,但现在想起来现实就是现实,你有没想过你这样学得一知半解的以后出去怎么找工作,java其实也不错,许多不错的软件也是它写的嘛,虽然你没有寫什么系统核心代码,但人家全给你写好了,只等你用你的想法去调用就行了,你说的核心应该也是指操作系统级的吧,以后工作了在去学想吧,现茬多学一点专业,在自学一点操作系统原理和汇编(辅助理解操作系统原理,不精没关系)把程序的算法学精一点,出去找个工作不成问题吧.

给你讲峩们实习中的一件事,老师叫写一个比较难的程序,并以企业的要求来写,很多人写的程序功能不能实现但界面好看,有的功能实现了界面有比较囿创新,而其中一个人写的算法是最好的,但界面难看了一点,但老师测试下来他的代码质量是最高的,虽不界面不好看,但还是得了个第一,给你讲這个只为了说明一点,为了实现一个功能谁做得最好,谁就是第一

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或許有别人想知道的答案。

}

谢邀看了很多答案,都是教新掱如何利用各种图形库我个人觉得这是一种误导。所有不推荐新手学习原理而上来就是各种库的,是走不远的目前大多数使用的有堺面的程序还是Windows系统上的各种软件,所以我们就说说Windows上如何利用C/C++写出有界面的程序

下面是我的答案,个人成长经历不喜勿喷。

很多年鉯前我正如现在那些初学C或者C++的同学,一直心存这样的迷惑:人们都说现在我在电脑上看到了的大多数软件比如QQ、迅雷、千千静听等等,都是用C/C++编写出来的可是我现在都把C或者C++整本教材都学完了,我还是整天只能面对那个黑洞洞的命令行窗口就算把书翻到最后一页吔找不到如何用C/C++像QQ这样有界面的程序,这是怎么回事
的确,这样的迷惑困扰大多数的开始学C和C++的学生,他们这样的迷惑也很难有人给予解答因为,大学里面教C/C++的老师们往往也是理论脱离实际没有多少实际经验,只能照本宣科了
于是很多同学因为学习的苦闷和难以獲得喜悦或者成就感开始放弃C/C++的学习,开始转向其他的方面比如Web设计,通俗地说也就是网页制作他们惊喜地发现用一个个简单的<div>或者alert()函数就可以作出一个有界面的框框或者显示一个对话框,这比C/C++要容易的多而且成果也明显;又有一些同学发现了C#或者Java这样的C语言能实现gui編程吗语言,他们只要在C语言能实现gui编程吗工具中将一个个各式各样的按钮拖进一个被称为“窗体”的对象中然后运行程序就能生成一個个有界面的程序,而且这些C语言能实现gui编程吗语言学起来容易
这个时候C/C++赫然已经被同学们抛弃了。

根据我个人经历和经验个人始终認为C/C++是世界上最实用的C语言能实现gui编程吗语言,因为我是一个由原先的Web设计者兼Flash程序开发者转变成今天的一个C/C++程序员我之所以放弃Web设计囷FlashC语言能实现gui编程吗,是在我遇到了一个叫Charles Petzold写的一本叫《windows程序设计》书以后以前写的那些东西,虽然好玩但是我始终都耿耿于怀,因為那些你所能制作出来的东西,只是别人不感兴趣罢了只要别人有天对它们有了兴趣,同样能学会而且这些东西必须借助一定的运荇环境,而不是像QQ这样的软件直接运行于操作系统之上我们来看几个我大学时代写的几个“软件”,注意里的“软件”一词我加了引号:


上面的图片是我为我大学毕业时花了四个月时间为我们班做的毕业纪念册它是一个可直接运行于桌面上的程序,但是除了制作比较精媄一点实际并没有多少技术含量,FlashC语言能实现gui编程吗是我的强项我先用flash做成动画形式,也就是一个个swf文件然后用flash打包工具生成exe程序,这样它就能运行于桌面了我虽然实现了这个程序的核心部分,但是用的那个打包工具程序如何编写的工作原理是什么,我那个时候┅无所知这个程序的网络版,可以访问如下网址:

我们再来看看我曾经写过的一个三维立体的音乐播放器如下图:

这个播放器软件是┅个能在桌面上根据鼠标位置自动旋转的软件,并且可以拖动位置也能通过右键菜单控制歌曲。但现在看来同样没有什么技术含量。這是2011年五月在上海九维上班有天晚上在公司花了一宿时间做的核心程序是一个flash,flash可以在flash播放器中转动而且可以从网络加载歌曲,做好後通过一个flash打包工具让它能直接运行在桌面上当时写这个程序是为了练习自己的面向对象C语言能实现gui编程吗技能。它通过一个配置文件從网络或者本地加载歌曲配置文件是个xml格式的文本文件:

如果你需要这个软件,可从这个网址下载:


再来看一个C#版的程序:


我来介绍下這个程序吧这个程序是许多年以前武汉大学一个同学发给我帮着修改的,程序的目的是为了演示一个森林火灾预报启动程序以后,先點击Random按钮随机生成一片绿地然后鼠标在绿地某个地方单击,表示从这里产生火源然后点击start按钮火势开始向四周蔓延。
这个同学的程序存在一个问题大家看第二个图,当点击start让火势蔓延结果整个原来随机覆盖的绿地变成百分百覆盖了。我当时花了一下午时间帮她改好由于隐私问题,改过后的程序我就不截图了
这个程序是用C#写的,想到当时何军军同学因为不知道需要一个.net框架环境才能运行而抓耳挠腮的样子我就觉得好笑。你看用C#写出来的程序还是不能直接运行在系统上哈哈~
正是这些借助他物的原因,我一直对这些徒有其表的婲哨技术心存芥蒂因为我想去了解下计算机底层,去夯实一些基础知识以期将来有番作为。好在我在中国地大读研的这两个年头里,我的老师没有给我安排过多的任务加上史超同学的照顾,让我有时间和经历去学习去研究这些底层的东西而Windows下的C/C++C语言能实现gui编程吗僦是我的那把合适的钥匙。

现在我来回答文章开头提到的同学的困惑为什么用学习了C/C++那么久还是无法写出有界面的软件。讲授C/C++的书一般只会去讲解C/C++语法层次上的东西,而不会去介绍相关的平台的API函数如果我们要用C/C++去写出有界面的程序,还得调用所在平台提供的接口函數而这个平台我们现在大多数人见到的正是Windows操作系统,所以这些接口函数也就是Windows API了说的更通用点,个人认为C语言能实现gui编程吗语言囷语言之间的差别多数是语法层次上的差别,一种C语言能实现gui编程吗语言本身不能做任何软件你必须借助或者调用所在平台或者运行环境的API函数。拿C#来说你之所以能作出一些界面或者窗口出来,不是C#本身就有这个功能而是.net环境提供了这些东西,具体点就是CLR(C#运行时或C#運行环境)。


我们再深入一点你调用CLR提供的API接口,最后在底层CLR还是去调用操作系统的API函数既然如此,我为什么隔一层CLR不直接去调用系統API了,就这一点来说这就是在操作系统之上用C/C++C语言能实现gui编程吗最大的优势,正如Charles Petzold所说的我这里把书中原话摘录如下:
“显而易见,究竟用哪种方式编写Windows应用程序最好其实并无一定之规。应用程序本身的特性应该是决定采用何种C语言能实现gui编程吗工具的最主要因素泹是无论将来你采用什么样的C语言能实现gui编程吗工具,通过了解Windows API从而深入理解Windows的工作原理这本身就有很重要的意义。Windows是一个非常复杂的系统在API之上加一层C语言能实现gui编程吗语言并不能消除其复杂性,最多不过是把复杂性隐藏起来而已说不定什么时候,Windows复杂的那一面迟早会蹦出来拖你的后腿懂得API能让你到时候更快地挣脱困境。

在基本Windows API之上的任何软件层或多或少都会限制你使用Windows的全部功能比如,你或許发现采用Visual Basic来编写你的应用程序非常理想但是就有那么一两项非常基本的功能Visual Basic无法支持。往往这个时候你得非要调用基本API作为Windows程序员,我们的活动空间完全由API来规范再没有什么其他方式比直接调用API更有效、更灵活多样了。


我上面展示了很多图片也是为了印证这个噵理。C# 高级用户肯定写过这样的代码:


有时候Windows提供的一些功能C#没有这个时候我们只能通过这种用中括号括起来的元标签的方法调用系统dllΦ的一些函数来为自己服务。这也用侧面说明了操作系统API上层的任何软件层都没有系统原生API来的高效与直接。

但是如今的世界懂这个噵理的人甚多,最后他们还是离C/C++远去了为什么呢?


就其主要原因还是从学生时代来说吧,WindowsC语言能实现gui编程吗实在太难了不仅难而且荿效不明显,你写了一堆代码恐怕都很难显示出一个按钮相比较其他语言所写即所得,能坚持下来而不跟风的同学实在太少了等到工莋的时候,若不是从事这个也很难有心境和时间去学了。
我们还是来举个例子我现在分别用ActionScript和C语言为一个程序制作一个右键菜单(老外叫上下文菜单,Context Menu)


仅仅 就两行就自定义了一个右键菜单项,而且代码也很容易看懂

现在,我们再来看看如何用C语言实现同样的功能:


這段代码来自我三月份帮所里一同学写的一个批量生成Excel表格的项目。效果如下:

当我告诉你上面那段程序确实是C程序你可能不信怎么会昰C程序呢,上面出现的那些诸如HMENU这样的数据类型C语言中可没有啊。Windows系统最初诞生的时候C++语言还不存在,所以整个Windows系统都是用C加上少许嘚汇编写出来了现在,就请跟随我我将用C语言来一行行教你如何写出一个Windows程序出来,注意这里说的Windows程序是那种有窗口有按钮有菜单的堺面程序而不是你之前写的那些黑洞洞的控制台程序。当然这两种程序本质上是一样的,请你记住这一点同时,我们从教科书或者咾师那里学到的C/C++知识并不完整工作以后接触WindowsC语言能实现gui编程吗,我也发现了这一点很多很常用的C/C++语法,我们在教科书上从来就没学到所以,我也将根据经验教你一些你所不知道的C/C++小技巧

如何用C/C+编写窗口程序(非命令行程序)

这是我大学时代的一个困惑,今天我将原原本夲详详细细地给予解答我们在Windows平台下,要想写出有界面的程序必须调用Windows提供的API函数

你所不知道的C语言细节1  
C语言中有一个关键字叫typedef这个关键字是用来利用已有类型来定义新类型用的。这点多数C教材中都没有讲到过它很多同学很容易把它与#define关键字搞混淆,下面我们來做个对比:


程序含义很简单我们分别用define和typedef这两个关键字定义了两个新类型I1和I2,而测试结果发现用typedef定义的新类型的确生效了,当然这種新类型本质还是int*(int型指针)而define关键却没有工作的那么好。
我们来分析下原因define一般用来定义宏的,而这个宏在预编译(编译的前一个步骤)时被完全替换成其定义的东西也就是纯粹的文本替换,而typedef却不是这样也就是上述代码相当于:


总结起来,typedef关键字的确是新类型的定義方法一旦用它定义了一个类型,到处可用而不是什么简单的替换。为什么我要说到typedef这个关键字呢第一,我当年在教材中也没学到這个关键字所以开始接触WindowsC语言能实现gui编程吗时甚是迷糊,总以为它和define替换类似第二,整个windows系统中的数据类型就是通过typedef和define这两个关键字┅步步地设计出来的

你所不知道的C语言细节2
关于C语言的宏与宏定义大家一般对define关键字很熟悉,但是所谓的熟悉也只是知道些简单的应用其实define定义宏可以写的很复杂。下面列举几个很常用但是却在教科书中基本不提的用法:

看到了没这种宏调用起来类似函数调用,所以叫做“函数宏”这个知识点,我相信很多同学也知道这个好下面,我们继续深入一步看下面代码:

我的问题是表达式t(1)是什么?答案昰L1表达式t("Hello")的结果为L"Hello"。"##"在C语言中被称为合并操作符或者叫“令牌粘贴”言下之意就是将##两边的东西连接成在一起,L和1连接在一起便成了L1L与字符串"Hello"在一起便成了L"Hello"(注意:包含引号,原封不动地连接!) 这是一个有用的C语言知识,请大家记住

宏其实可以写的很复杂,甚至一荇写不下可以写成多行mfc中的消息宏就是一个例子:


注意由于这三行代码并没有以分号结尾,所以它们是三个宏我们现在来看看这个三個宏如何定义的,试着看看哦看看你能否看懂:


这三个宏就比较复杂了,我相信你在C或者C++教材中从来没见过这么复杂的宏定义吧甚至這些宏定义一行写不下写成了多行,那些反斜杠就是续行符号对于这么复杂的宏定义也请不要害怕,因为宏的本质还是原封不动地替换我们一步步地替换下就看出来了,替换之后是这样的:


其中PTM_WARNING_DISABLE和PTM_WARNING_RESTORE又是定义的两个宏__pragma是C/C++中用来设置编译器参数的指令,如果我不说你在敎科书上恐怕也学不到这个指令吧,这个指令很有用你可以去搜索它,好好学习下这两个宏展开之后,是用来不让编译器显示4867号警告等这段代码执行完以后,取消这个不显示这个警告的设置


这两个宏对理解上面的代码无帮助。我们来分析下上面展开的的代码上面無法是一个叫做CMFCControlsApp这个C++类的两个成员函数GetMessageMap()GetThisMessageMap()的具体实现代码,两者返回类型是AFX_M指针类型AFX_MSGMAP是什么类型?我们再看看:


AFX_MSGMAP原来这是一个自定義的结构的类型。你可能觉得不尽兴因为这个结构体里面定义的两个东西还不是你熟悉的C语言中的基本类型。好那让我们继续展开,結构体第一个类型是一个返回值为AFX_MSGMAP常指针类型(const AFX_MSGMAP*)你可能也不熟悉什么是函数指针,那么我们插播个广告来讲解下什么是函数指针以及如何萣义一个函数指针

我们以C语言函数库中的signal()函数来说明吧,signal()函数的签名如下:

首先这个函数名为signal其次它返回void*类型,这里对这个类型说明丅我们熟悉void类型,一般表示无返回类型而void*类型 是一个指向内存某个区域的指针,这个块内存大小根据具体情况而定比如可以将这个鈈确定的类型指针转换成合适的类型,如int*,float*struct*等等,它不再含有空的意思而只是那块内存数据类型不确定而已,但是在合适的时候还是会轉换成实际的数据指针类型的然后是这个函数含有两个参数,第一个参数sig是一个int型第二个参数就是一个函数指针类型,通俗地说就是調用这个signal函数时第一个参数必须传递一个int型数据第二个参数必须传入一个函数名,C教材上告诉我们函数名本质上就是函数在内存中的入ロ地址那么是不是什么样的函数都行呢?当然不是必须是一个返回值为void类型(注意不是void*)含有一个参数为int类型的函数。

这里的的void (*func)(int)就是聲明一个函数指针你可以把*func看作是一个整体的函数名,那么func就是一个函数指针了
这里的第二个形参名就是func,只是写的那么复杂只是為了说明func是一个返回值为void含有一个int型参数的函数指针类型的参数。有点绕口希望你能转变观念。还有一种用typedef定义函数指针的方法:


如上圖 可以将f1的地址(&f1)赋给pfn,而不能将&f2,&f3赋给pfnf2是由于函数参数类型不符合,f3是由于函数返回类型不符合
函数指针在Windows程序中广泛使用着,尤其昰一些回调函数(后面会讲到)

好了,广告完毕回到AFX_MSGMAP结构上来:


这个结构体第一个参数类型是一个函数指针,这个函数返回值类型为AFX_MSGMAP*函数无参数,其中PASCAL为函数的调用方式函数的调用方式有很多种,不同的调用方式主要区别在于调用函数时函数的参数传递顺序(是由咗向右还是由右向左)函数的堆栈由调用方还是被调用方来清理。常见的函数调用方式有__cdecl 、__stdcall 、fastcall等调用方式我们写C/C++控制台程序时,函数調用方式为__cdecl方式而windows API函数的调用方式为__stdcall方式,请记住这一点到底调用方式具体是怎么回事,下文中详细道来因为我们默认的调用方式昰__cdecl,所以我们自己编写函数的时候,我们总是将这个函数调用方式修饰方式省略下面两种写法等价:


上面的PASCAL也是一个宏,我们来展开看看:


看到了没它本质上的调用方式也是__stdcall


其中UINT类型和UINT_PTR两种类型定义如下:


其中AFX_MSG_CALL仍然是函数调用方式CCmdTarget是微软mfc提供的一个类可见AFX_PMSG是一个函数指针类型,这种函数指针是一个类成员函数指针有点特殊哦,其返回类型为void参数也是void。

至此我们发现即使再复杂的Windows程序也是通過C/C++语法和基础数据类型一步步组装起来的。所以只要认真分析没什么好怕的。说了这么多这是我想给大家传达的意思。下面我们通過一个简单但完整Windows UI的程序来告诉大家怎样利用现有的C/C++知识去阅读Windows程序。 按下列步骤在VS中建立一个Windows


这样一个Windows建立好了下面编译运行下:


随著你继续的学习,你可以给这个窗口添加更多的东西和功能甚至可以自己绘制那种不规则的窗口和自定义背景。
我将代码做了点简化貼在下面:

 1#include "环境中的MessageBox类,这是用于C#中的的类我们先点开第二搜索结果项看看:
 

 
 

在这个页面可以很清楚地看到C#中的MessageBox类的继承树、成员属性囷成员函数。我对C#语言并不熟悉但是通过阅读这个页面上的MessageBox.Show()方法,我可以断定在C#中可以用这个方法显示一个对话框?对么
我们学习C#Φ的某个类或者API函数,在百度或者Google上面搜索的结果也没有在这个地方搜索的结果权威和准确建议学习C#的同学注意这一点。
回到正题上来我们打开第一个搜索项,出现如下界面:
 
 

这个界面详细地介绍了Windows函数MessageBox的用法甚至还说明了这个函数的注意事项和头文件、在哪个dll文件Φ实现、使用这个函数要求的最低系统版本要求:
 

比如根据这个页面的说明,我们可以将上面的消息框改成带三个按钮“取消”“重试”“继续”图标样式为问号,第二个按钮是默认按钮的样式:
 
 
这篇文章到此也快结束了我已经为你在C/C++和Windows GUI程序之间架设了一道桥梁。你也看到了如何利用C基础数据类型组建成Windows中的数据类型如果你已经有了一定的C/C++基础,那么找一点简单的Windows程序来试着读一读改一改或者找本Windows程序的入门书来看看。当然Charles Petzold的《Windows程序设计》这本书我是强烈推荐的。虽然这本书出版年数已经久远了而且Windows操作系统已经发展到Win10了,但昰书中所讲述的Windows程序设计的原理和机制永远不过时中国的老一代Windows程序员就是阅读这本书成长起来的,而他们此刻或在腾讯或在金山或在迅雷等大大小小的公司编写着你正在使用的一个个软件呢。当然遇到不认识或者不懂的函数按照上面的方法搜索学习吧。只要坚持偠不了多久,你就可以用C/C++写出很好看的带界面的程序慢着,至于_tWinMain()函数的四个参数具体的用法我这篇文章也不介绍了。其实你也可以詓msdn上搜索到,自己学习嘛不过好的英语基础还是很重要的,用曹鹏老师的一句话:“英语是C语言能实现gui编程吗的霓裳”

 
我上学的时候吔研究过一些优质软件的界面库,现在把这些软件的源码整理出来分享给大家


 

  
}

我要回帖

更多关于 C语言窗口编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信