我刚刚开始在Mac系统7.5.5中对Mac68k使用MetroWerks CodeWarrior 1.1,但我需要知道:如何在其中创建带有TextBox的简单表单?谢谢。
发布于 2009-11-25 20:50:38
有几种方法可以做到。如果您的CodeWarrior版本有它,最好使用PowerPlant框架。这是一个应用程序框架,可以相对容易地构建遵循Mac标准的应用程序。已经有十多年了,所以我已经从我的记忆中完全清除了PowerPlant类的层次结构。抱歉的。
另一种方法是在ResEdit中创建一个DLOG资源,其中包括一个或多或少适合窗口的TextEdit字段。然后编写主应用程序,其中将包括典型的工具箱初始化(我完全是从内存中完成的):
DialogPtr myDlog;
short itemHit;
InitGraf( &qd.thePort );
InitFonts();
InitWindows();
InitMenus();
TEInit();
InitDialogs( 0L );
InitCursor();
myDlog = GetNewDialog(myDlogResID, 0L, -1L);
ShowWindow(myDlog);
while (true) {
ModalDialog(myDlog, &itemHit);
}这可能会起作用,并且是在Mac上做UI的最错误的方式,但是如果您只想要一个带有简单、简单UI的框,那么您就可以了。
这个代码的问题在于它不能很好地处理事件,循环是无限的,没有剪切/复制/粘贴的处理,也没有菜单事件的荣誉等等。
那个时代的Mac工具箱要求你做比你想象中更多的工作。这就是为什么会有像MacApp、和PowerPlant这样的库--它们提供了OOP方法来为您处理大量的家务管理垃圾。在我进行大部分Mac编程时,我构建了一个非类库,它是一个原始C代码,可以更容易地编写分层窗口(带有浮动调色板)和流畅的UI,而不需要OOP的开销。基本上,我必须编写一个窗口管理器、一个菜单管理器、一个对话框管理器、一个事件管理器、一个命令调度器等等。当所有这些都说了又做了,构建一个典型的应用程序就需要大约18K的开销。FYI,Acrobat在Macintosh上搜索,直到第4版建立在此基础上,Acrobat目录也是如此。
您可以在MacTech,像这样中找到与上面类似的代码中的规范示例。
在你开始用对话框构建你的整个UI之前,所有的老Macintosh技术笔记都说不要这样做。DialogManager是有史以来滥用最多的麦金塔代码块之一。它的目的是为了便于放置一个盒子,上面写着“你确定你想关闭‘无题’吗?”有一个确定按钮和一个取消按钮。令人惊讶的是,它竟然会被滥用。
真正的方法是编写一个main来初始化工具箱项,构建一个基本菜单栏,然后分配您设计的对象,比如NathanWindow。NathanWindow可能如下所示:
class NathanWindow {
public:
NathanWindow();
virtual ~NathanWindow();
void Initialize();
void Click(short part, EventRecord *evt);
void Show();
void Hide();
void Drag();
void Move();
// etc;
protected:
virtual WindowPtr MakeWindow() = 0;
virtual void OnInit() = 0;
private:
WindowPtr _win;
};然后,您将使用以适当的样式调用NewWindow()的代码对其进行子类化。
初始化将如下所示:
void NathanWindow::Initialize()
{
_win = MakeWindow();
_win->refCon = this;
OnInit();
}现在,最后一点是棘手的部分--我已经将指向NathanWindow的指针放到了Macintosh WindowPtr refCon字段中。然后,您将在主代码中构建一个事件循环,如下所示:
void HandleMouseDown(EventRecord *evt)
{
WindowPtr win;
short thePart;
thePart = FindWindow( eventPtr->where, &win );
if (win) {
NathanWindow *nw = (NathanWindow *)win->refCon;
nw->Click(thePart, evt);
}
}
void EventLoop( void )
{
EventRecord evt;
while ( true ) {
if ( WaitNextEvent( everyEvent, &evt, kSleep, nil ) ) {
switch (evt.what) {
case mouseDown:
HandleMouseDown(&evt);
break;
}
}
}然后Click看起来是这样的:
NathanWindow::Click(short thePart, EventRecord *evt)
{
switch(thePart) {
case inGoAway: Close(); break;
case inDrag: Drag(); break;
case inGrow: Grow(); break;
}
}诸若此类。
尽管如此,这仍然(可能)是错误的,因为您确实希望将每个NathanWindow连接到管理windows层和分组的应用程序父级中。
NathanWindow应该包含一个NathanControls列表。NathanControl是能够绘制、响应事件等的东西。
所有这些都是为了防止您没有PowerPlant,它为您完成了所有这些工作。苹果之所以喜欢兜售“很难做到容易”这句话是有原因的,因为你手上的API太原始了。
发布于 2009-11-25 19:52:30
我不知道CodeWarrior 1.1是否包含一个GUI设计器,但是您可以使用本机can (CreateNewWindow)创建一个窗口。
问题是,已经没有7.5的在线文档了,所以我无法详细帮助您。
https://stackoverflow.com/questions/1797914
复制相似问题