⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmessage.cpp

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CPP
字号:
/***************************************************************************  CMessage.cpp  The message box class  (c) 2000-2003 Beno顃 Minisini <gambas@users.sourceforge.net>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 1, or (at your option)  any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#define __CMESSAGE_CPP#include "gambas.h"#include "main.h"#include <qnamespace.h>#include <qmessagebox.h>#include <qpixmap.h>#include <qsizepolicy.h>#include <qeventloop.h>#include <qapplication.h>#include "gb.qt.h"#include "CWindow.h"#include "CMessage.h"/* XPM */static const char *_question_xpm[] = {/* width height ncols cpp */"32 32 6 2",  /* Colors */  "00 c #000000",  "01 c #808080",  "02 c #C0C0C0",  "03 c #0000FF",  "04 c #FFFFFF",  ".. s None c None",  "......................0101010101010101..........................",  "................0101010204040404040402010101....................",  "............010102040404040404040404040404020101................",  "..........0102040404040404040404040404040404040201..............",  "........01040404040404040404040404040404040404040400............",  "......010404040404040402030303030303020404040404040400..........",  "....0104040404040404020302040403030303020404040404040400........",  "..01020404040404040403030404040403030303040404040404040200......",  "..0104040404040404040303030304040303030304040404040404040001....",  "01020404040404040404030303030402030303030404040404040404020001..",  "01040404040404040404020303020403030303040404040404040404040001..",  "0104040404040404040404040404020303030404040404040404040404000101",  "0104040404040404040404040404030303040404040404040404040404000101",  "0104040404040404040404040404030302040404040404040404040404000101",  "0104040404040404040404040404030304040404040404040404040404000101",  "0102040404040404040404040404040404040404040404040404040402000101",  "..01040404040404040404040402030302040404040404040404040400010101",  "..01020404040404040404040403030303040404040404040404040200010101",  "....0104040404040404040404030303030404040404040404040400010101..",  "......00040404040404040404020303020404040404040404040001010101..",  "........0004040404040404040404040404040404040404040001010101....",  "..........000204040404040404040404040404040404020001010101......",  "............00000204040404040404040404040402000001010101........",  "..............0100000002040404040404020000000101010101..........",  "................010101000000020404040001010101010101............",  "....................0101010100040404000101010101................",  "..........................0100040404000101......................",  "..............................000404000101......................",  "................................0004000101......................",  "..................................00000101......................",  "....................................010101......................",  "......................................0101......................",};/* XPM */static char *_trash_xpm[]={"32 32 5 1",". c None","# c #000000","a c #808080","b c #c0c0c0","c c #ffffff","..............##................","...........a##bb#...............","..........aaaa#ac##a............","........aabbab###b#b#ab.........","......aabbbca#abab#bbba#........",".....abbbccccbbba##abbbaa.......",".....abbcccccccc#aaabbba#.......",".....aabccccccbbbaaabbba#.......",".....aabbcccccbbbbbbbbaa#.......",".....abbbbbbccbbbbbaaaaa#.......",".....abbbbbbbbbbbaaaaaaa#.......",".....a#abbccbbbbbbaaaa##a.......","......aaaabbbbbbbbaa##a#........","......abbbbbaaaa###aaaa#........","......abbbcbbbbbbbaaaaa#........","......ababbcbbbcbabbb#a#........","......ababbcabbbbaaba#a#aaa.....","......ababbcabbbbaaba#a#aaaaa...","......ababbcabbbbaaba#a#aaaaaa..","......ababbcabbbbaaba#a#aaaaaaa.","......ababbcabbbbaaba#a#aaaaaaaa","......ababbcabbbbaaba#a#aaaaaaaa","......ababbcabbbbaaba#a#aaaaaaaa","......ababbcabbbbaaba#a#aaaaaaaa","......ababbcabbbbaaba#a#aaaaaaaa","......abbbbcabbbbaabaaa#aaaaaaa.","......abbbbcabbbbaabaaa#aaaaa...","......#abbcccabbbabbaaa#aaa.....","......a##bccbbbbbbbba###a.......","........aa#abbbbba#####.........","..........a##########...........","................................"};static QPixmap *_question_pixmap = 0;static QPixmap *_trash_pixmap = 0;/*static int my_message(GAMBAS_MESSAGE *msg){  QMessageBox::Icon icon;  int button[3];  int i;  switch (msg->icon)  {    case GB_MSG_INFORMATION:      icon = QMessageBox::Information;      break;    case GB_MSG_WARNING:      icon = QMessageBox::Warning;      break;    case GB_MSG_CRITICAL:      icon = QMessageBox::Critical;      break;    default:      icon = QMessageBox::Information;  }  button[0] = button[1] = button[2] = QMessageBox::NoButton;  switch (msg->type)  {    case GB_MSG_USER_DEFINED:      for (i = 0; i < 3; i++)        button[i] = msg->button[i] ? (i + 1) : QMessageBox::NoButton;      break;    case GB_MSG_OK_ONLY:      button[0] = QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape;      break;    case GB_MSG_OK_CANCEL:      button[0] = QMessageBox::Ok | QMessageBox::Default;      button[1] = QMessageBox::Cancel | QMessageBox::Escape;      break;    case GB_MSG_YES_NO:      button[0] = QMessageBox::Yes | QMessageBox::Default;      button[1] = QMessageBox::No | QMessageBox::Escape;      break;    case GB_MSG_YES_NO_CANCEL:      button[0] = QMessageBox::Yes | QMessageBox::Default;      button[1] = QMessageBox::No;      button[2] = QMessageBox::Cancel | QMessageBox::Escape;      break;  }  QMessageBox mb(msg->title, msg->text, icon, button[0], button[1], button[2]);  if (msg->type == GB_MSG_USER_DEFINED)  {    for (i = 0; i < 3; i++)    {      if (msg->button[i] != NULL)      {        qDebug(msg->button[i]);        mb.setButtonText(i + 1, msg->button[i]);      }    }  }  switch (mb.exec())  {    case QMessageBox::Yes:      return GB_MSG_YES;    case QMessageBox::No:      return GB_MSG_NO;    case QMessageBox::Ok:      return GB_MSG_OK;    case QMessageBox::Cancel:      return GB_MSG_CANCEL;    case QMessageBox::Abort:      return GB_MSG_ABORT;    case QMessageBox::Retry:      return GB_MSG_RETRY;    case QMessageBox::Ignore:      return GB_MSG_IGNORE;    default:      return 0;  }}*/typedef  struct {    GB_STRING msg;    GB_STRING btn[3];    }  MSG_PARAM;static int make_message(int type, int nbmax, void *_param){  MSG_PARAM *_p = (MSG_PARAM *)_param;  QString msg = QSTRING_ARG(msg);  QString btn[3];  QString swap;  int mbtn[3];  int i, cancel, ret;  QMessageBox::Icon icon;  QPoint p;  QWidget *parent;  if (!MISSING(btn[0]))    btn[0] = QSTRING_ARG(btn[0]);  if (nbmax >= 2 && !MISSING(btn[1]))    btn[1] = QSTRING_ARG(btn[1]);  if (nbmax >= 3 && !MISSING(btn[2]))    btn[2] = QSTRING_ARG(btn[2]);  if (btn[0].isNull() && !btn[1].isNull())    swap = btn[0], btn[0] = btn[1], btn[1] = swap;  if (btn[1].isNull() && !btn[2].isNull())    swap = btn[1], btn[1] = btn[2], btn[2] = swap;  for (i = 0; i < 3; i++)    mbtn[i] = btn[i].isNull() ? QMessageBox::NoButton : (i + 1) ;  mbtn[0] |= QMessageBox::Default;  cancel = 0;  for (i = 2; i >= 0; i--)  {    if (btn[i])    {      cancel = i;      break;    }  }  mbtn[cancel] |= QMessageBox::Escape;  switch (type)  {    case MSG_INFO:      icon = QMessageBox::Information;      break;    case MSG_WARNING:      icon = QMessageBox::Warning;      break;    case MSG_ERROR:      icon = QMessageBox::Critical;      break;    //case MSG_QUESTION:    //  icon = QMessageBox::Question;    //  break;    default:      icon = QMessageBox::Information;  }  parent = qApp->activeWindow();  if (!parent)  {    if (CWINDOW_Main)      parent = CWINDOW_Main->widget.widget;  }    QMessageBox *mb = new QMessageBox(    TO_QSTRING(GB.Application.Title()), msg, icon,    mbtn[0], mbtn[1], mbtn[2], parent);        //, 0, //qApp->activeWindow(),    //0, true, 0);    //CWINDOW_Current ? ((CWIDGET *)CWINDOW_Current)->widget : 0);  for (i = 0; i < 3; i++)  {    if (btn[i])      mb->setButtonText(i + 1, btn[i]);  }  if (type == MSG_QUESTION)  {    if (_question_pixmap == 0)      _question_pixmap = new QPixmap(_question_xpm);    mb->setIconPixmap(*_question_pixmap);  }  else if (type == MSG_DELETE)  {    if (_trash_pixmap == 0)      _trash_pixmap = new QPixmap(_trash_xpm);    mb->setIconPixmap(*_trash_pixmap);  }    mb->adjustSize();  if (mb->width() < 256)    mb->resize(256, mb->height());    mb->setMinimumSize(mb->width(), mb->height());  mb->setMaximumSize(mb->width(), mb->height());  mb->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));    mb->reparent(parent, Qt::WType_TopLevel | Qt::WStyle_Customize | Qt::WStyle_DialogBorder | Qt::WStyle_Title | Qt::WStyle_SysMenu, mb->pos()); // WShowModal  mb->installEventFilter(&CMessage::manager);    //qDebug("message-box: parent = %p", mb->parentWidget());  ret = mb->exec();    if (ret == 0)    ret = cancel + 1;  delete mb;      return ret;}BEGIN_METHOD(CMESSAGE_info, GB_STRING msg; GB_STRING btn)  GB.ReturnInteger(make_message(MSG_INFO, 1, (void *)_p));END_METHODBEGIN_METHOD(CMESSAGE_warning, GB_STRING msg; GB_STRING btn1; GB_STRING btn2; GB_STRING btn3)  GB.ReturnInteger(make_message(MSG_WARNING, 3, (void *)_p));END_METHODBEGIN_METHOD(CMESSAGE_question, GB_STRING msg; GB_STRING btn1; GB_STRING btn2; GB_STRING btn3)  GB.ReturnInteger(make_message(MSG_QUESTION, 3, (void *)_p));END_METHODBEGIN_METHOD(CMESSAGE_delete, GB_STRING msg; GB_STRING btn1; GB_STRING btn2; GB_STRING btn3)  GB.ReturnInteger(make_message(MSG_DELETE, 3, (void *)_p));END_METHODBEGIN_METHOD(CMESSAGE_error, GB_STRING msg; GB_STRING btn1; GB_STRING btn2; GB_STRING btn3)  GB.ReturnInteger(make_message(MSG_ERROR, 3, (void *)_p));END_METHODBEGIN_METHOD_VOID(CMESSAGE_exit)  delete _question_pixmap;  delete _trash_pixmap;END_METHODGB_DESC CMessageDesc[] ={  GB_DECLARE("Message", 0), GB_VIRTUAL_CLASS(),  GB_STATIC_METHOD("_exit", NULL, CMESSAGE_exit, NULL),  GB_STATIC_METHOD("_call", "i", CMESSAGE_info, "(Message)s[(Button)s]"),  GB_STATIC_METHOD("Info", "i", CMESSAGE_info, "(Message)s[(Button)s]"),  GB_STATIC_METHOD("Warning", "i", CMESSAGE_warning, "(Message)s[(Button1)s(Button2)s(Button3)s]"),  GB_STATIC_METHOD("Question", "i", CMESSAGE_question, "(Message)s[(Button1)s(Button2)s(Button3)s]"),  GB_STATIC_METHOD("Error", "i", CMESSAGE_error, "(Message)s[(Button1)s(Button2)s(Button3)s]"),  GB_STATIC_METHOD("Delete", "i", CMESSAGE_delete, "(Message)s[(Button1)s(Button2)s(Button3)s]"),  GB_END_DECLARE};/***************************************************************************  MyMessageBox***************************************************************************/MyMessageBox::MyMessageBox(    const QString& caption, const QString &text, Icon icon,    int button0, int button1, int button2): QMessageBox(caption, text, icon, button0, button1, button2, qApp->activeWindow()){  center = true;  adjustSize();  if (width() < 256)    resize(256, height());    setMinimumSize(width(), height());  setMaximumSize(width(), height());  setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));}#if 0void MyMessageBox::showEvent(QShowEvent *e){  QMessageBox::showEvent(e);  if (center)  {    QPoint p(      (qApp->desktop()->width() - width()) / 2,       (qApp->desktop()->height() - height()) / 2      );    //qDebug("%d x %d / %d x %d", qApp->desktop()->width(), qApp->desktop()->height(), mb.width(), mb.height());    //qDebug("(%d, %d) / (%d, %d)", p.x(), p.y(), mb.parentWidget()->x(), mb.parentWidget()->y());    //p = mb.parentWidget()->mapFromGlobal(p);    //qDebug("==> (%d, %d)", p.x(), p.y());    //mb.reparent(mb.parentWidget(), Qt::WStyle_Customize | Qt::WStyle_DialogBorder | Qt::WStyle_Title | Qt::WStyle_SysMenu | Qt::WType_Dialog, p);    //qDebug("move MessageBox to (%d %d)", mb.pos().x(), mb.pos().y());        move(64, 64);      center = false;  }  }#endifint MyMessageBox::run(){  QPoint p(64, 64);    clearWFlags(WDestructiveClose);  clearWFlags(WShowModal);      show();    reparent(qApp->activeWindow(), getWFlags() | WStyle_DialogBorder | WShowModal, p); // WShowModal  move(p);  show();  qApp->eventLoop()->enterLoop();    return result();  }  /***************************************************************************  CMessage***************************************************************************/CMessage CMessage::manager;bool CMessage::eventFilter(QObject *o, QEvent *e){  if (e->type() == QEvent::Show)  {    QMessageBox *mb = (QMessageBox *)o;      mb->move((qApp->desktop()->width() - mb->width()) / 2, (qApp->desktop()->height() - mb->height()) / 2);    mb->removeEventFilter(this);  }    return QObject::eventFilter(o, e);    // standard event processing}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -