为什么很多人认为C语言的程序只能在黑窗口下运行?
看到前面有答主贴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。