首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中创建表单

在C++中创建表单
EN

Stack Overflow用户
提问于 2009-11-25 15:58:41
回答 2查看 5.6K关注 0票数 2

我刚刚开始在Mac系统7.5.5中对Mac68k使用MetroWerks CodeWarrior 1.1,但我需要知道:如何在其中创建带有TextBox的简单表单?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-25 20:50:38

有几种方法可以做到。如果您的CodeWarrior版本有它,最好使用PowerPlant框架。这是一个应用程序框架,可以相对容易地构建遵循Mac标准的应用程序。已经有十多年了,所以我已经从我的记忆中完全清除了PowerPlant类的层次结构。抱歉的。

另一种方法是在ResEdit中创建一个DLOG资源,其中包括一个或多或少适合窗口的TextEdit字段。然后编写主应用程序,其中将包括典型的工具箱初始化(我完全是从内存中完成的):

代码语言:javascript
复制
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可能如下所示:

代码语言:javascript
复制
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()的代码对其进行子类化。

初始化将如下所示:

代码语言:javascript
复制
void NathanWindow::Initialize()
{
    _win = MakeWindow();
    _win->refCon = this;
    OnInit();
}

现在,最后一点是棘手的部分--我已经将指向NathanWindow的指针放到了Macintosh WindowPtr refCon字段中。然后,您将在主代码中构建一个事件循环,如下所示:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
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太原始了。

票数 1
EN

Stack Overflow用户

发布于 2009-11-25 19:52:30

我不知道CodeWarrior 1.1是否包含一个GUI设计器,但是您可以使用本机can (CreateNewWindow)创建一个窗口。

问题是,已经没有7.5的在线文档了,所以我无法详细帮助您。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1797914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档