2013-07-20 3 views
1

Я хотел бы заполнить окно приложения, созданное с помощью wxWidgets с помощью wxWebView. Просмотрев образец wxWebView, автор создал wxFrame, который затем содержал wxBoxSizer, и wxWebView был добавлен непосредственно к этому. Однако я хотел бы, чтобы мое приложение использовало wxSingleChoiceDialog, насколько я могу судить, это означает, что мне нужно включить что-то вроде wxPanel для использования в качестве родителя диалогового окна (первым аргументом для конструктора является «родительский» тип wxWindow). Поэтому в моем приложении я поместил wxPanel в wxFrame, а затем установил wxBoxSizer из wxPanel для включения wxWebView. К сожалению, теперь wxWebView больше не подходит для полного окна приложения, и я не уверен, почему. Ниже приведен упрощенный пример приложения, которое я пытаюсь создать.Заполнение окна с помощью wxWebView

main.h

#ifndef MAIN_H 
#define MAIN_H 

#include <wx/wx.h> 

class MyApp : public wxApp 
{ 
public: 
    virtual bool OnInit(); 
}; 


DECLARE_APP(MyApp) 
#endif 

main.cpp

#include "main.h" 
#include "mainframe.h" 

IMPLEMENT_APP(MyApp) 

bool MyApp::OnInit() 
{ 
    MainFrame *mainFrame = new MainFrame(wxT("Content Creator")); 
    mainFrame->Show(true); 

    return true; 
} 

mainframe.h

#ifndef MAINFRAME_H 
#define MAINFRAME_H 

#include <wx/wx.h> 
#include <wx/webview.h> 

class MainFrame : public wxFrame 
{ 
public: 
    wxPanel *panel; 
    wxBoxSizer *topsizer; 
    wxMenuBar *menubar; 
    wxMenu *file; 
    wxWebView *webView; 
    wxString editorURL; 

    MainFrame(const wxString& title); 
    void initMenu(); 
    void initEditor(); 
}; 
#endif 

mainframe.cpp

#include "mainframe.h" 

MainFrame::MainFrame(const wxString& title) 
    : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800,600)) 
{ 
    panel = new wxPanel(this, -1); 
    topsizer = new wxBoxSizer(wxVERTICAL); 
    panel->SetSizer(topsizer); 

    initMenu(); 
    initEditor(); 
} 

void MainFrame::initMenu() 
{ 
    menubar = new wxMenuBar; 

    file = new wxMenu; 
    //file->Append(wxID_EXIT, wxT("Quit")); 
    menubar->Append(file, wxT("File")); 

    SetMenuBar(menubar); 
} 

void MainFrame::initEditor() 
{ 
    editorURL = "file:///C:/Users/kenwood/Desktop/MarkCreator2/ckeditor/samples/editor.html"; 
    webView = wxWebView::New(panel, wxID_ANY, editorURL); 
    topsizer->Add(webView, 1, wxEXPAND | wxALL, 0); 
} 

Вот скриншот приложения, которое создает: Screenshot

Кто-нибудь знает, как я могу заставить этот wxWebView заполнить окно приложения (или, по крайней мере, почему он не подходит для окна, потому что я явно не вижу что-то здесь)? Я понимаю, что могу создать wxWebView, чтобы указать размер, который будет равен размеру окна, но тогда, когда пользователь изменит размер экрана, веб-просмотр больше не будет такого же размера, как и окно приложения.

Спасибо.

EDIT:

Кроме того, я использую WxWidgets версии 2.9.4

EDIT 2:

Оказывается, что вызов initEditor() перед InitMenu() производит желаемый результат (но не наоборот). Кто-нибудь знает, в чем причина этого? Мне бы очень хотелось сначала вызвать initMenu(), если это возможно.

+0

Возможно ли, что это поведение является ошибкой в ​​версии 2.9.4 wxWidgets? Кажется, wxWebView может быть относительно новым для wxWidgets. Возможно, исправление до сборки соединительной линии исправить? – user2027202827

+0

Я попытался использовать wxPanel вместо wxWebView и столкнулся с той же проблемой, что и панель, отображаемая в верхнем левом углу экрана, поэтому кажется, что мои проблемы связаны с моим кодом. С этой добавленной информацией кто-нибудь видит, где я могу ошибаться? – user2027202827

+1

При создании вашего wxSingleChoiceDialog вы должны передать указатель на свой кадр как на родителя, а не на wxPanel. – SteveL

ответ

2

Вам необходимо добавить webView к панелям sizer. Ваш вопрос на самом деле не имеет ничего общего с wxWebView, а касается макета, и я настоятельно рекомендую (пере) читать corresponding section руководства.

+0

Хорошо, я попробую обзор sizers (в первый раз) и, надеюсь, это улучшит многие мои проблемы. Спасибо за совет снова VZ. – user2027202827

+0

Я прочитал обзор sizers и понял, почему вы его предложили, исправил эту проблему (thx), но у меня все еще есть проблема, присутствующая в моем полном приложении. Я обновил предоставленный код. В: Знаете ли вы, почему вызов initMenu() до initEditor() (работает в обратном порядке) приведет к тому, что веб-просмотр будет отображаться в виде небольшого окна на скриншоте? Возможно, это ошибка? Я в тупике, и у меня проблемы с поиском google, который приводит к тому, у кого есть аналогичная проблема. Еще раз спасибо. – user2027202827

+0

Хорошо, после того, как я ударил головой по столу, я думаю, что, наконец, понял, почему это не работает. Я считаю, что это потому, что wxWebView не имеет параметра пропорции, поэтому вы должны явно указать его размер. Я неправильно понял, что wxDefaultSize означает заполнение экрана, поскольку, когда я тестировал, я использовал wxDefaultSize для wxPanel, который был прямым дочерним элементом wxFrame, и он заполнил окно. Насколько я могу сказать, поведение по умолчанию для любого первого дочернего элемента wxFrame заключается в заполнении окна. – user2027202827

1

Для тех, кто имеет схожие проблемы, одной из основных проблем с моим кодом является то, что я создавал «панель» перед созданием строки меню. Вызвав initMenu() в качестве первого вызова функции в конструкторе, я смог отобразить веб-просмотр в полном окне приложения - advice, предоставленный прославленным «doublemax» на форумах wxWidgets. Спасибо за помощь каждого.

Смежные вопросы