Консультация № 151777
25.11.2008, 14:58
0.00 руб.
25.11.2008, 18:30
0 9 1
Здравствуйте , увахаемые эксперты. У меня 2 вопроса по С++ - нужно сдать завтра, а я пробездельничал.
1. На форме кнопка. При нажатии левой кл. мышки на форме кнопка переносится в место, куда показывает курсор.
2. На форме есть вторая форма, которую не видно. При нажатии на любой из форм - дочерняя форма становится видимой.
Если не успеет выйти рассылка пришлите , пожалуйста на е-майл : bipline@list.ru
Заранее спасибо.

Обсуждение

Неизвестный
25.11.2008, 20:25
общий
Если для Windows, в какой-то среде (например, visual studio+mfc) или на чистом win api?
давно
Старший Модератор
17042
808
25.11.2008, 22:37
общий
это ответ
Здравствуйте, Alexeishatko!
К сожалению, Вы не указали ни операционную систему, под которой работаете, ни среду разработки. Поэтому приведу платформозависимый вариант решения (ОС - Windows, среда разработки Borland C++ Builder) и кроссплатформенный вариант (ОС Linux, MacOS, Windows, коммерческие версии Unix и др., библиотека - Qt 3.x). Вторая задача представляется более простой, поэтому начнём именно с неё.
Задача 2.
Пример 1. Для удобства оставил компонентам Borland C++ Builder те имена, которые даются им по умолчанию. Создайте проект. Установите свойство Visible Form1 в true. Создайте новую форму (File - NewForm). Установите свойство Visible Form2 в false. Щёлкните по Form1, выберите в меню File - Include Unit Hdr, в появившемся диалоговом окне выберите Unit2. Тем самым, при запуске приложения вторая форма будет невидимой. Создайте обработчик события OnClick Form1. В него запишите Form2->Visible = true; Тем самым, при щелчке на главной форме приложения на этапе выполнения будет появляться дочерняя форма (см. Пример 1 приложения).
Пример 2 Создадим класс главного окна приложения TMainForm, унаследовав его от QMainWindow, а также класс дочернего окна TSecondForm, унаследовав его от QDialog (см. Пример 2 приложения). Переменную класса TSecondForm объявим в качестве закрытого члена класса TMainForm. Переопределим событие mouseReleaseEvent главной формы, в результате чего по щелчку на главной форме будет генерироваться сигнал Clicked(). В конструкторе главной формы установим соединение между сигналом Clicked() и слотом ClickedSlot(). Этот слот показывает дочернюю форму: pSecondWindow->show(); (см. Пример 2 в приложении). Задача выполнена.
Задача 1.
Пример 3. Создайте новый проект Borland C++ Builder. Поместите на форму кнопку. Установите её свойство Visible в false. Создайте обработчик события OnMouseUp главной формы. В него запишите:
Код:

Button1->Left = X;
Button1->Top = Y;
Button1->Visible = true;

Тем самым, верхнелевые координаты мыши устанавливаются согласно координатам щелчка мыши по форме, а кнопка становится видимой (см. Пример 3 приложения).
Пример 4. Создадим класс главного окна приложения TMainForm, унаследовав его от QMainWindow. В качестве закрытого члена приложения объявим кнопку pButton класса QPushButton. В конструкторе главной формы запишем pButton->setShown(FALSE); (кнопка невидима). Аналогично вышеописанному, переопределим событие mouseReleaseEvent главной формы, однако сигнал Clicked в качестве параметров будет получать координаты щелчка мышью по форме. В вызываемом сигналом слоте ClickedSlot(int, int) установим геометрию кнопки, где верхнелевыми координатами кнопки будут координаты щелчка мышью, а нижнеправими - длина и ширина самой кнопки. Делаем кнопку видимой: pButton->setShown(TRUE); Тем самым, при щелчке мышью по форме в этом месте будет появляться кнопка (точнее, перемещаться туда - см. Пример 4). Задача выполнена.
Удачи!

Приложение:
//---------------------------------------------------------------------------
// Пример 1
//---------------------------------------------------------------------------
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
Form2->Visible = true;
}
//---------------------------------------------------------------------------
Пример 2
//---------------------------------------------------------------------------
#ifndef _TMainForm_h_
#define _TMainForm_h_
//---------------------------------------------------------------------------
#include <qmainwindow.h>
//---------------------------------------------------------------------------
class QMouseEvent;
class TSecondForm;
//---------------------------------------------------------------------------
class TMainForm : public QMainWindow
{
Q_OBJECT

public:
TMainForm(QWidget* pParent = 0, const char* psName = "MainForm", WFlags Flag = WType_TopLevel);
~TMainForm();

private:
TSecondForm* pSecondWindow;

signals:
void Clicked();

protected:
void mouseReleaseEvent(QMouseEvent*);

protected slots:
void ClickedSlot();
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include "TMainForm.h"
#include "TSecondForm.h"
//---------------------------------------------------------------------------
TMainForm::TMainForm(QWidget* pParent, const char* psName, WFlags Flag)
: QMainWindow(pParent, psName, Flag)
{
if(!psName) setName("MainForm");

resize(QSize(600, 400));

pSecondWindow = new TSecondForm(this);

connect(this, SIGNAL(Clicked()), this, SLOT(ClickedSlot()));
}
//---------------------------------------------------------------------------
TMainForm::~TMainForm()
{
}
//---------------------------------------------------------------------------
void TMainForm::mouseReleaseEvent(QMouseEvent* Event)
{
if(rect().contains(Event->pos())) emit Clicked();
}
//---------------------------------------------------------------------------
void TMainForm::ClickedSlot()
{
pSecondWindow->show();
}
//---------------------------------------------------------------------------
#ifndef _TSecondForm_h_
#define _TSecondForm_h_
//---------------------------------------------------------------------------
#include <qdialog.h>
//---------------------------------------------------------------------------
class TSecondForm : public QDialog
{
Q_OBJECT
2
public:
TSecondForm(QWidget* pParent = 0, const char* psName = "MainForm", bool bModal = FALSE, WFlags Flag = 0);
~TSecondForm();
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include "TSecondForm.h"
//---------------------------------------------------------------------------
TSecondForm::TSecondForm(QWidget* pParent, const char* psName, bool bModal, WFlags Flag)
: QDialog(pParent, psName, bModal, Flag)
{
resize(QSize(600, 400));
}pButton->setShown(TRUE);
//---------------------------------------------------------------------------
TSecondForm::~TSecondForm()
{
}
//---------------------------------------------------------------------------
#include <qapplication.h>
//---------------------------------------------------------------------------
#include "TMainForm.h"
//---------------------------------------------------------------------------
int main(int iArgc, char* psArgv[])
{
QApplication MyProgramme(iArgc, psArgv);

TMainForm* pMainWindow = new TMainForm;
MyProgramme.setMainWidget(pMainWindow);
pMainWindow->show();

return MyProgramme.exec();
}
//---------------------------------------------------------------------------
// Пример 3
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Button1->Left = X;
Button1->Top = Y;
Button1->Visible = true;
}
//---------------------------------------------------------------------------
// Пример 4
//---------------------------------------------------------------------------
#ifndef _TMainForm_h_
#define _TMainForm_h_
//---------------------------------------------------------------------------
#include <qmainwindow.h>
//---------------------------------------------------------------------------
class QPushButton;
class QMouseEvent;
//---------------------------------------------------------------------------
class TMainForm : public QMainWindow
{
Q_OBJECT

public:
TMainForm(QWidget* pParent = 0, const char* psName = "MainForm", WFlags Flag = WType_TopLevel);
~TMainForm();

private:
QPushButton* pButton;

signals:
void Clicked(int, int);

protected:
void mouseReleaseEvent(QMouseEvent*);

protected slots:
void ClickedSlot(int, int);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include "TMainForm.h"
//---------------------------------------------------------------------------
#include <qpushbutton.h>
//---------------------------------------------------------------------------
TMainForm::TMainForm(QWidget* pParent, const char* psName, WFlags Flag)
: QMainWindow(pParent, psName, Flag)
{
if(!psName) setName("MainForm");

resize(QSize(600, 400));

pButton = new QPushButton(this);
pButton->setText(trUtf8("Кнопка"));
pButton->setShown(FALSE);

connect(this, SIGNAL(Clicked(int, int)), this, SLOT(ClickedSlot(int, int)));
}
//---------------------------------------------------------------------------
TMainForm::~TMainForm()
{
}
//---------------------------------------------------------------------------
void TMainForm::mouseReleaseEvent(QMouseEvent* Event)
{
if(rect().contains(Event->pos())) emit Clicked(Event->x(), Event->y());
}
//---------------------------------------------------------------------------
void TMainForm::ClickedSlot(int iX, int iY)
{
pButton->setGeometry(QRect(iX, iY, pButton->width(), pButton->height()));
pButton->setShown(TRUE);
}
//---------------------------------------------------------------------------
#include <qapplication.h>
//---------------------------------------------------------------------------
#include "TMainForm.h"
//---------------------------------------------------------------------------
int main(int iArgc, char* psArgv[])
{
QApplication MyProgramme(iArgc, psArgv);

TMainForm* pMainWindow = new TMainForm;
MyProgramme.setMainWidget(pMainWindow);
pMainWindow->show();

return MyProgramme.exec();
}
//---------------------------------------------------------------------------
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
26.11.2008, 06:10
общий
Перенесено из формы ответов
Здравствуйте, Alexeishatko!
К сожалению, на С++ такое реализовать невозможно.
Рисование форм, кнопок и прочих графических элементов это расширение соотвествующими библиотеками. Их существуют десятки и большинство из них платформо зависемы. Ответ на данный вопрос невозможен, хотябы по той причине, что не указана ОС и оконная библиотека классов(в некоторых случаях является основой IDE, таких как Delphi, Builder, e.t.c.)
В следующий раз уточняйте задачу.
Удачи!
Ответил: Lex NewtoN, 2-й класс Дата отправки: 25.11.2008, 23:42
Неизвестный
26.11.2008, 06:14
общий
Lex NewtoN
К сожалению, на С++ такое реализовать невозможно.


А на чем, по Вашему делаются те самые "оконные библиотеки классов"??? На чем, как Вы думаете - сделаны всеми любимые ОС Windows, MacOS, GNU/Linux и т.д.?
Неизвестный
26.11.2008, 12:14
общий
Verena, здравствуйте !
Вторую задачу я уже сделал сам и уже ее сдал и защитил. За первую возьмусь сегодня вечером. Нам надо написать в С++, в Visual С++ и в Delphi. Verena , если тебе не сложно - какая функция возвращает координаты курсора? И координаты верхнего левого угла кнопки я приравняю к координатам курсора. Это правильно ?
Удач тебе. Алексей.
давно
Старший Модератор
17042
808
26.11.2008, 12:26
общий
Я, правда, не Verena, но: для Delphi делаете всё как в Примере 3. Единственно стрелку (->) заменяете на точку :
Код:

Button1.Left = X;
Button1.Top = Y;
Button1.Visible = true;


А для Visual C++ 6 можете использовать Пример 4, только первоначально установите библиотеку Qt 3.2.1 для Windows.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
26.11.2008, 15:04
общий
Андрей спасибо вам большое ! Я скажу вам честно - половина ваших примеров я понять пока не в состоянии - радует, что есть куда расти. Я пока пишу только првые программы на Builder-e и , соответственно все они - это детский лепет . Я написал какой-то один простенький класс на С , потом попытался его наследовать и долго смеялся, что этот бред работает. Поэтому ваши классы - для уже продвинутых программеров. Мне бы еще в песочнице покавыряться. Но все равно большое - огромное спасибо.
Вам удач ! Чтобы финансовый кризис прлетел мимо вас , а вы и не заметили !
давно
Старший Модератор
17042
808
26.11.2008, 15:53
общий
Рад, если чем-то мог помочь. Но примеры для Builder'а как раз очень просты, т.к. в этой среде все сложности "укрыты" от программиста (хотя и доступны). А вот Visual C++ простым никогда не был... Но впрочем, многое зависит от версии.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
27.11.2008, 00:16
общий
Если не ориентироваться на среду (т.е. и Visual, и в Builder будет работать) это делается на winapi так:
POINT cursor_pos;
GetCursorPos( & cursor_pos);
Форма ответа