如何解决wxWidgets:类wxDialog *无法转换为类wxApp *
问题恰恰是标题中的内容,我的wxWidgets应用程序崩溃了,因为从对话框类到应用程序类的转换不起作用。有帮助吗?
错误消息:
错误C2440:“正在初始化”:无法从“ MP *”转换为“ MPApp *”
错误C2664:'void wxAppBase :: SetTopWindow(wxWindow *)':无法将参数1从'MPApp *'转换为'wxWindow *'
MPApp.cpp:
#include "MPApp.h"
#include "MP.h"
IMPLEMENT_APP(MPApp)
bool MPApp::OnInit()
{
MPApP* dialog = new MP((NULL));
SetTopWindow(dialog);
dialog->Show(true);
return true;
}
int MPApp::OnExit()
{
return 0;
}
MPApp.h:
#ifndef __MPApp_h__
#define __MPApp_h__
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#else
#include <wx/wxprec.h>
#endif
class MPApp : public wxApp
{
public:
bool OnInit();
int OnExit();
};
#endif
MP.h:
#ifndef __MP_h__
#define __MP_h__
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dialog.h>
#else
#include <wx/wxprec.h>
#endif
#include <list>
#include <wx/menu.h>
#include <wx/timer.h>
#include <wx/listctrl.h>
#include <wx/textctrl.h>
#include <wx/stattext.h>
#include <wx/checkBox.h>
#include <wx/mediactrl.h>
#include <wx/slider.h>
#include <wx/button.h>
#include <wx/bmpbuttn.h>
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/toplevel.h>
#undef MPSTYLE
#define MPSTYLE wxWANTS_CHARS | wxALWAYS_SHOW_SB | wxCAPTION | wxRESIZE_BORDER | wxSYstem_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_Box | wxMAXIMIZE_Box | wxCLOSE_Box
class MP : public wxDialog
{
private:
DECLARE_EVENT_TABLE();
public:
//Constuctor
MP(wxWindow* parent,wxWindowID id = 0,const wxString& title = wxT("Music"),const wxPoint& pos = wxDefaultPosition,const wxSize& size = wxDefaultSize,long style = MPSTYLE);
virtual ~MP();
//Player
void PlayFileNow();
// EVENTS
// Command Events
void AddToQueue(wxCommandEvent& event);
void WxButton1Click(wxCommandEvent& event);
void PlayButtonClick(wxCommandEvent& event);
void NextButtonClick(wxCommandEvent& event);
void PrevIoUsButtonClick(wxCommandEvent& event);
void StopButtonClick(wxCommandEvent& event);
void RandomCheckBoxClick(wxCommandEvent& event);
void WxButton2Click(wxCommandEvent& event);
void SavePlaylistClick(wxCommandEvent& event);
void LoadplaylistClick(wxCommandEvent& event);
void AddButtonClick(wxCommandEvent& event);
void PlaylistsButtonClick(wxCommandEvent& event);
void FindButtonClick(wxCommandEvent& event);
void FindTextEditEnter(wxCommandEvent& event);
void FindNextButtonClick(wxCommandEvent& event);
void FindPrevButtonClick(wxCommandEvent& event);
//Media Events
void WxMediaCtrl1MediaFinished(wxMediaEvent& event);
void WxMediaCtrl1MediaPause(wxMediaEvent& event);
void WxMediaCtrl1MediaPlay(wxMediaEvent& event);
void WxMediaCtrl1MediaStop(wxMediaEvent& event);
void WxMediaCtrl1MediaLoaded(wxMediaEvent& event);
//Key Events
void HotKeyNext(wxKeyEvent& event);
void HotKeyStop(wxKeyEvent& event);
void HotKeyPlay(wxKeyEvent& event);
void HotKeyPrev(wxKeyEvent& event);
//List Events
void WxListCtrl1ColLeftClick(wxListEvent& event);
void WxListCtrl1ColRightClick(wxListEvent& event);
void WxListCtrl1RightClick(wxListEvent& event);
void WxListCtrl1ItemActivated(wxListEvent& event);
void WxListCtrl1KeyDown(wxListEvent& event);
//UI Event
void SavePlaylistUpdateUI0(wxUpdateUIEvent& event);
//Scroll Events
void WxSlider2Scroll(wxScrollEvent& event);
void WxSlider1Scroll(wxScrollEvent& event);
//Timer Event
void WxTimer1Timer(wxTimerEvent& event);
//File Event
void MPDropFiles(wxDropFilesEvent& event);
//Mouse Event
void MPRightUP(wxMouseEvent& event);
private:
//GUI Control
//Menu items
wxMenu* PlaylistMenu;
wxMenu* WxPopupMenu1;
wxMenu* AddMenu;
//Timer item
wxTimer* WxTimer1;
//List item
wxListCtrl* WxListCtrl1;
//Button items
wxButton* FindPrevButton;
wxButton* FindNextButton;
wxButton* AddButton;
wxButton* PlaylistsButton;
wxButton* FindButton;
//Bitmaps
wxBitmapButton* PlayButton;
wxBitmapButton* PrevIoUsButton;
wxBitmapButton* NextButton;
//Text items
wxTextCtrl* FindTextEdit;
wxStaticText* WxStaticText1;
//Slider items
wxSlider* WxSlider2;
wxSlider* WxSlider1;
//Panel items
wxPanel* SearchPanel;
wxPanel* WxPanel1;
wxPanel* WxPanel;
//Check item
wxCheckBox* RandomCheckBox;
//Media item
wxMediaCtrl* WxMediaCtrl1;
//Sizer items
wxFlexGridSizer* WxFlexGridSizer1;
wxBoxSizer* WxBoxSizer1;
private:
//Enum IDs for GUI
enum
{
////GUI Enum Control ID Start
ID_MNU_LOAdplAYLIST_1028 = 1028,ID_MNU_SAVEPLAYLIST_1029 = 1029,ID_MNU_PLAY_PAUSE_1019 = 1019,ID_MNU_STOP_1020 = 1020,ID_MNU_NEXT_1021 = 1021,ID_MNU_PREVIoUS_1022 = 1022,ID_MNU_ADDFOLDER_1023 = 1023,ID_MNU_SAVEPLAYLIST_1024 = 1024,ID_MNU_LOAdplAYLIST_1025 = 1025,ID_MNU_ADDFILES_1026 = 1026,ID_MNU_ADDFOLDER_1027 = 1027,ID_WXTIMER1 = 1017,ID_WXLISTCTRL1 = 1015,ID_FINDPREVBUTTON = 1034,ID_FINDNEXTBUTTON = 1033,ID_FINDEDITTXT = 1044,ID_WXSTATICTEXT1 = 1032,ID_SEARCHPANEL = 1031,ID_FINDBUTTON = 1030,ID_RANDOMCHECKBox = 1018,ID_WXMEDIACTRL1 = 1016,ID_WXSLIDER2 = 1014,ID_WXSLIDER1 = 1013,ID_ADDBUTTON = 1008,ID_PLAYLISTS = 1007,ID_NEXTBUTTON = 1006,ID_STOPBUTTON = 1005,ID_PLAYBUTTON = 1004,ID_PREVIoUSBUTTON = 1003,ID_WXPANEL2 = 1002,ID_WXPANEL1 = 1011,////GUI Enum Control ID End
ID_HOT_PLAY,ID_HOT_STOP,ID_HOT_NEXT,ID_HOT_PREV,ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
};
private:
void OnClose(wxCloseEvent& event);
void CreateGUIControls();
protected:
// No description
void AddFilesFromFolder(wxString FileName);
//FileList Dirs,Files;
//wxTreeItemId root;
bool isPlaying;
long selItem;
// No description
void PlayThisFile(long id);
// No description
void PlayFromQueue();
std::list<wxString> lastPlayed,nextPlay;
// No description
void PlayNextFile();
void deselectAllFiles();
};
#endif
由于文件的长度,我无法包含MP.cpp,但是它可以很好地编译,并且我已经调试了问题。
解决方法
您为什么会期望这一行:
MPApp* dialog = new MP((NULL));
上班吗?您的MP
是wxDialog
,即一种顶层窗口。它与MPApp
完全不同,后者是一种应用程序对象。
也许这只是一个错字,你真的想写
MP* dialog = new MP((NULL));
但是,如果不是,那么您应该真正问自己自己想要在这里实现什么。
相切地,使用非模式对话框也是很不寻常的(模态对话框将显示为ShowModal()
,而不仅仅是Show()
,并且是在堆栈上而不是在堆栈上创建的堆)。对于普通的非模式窗口,wxFrame
几乎总是一个更好的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。