Повторная активация диалога Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
ExxEnos
Earned a small fee
Earned a small fee
Posts: 15
Joined: Fri Sep 26, 2008 4:48 pm

Повторная активация диалога

Post by ExxEnos » Fri Oct 17, 2008 1:51 pm

Пишу фотошопный плагин под Mac
Проблема следующая: любой созданный мной диалог (наследник wxDialog) кроме самого первого создается криво (контролы есть, но они не перерисовываются и не реагируют на события), сам диалог на события реагирует.

Следующий код работает так как нужно:

Code: Select all

int argc = 0;
char **argv = NULL;
wxEntryStart(argc, argv);
	AboutDialog *dlgAbout = new AboutDialog(_T("About"));
	dlgAbout->ShowModal();
	MainDialog *dlgMain = new MainDialog(_T("Main"));
	dlgMain->ShowModal();
wxEntryCleanup();
Тоесть создается AboutDialog, модально работает, закрывается, создается MainDialog, модально работает, закрывается. При повторном вызове функции оба диалога создаются без перерисовки.

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Sat Oct 18, 2008 6:19 am

Так пальцем в небо что делаешь перед закрытием этих диалогов?

Типа там ShowModal(false) делаешь?

ExxEnos
Earned a small fee
Earned a small fee
Posts: 15
Joined: Fri Sep 26, 2008 4:48 pm

Post by ExxEnos » Mon Oct 20, 2008 10:41 am

borr_1 wrote:Так пальцем в небо что делаешь перед закрытием этих диалогов?

Типа там ShowModal(false) делаешь?
Пробовал следующее (в том числе и вместе):
Close(false);
EndModal(wxID_OK);
Destroy();
Резульатат одинаковый.

Кнопка закрытия диалога во второй раз просто не срабатывает.

syber
Experienced Solver
Experienced Solver
Posts: 53
Joined: Thu Apr 27, 2006 1:34 pm

Post by syber » Tue Oct 21, 2008 7:26 am

попробуй сделать примерно так:

Code: Select all

pMyApp = new MyApp;
wxApp::SetInstance(pMyApp);

	
int argc = 0;
char **argv = NULL;
wxEntryStart(argc, argv);

wxTheApp->CallOnInit();

        AboutDialog *dlgAbout = new AboutDialog(_T("About"));
        dlgAbout->ShowModal();
        MainDialog *dlgMain = new MainDialog(_T("Main"));
        dlgMain->ShowModal();
wxEntryCleanup(); 
Во всяком случае у меня все работает, если не поможет тогда весь код в студию.

ExxEnos
Earned a small fee
Earned a small fee
Posts: 15
Joined: Fri Sep 26, 2008 4:48 pm

Re: Повторная активация диалога

Post by ExxEnos » Wed Oct 22, 2008 12:28 pm

Нет, не помогло.

Вот немного измененный код который, работает также как описывалось в первом посте.
#include "Dissolve.h"

#include "Dialog.h"
#include "About.h"

#include "DissolveScripting.h"
#include "FilterBigDocument.h"

bool started = false;

FilterRecord *gFilterRecord = NULL;
int32 *gDataHandle = NULL;
int16 *gResult = NULL;
SPBasicSuite * sSPBasic = NULL;

Data *gData = NULL;
Parameters *gParams = NULL;

class wxDLLApp : public wxApp
{
public:
AboutDialog *dlgAbout;
public:
bool OnInit(){
wxMessageBox(_T("wxDLLApp::OnInit()"));
dlgAbout = new AboutDialog(NULL, wxID_ANY, _T("About"),wxPoint(200,200), wxSize(446,150), wxSTAY_ON_TOP|wxCLOSE_BOX);
dlgAbout->ShowModal();
return true;
}
int OnExit(){
wxMessageBox(_T("wxDLLApp::OnExit()"));
dlgAbout->Destroy();
delete dlgAbout;
return 0;
}
DECLARE_EVENT_TABLE()
};

//IMPLEMENT_APP_NO_MAIN(wxDLLApp)

BEGIN_EVENT_TABLE(wxDLLApp, wxApp)
END_EVENT_TABLE()

wxPoint offscreenPoint(-5000,-5000);

void DoAbout(void);
void DoParameters(void);
void DoPrepare(void);
void DoStart(void);
void DoContinue(void);
void DoFinish(void);

DLLExport MACPASCAL void PluginMain(const int16 selector,
void * filterRecord,
int32 * data,
int16 * result)
{
gFilterRecord = (FilterRecordPtr)filterRecord;
gDataHandle = data;
gResult = result;

switch (selector)
{
case filterSelectorAbout:
DoAbout();
break;
case filterSelectorParameters:
DoParameters();
break;
case filterSelectorPrepare:
DoPrepare();
break;
case filterSelectorStart:
DoStart();
break;
case filterSelectorContinue:
DoContinue();
break;
case filterSelectorFinish:
DoFinish();
break;
default:
break;
}
}

void DoAbout(void){

wxDLLApp *pMyApp = new wxDLLApp;
wxApp::SetInstance(pMyApp);

int argc = 0;
char **argv = NULL;
wxEntryStart(argc, argv);
wxTheApp->CallOnInit();
pMyApp->OnExit();
wxEntryCleanup();
}

void DoParameters(void){

}

void DoPrepare(void){

}

void DoStart(void){

}


void DoContinue(void){

}


void DoFinish(void){

}
P.S. Напомню, что программа - фильтр для Photoshop под Mac OS X, c исполняемыми файлами под Mac и фильтром под Win подобных проблем не возникает.

Post Reply