为什么很多人认为C语言的程序只能在黑窗口下运行?

发布时间:
2024-08-03 05:03
阅读量:
37

看到前面有答主贴win32的纯C图形界面,我也来贴一个classic mac的吧(

代码如下

#include <Dialogs.h> #include <Fonts.h> #include <MacWindows.h> #include <Menus.h> #include <QuickDraw.h> #include <TextEdit.h> #define APP_SLEEP 30 static WindowPtr mainWindow; static int gShouldEnd = 0; static MenuHandle appleMenu; static void Initialize(void) { InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(nil); InitCursor(); } static void appCreateWindows(void) { Rect winRect = {80,80,240,240}; mainWindow = NewCWindow(NULL, &winRect,"\pHello, World",1,4,(WindowPtr)-1,1,0); if (!mainWindow) { SysBeep(0); ExitToShell(); } appleMenu = NewMenu(128,"\p\x14"); // Apple Menu AppendResMenu(appleMenu,'DRVR'); InsertMenu(appleMenu,0); } static void appDraw(WindowPtr w) { SetPort(w); MoveTo(10,30); DrawString("\pHello, world!"); DrawMenuBar(); } static void appUpdate(EventRecord *evt) { WindowPtr w = (WindowPtr)evt->message; BeginUpdate(w); appDraw(w); EndUpdate(w); } static void appMenu(int menuItem) { if (HiWord(menuItem) == 128) { Str255 itemName; GetMenuItemText(GetMenuHandle(128),menuItem,itemName); OpenDeskAcc(itemName); } HiliteMenu(0); } static void appMouseDown(EventRecord *evt) { int partCode; WindowPtr theWindow; partCode = FindWindow(evt->where, &theWindow); switch (partCode) { case inSysWindow: SystemClick(evt,theWindow); break; case inContent: case inGrow: if (FrontWindow() != theWindow) SelectWindow(theWindow); else SysBeep(0); break; case inDrag: DragWindow(theWindow,evt->where,&((**GetGrayRgn()).rgnBBox)); break; case inGoAway: if (TrackGoAway(theWindow,evt->where)) ExitToShell(); break; case inMenuBar: appMenu(MenuSelect(evt->where)); break; } } static void appProcessEvent(EventRecord *evt) { switch (evt->what) { case mouseDown: appMouseDown(evt); break; case updateEvt: appUpdate(evt); break; } } static void appMainLoop(void) { RgnHandle cursorRgn = NewRgn(); EventRecord evt; int gotEvent; while (!gShouldEnd) { gotEvent = WaitNextEvent(everyEvent,&evt,APP_SLEEP,cursorRgn); if (gotEvent) appProcessEvent(&evt); } } void main(void) { Initialize(); appCreateWindows(); appMainLoop(); }

为了实现纯C,所以没有用资源文件定义窗口。

可以看出,之所以c给人这样的印象,是因为c标准没有定义一套通用的图形界面接口,要想实现图形界面就必须像上面那样使用操作系统提供的C图形接口(如果有的话)或者直接操作硬件。而操作系统提供的C的图形接口往往都会偏底层一些,需要你自己循环处理事件(甚至包括拖动窗口框等事件,比如classic mac),代码看起来比较复杂,对初学编程者较为劝退;那些易用的图形库往往会选择C++等相对高级的语言。这就导致教C语言入门几乎不可能教用它写gui程序的方法了。

另:在打完代码想开个web服务器把代码下到手机上时,电脑不负众望地抛了个系统错误。难怪乔布斯要开发新的Mac OS X。

END