Как сделать экземпляр wxGrid
перетаскиваемым? То есть wxGrid
встроен в основной wxFrame
. По умолчанию можно переместить все окно приложения, щелкнув строку заголовка и просто перетащив ее. Как сделать так, чтобы все окно приложения можно было перемещать/перетаскивать, а также при нажатии/захвате внутри внутреннего wxGrid
объекта?
И код:
#include <wx/wx.h>
#include <wx/grid.h>
class ImageBgFrame : public wxFrame
{
public:
ImageBgFrame(wxFrame* frame, const wxString& title);
private:
void OnImagePanelPaint(wxPaintEvent&);
void OnExit(wxCommandEvent&);
void CreateScaledBg();
wxImageHandler* m_pngLoader;
wxPanel* m_imagePanel;
wxImage m_image;
wxBitmap m_BgBitmap;
wxGrid* m_grid;
};
ImageBgFrame::ImageBgFrame(wxFrame* frame, const wxString& title)
:wxFrame(frame, wxID_ANY, title)
{
m_pngLoader = new wxPNGHandler();
wxImage::AddHandler(m_pngLoader);
m_grid = new wxGrid( this, -1, wxPoint(0, 0), wxSize(400, 300) );
m_grid->CreateGrid(3, 8);
m_grid->SetCellValue(0, 0, "823");
m_grid->SetColFormatFloat(1);
m_grid->SetColFormatFloat(2);
// Try to load the image.
m_image = wxImage("D:\\Pobrane_2\\armor_info3.png", wxBITMAP_TYPE_PNG);
if (!m_image.IsOk())
{
return;
}
// Create the controls.
m_imagePanel = new wxPanel(this, wxID_ANY);
CreateScaledBg();
Layout();
// Bind Event Handlers
m_imagePanel->Bind(wxEVT_PAINT, &ImageBgFrame::OnImagePanelPaint, this);
}
void ImageBgFrame::OnImagePanelPaint(wxPaintEvent&)
{
if (m_imagePanel->GetSize() != m_BgBitmap.GetSize())
{
CreateScaledBg();
}
}
void ImageBgFrame::OnExit(wxCommandEvent&)
{
Close();
}
void ImageBgFrame::CreateScaledBg()
{
wxSize sz = m_imagePanel->GetSize();
m_BgBitmap = wxBitmap(m_image.Scale(sz.GetWidth(), sz.GetHeight(),
wxIMAGE_QUALITY_NORMAL));
}
class ImageBgApp : public wxApp
{
public:
bool OnInit()
{
ImageBgFrame* frame = new ImageBgFrame(NULL, "Image BG");
frame->SetTransparent(150);
frame->Show();
return true;
}
};
wxIMPLEMENT_APP(ImageBgApp);
@Dario101, Дарио101, тебе нужно перетащить настоящий wxGrid внутрь wxPanel/wxWidndow? Или вы хотите перетащить окно, когда щелкаете и перетаскиваете объект wxGrid? Пожалуйста, уточните.
@Игорь, второй - я бы хотел щелкнуть и перетащить объект wxGrid, чтобы переместить все окно приложения (НЕ шлифовку внутри окна!).
@Dario101 Dario101, тебе следует связать события мыши с объектом docs.wxwidgets.org/latest/… . Щелчком установите флаг и вызовите CaptureMouse(). В релизе сбросьте флаг и вызовите ReleaseCapture(). Ознакомьтесь с документацией здесь — docs.wxwidgets.org/latest/…
Вам придется фиксировать события мыши (нажатие кнопки, перемещение, отпускание, захват потери) во всех окнах сетки, т. е. wxGrid::GetGridWindow()
, GetGridRowLabelWindow()
, GetGridColLabelWindow()
и GetGridCornerLabelWindow()
, и соответственно перемещать окно самостоятельно.
Под Windows (только) проще сделать все окно перетаскиваемым, вернув HTCAPTION
из обработчика WM_NCHITTEST
, но это почти наверняка помешает пользователю нормально использовать wxGrid
.
Похоже, чтобы сделать wxGrid перетаскиваемым, позволяя перемещать все окно (wxFrame) при нажатии и перетаскивании внутри wxGrid, вам нужно будет обрабатывать события мыши непосредственно в виджете wxGrid.