Кодим с wxWidgets

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

Я давно не копался с wxWidgets, так как подсел на Qt начиная со второй версии. Но, на всех *NIX системах отрисовкой занимался порт wxGTK. Думаю и сейчас точно так же.
С уважением, Сергей.
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Угу - у меня стоит GTK+ прослойка для wx

P.S. По поводу Qt - он вроде бы везде выглядит одинаково, но по сравнению с нативными контролами операционок где он крутится, оно скороее выглядит как детские мультики - плюс несовместимости от версии к версии и необходимости скачивать гигабайты официальных дистров с сайта создателей при каждом апгрейде - короче я с Qt поработал (в том же 2019 году) и решил туда больше не возвращаться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Интересный косяк в виндовой сборке моего последнего теста - если в линуксе оно в DC точно под мышкой рисовало, то в винде (и в Wine) оно рисует выше примерно на высоту тулбара:
Screenshot from 2025-02-23 22-05-06.png
P.S. Отладка показывает, что при кликаньи приходят правильные координаты когда вертикальная координата 0 находится ниже тулбара, однако когда делается блиттинг в 0,0 то оно в винде рисует как бы под тулбаром (в линуксе всё ок - блиттинг тоже начинается ниже тулбара).

P.P.S. Универсально получилось вот так:

Code: Select all

void MyFrame::OnPaint(wxPaintEvent& event)
{
  wxRect r = GetClientRect();
  wxPaintDC dc(this);
//  dc.SetClippingRegion(GetUpdateRegion());
  dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0);
  char str[100];
  sprintf(str,"Paint %d:%d-%d:%d\n",r.x,r.y,r.width,r.height);
  SetStatusText(str);
}
Начало клиентского прямоугольника в винде выходит (0,32), а в линухе - (0,0)

P.P.P.S. Ещё под виндой было мерцание при каждой перерисовке - починилось через добавление пустого обработчика OnEraseBackground(…)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

О, я с Qt работаю с 2003 года...
Сейчас, кстати, она модульная. Причём, настолько хорошо конфигурируется, что, например, использую её в проектах со встроенным Linux, под i.MX6ULL.
С уважением, Сергей.
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

За Embedded насколько я помню Qt берёт большие бабки…
Я тут за главного - если что шлите мыло на me собака shaos точка net
aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

Это если надо что-то из коммерческих либ. А так сама базовая часть под LGPL.
С уважением, Сергей.
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Ну embedded отрисовка в Qt вся коммерческая была в 2019 году, не?…
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Shaos wrote: 23 Feb 2025 23:08 P.S. Отладка показывает, что при кликаньи приходят правильные координаты когда вертикальная координата 0 находится ниже тулбара, однако когда делается блиттинг в 0,0 то оно в винде рисует как бы под тулбаром (в линуксе всё ок - блиттинг тоже начинается ниже тулбара).

P.P.S. Универсально получилось вот так:

Code: Select all

void MyFrame::OnPaint(wxPaintEvent& event)
{
  wxRect r = GetClientRect();
  wxPaintDC dc(this);
//  dc.SetClippingRegion(GetUpdateRegion());
  dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0);
  char str[100];
  sprintf(str,"Paint %d:%d-%d:%d\n",r.x,r.y,r.width,r.height);
  SetStatusText(str);
}
Начало клиентского прямоугольника в винде выходит (0,32), а в линухе - (0,0)
Теперь другая напасть - уже в линухе - координаты клика мышью там считаются от тулбара (т.е. уже минус 32 пиксела), однако похоже при обработке мышиных событий проверки на выход за пределы рабочего поля окна не происходит и если я "порисую" на статусбаре и потом увеличу окно, то увижу, что там таки чото нарисовалось (в винде такого нету т.к. тулбар не учитывается)...

P.S. Вставил проверку на попадание в клиентские размеры - теперь вроде всё ок и там, и там:
Screenshot from 2025-02-24 18-58-23.png

Code: Select all

// wxWidgets sample #6

#include <wx/wx.h>

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifdef __WXUNIVERSAL__
#include <wx/univ/theme.h>
#endif

enum
{
 wxID_COMPILE = wxID_HIGHEST+1,
 wxID_EXPLODE
};

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

class MyFrame : public wxFrame
{
  int current_width;
  int current_height;
  int memdc_width;
  int memdc_height;
  wxMemoryDC *memdc;
  wxBitmap *bm;
 public:
  MyFrame(const wxString& title);
  void OnQuit(wxCommandEvent& event);
  void OnAbout(wxCommandEvent& event);
  void OnSize(wxSizeEvent& event);
  void OnMotion(wxMouseEvent& event);
  void OnPaint(wxPaintEvent& event);
  void OnEraseBackground(wxEraseEvent& event);
 private:
  DECLARE_EVENT_TABLE()
};

DECLARE_APP(MyApp)

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
  MyFrame *frame = new MyFrame(wxT("My wxWidets App"));
  frame->Show(true);
  return true;
}

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
  EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)
  EVT_SIZE(            MyFrame::OnSize)
  EVT_MOTION(          MyFrame::OnMotion)
  EVT_PAINT(           MyFrame::OnPaint)
  EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
END_EVENT_TABLE()

void MyFrame::OnAbout(wxCommandEvent& event)
{
  wxString msg;
  msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
  wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
  Close();
}

void MyFrame::OnSize(wxSizeEvent& event)
{
  wxSize size = GetClientSize();
  current_width = size.GetWidth();
  current_height = size.GetHeight();
  char str[20];
  sprintf(str,"OnSize %d:%d",current_width,current_height);
  SetStatusText(str);
}

void MyFrame::OnMotion(wxMouseEvent& event)
{
  if(event.Dragging())
  {
    wxPoint point = event.GetPosition();
//    printf("Draw %d:%d\n",point.x,point.y);
    if(point.x < current_width && point.y < current_height)
    {
      wxPen pen(*wxBLACK, 1);
      memdc->SetPen(pen);
      memdc->DrawPoint(point);
      memdc->SetPen(wxNullPen);
      Refresh();
    }
  }
}

void MyFrame::OnPaint(wxPaintEvent& event)
{
  wxRect r = GetClientRect();
  wxPaintDC dc(this);
//  dc.SetClippingRegion(GetUpdateRegion());
  dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0);
  char str[100];
  sprintf(str,"Paint %d:%d-%d:%d (%d:%d)",r.x,r.y,r.width,r.height,current_width,current_height);
  SetStatusText(str);
}

void MyFrame::OnEraseBackground(wxEraseEvent& event)
{
}

const
#include "icon16x16.xpm"
const
#include "icon20x20_new.xpm"
const
#include "icon20x20_open.xpm"
const
#include "icon20x20_save.xpm"
const
#include "icon20x20_cut.xpm"
const
#include "icon20x20_copy.xpm"
const
#include "icon20x20_paste.xpm"
const
#include "icon20x20_compile.xpm"
const
#include "icon20x20_explode.xpm"

MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title)
{
  SetIcon(wxIcon(icon16x16_xpm));
  wxMenu *fileMenu = new wxMenu;
  wxMenu *helpMenu = new wxMenu;
  helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog"));
  fileMenu->Append(wxID_EXIT, wxT("E&xit...\tAlt-X"), wxT("Quit this program"));
  wxMenuBar *menuBar = new wxMenuBar();
  menuBar->Append(fileMenu, wxT("&File"));
//  menuBar->Append(helpMenu, wxT("&Edit"));
//  menuBar->Append(helpMenu, wxT("&Compile"));
//  menuBar->Append(helpMenu, wxT("&Run"));
  menuBar->Append(helpMenu, wxT("&Help"));
  SetMenuBar(menuBar);
  CreateStatusBar(2);
  SetStatusText(wxT("Welcome to wxWidgets!"));

  wxToolBar* toolBar = new wxToolBar(this, wxID_ANY,
    wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxNO_BORDER);
  wxBitmap bmpNew    (icon20x20_new_xpm);
  wxBitmap bmpOpen   (icon20x20_open_xpm);
  wxBitmap bmpSave   (icon20x20_save_xpm);
  wxBitmap bmpCut    (icon20x20_cut_xpm);
  wxBitmap bmpCopy   (icon20x20_copy_xpm);
  wxBitmap bmpPaste  (icon20x20_paste_xpm);
  wxBitmap bmpCompile(icon20x20_compile_xpm);
  wxBitmap bmpExplode(icon20x20_explode_xpm);
  toolBar->AddTool (wxID_NEW,     bmpNew,     wxT("New"));
  toolBar->AddTool (wxID_OPEN,    bmpOpen,    wxT("Open"));
  toolBar->AddTool (wxID_SAVE,    bmpSave,    wxT("Save"));
  toolBar->AddSeparator();
  toolBar->AddTool (wxID_CUT,     bmpCut,     wxT("Cut"));
  toolBar->AddTool (wxID_COPY,    bmpCopy,    wxT("Copy"));
  toolBar->AddTool (wxID_PASTE,   bmpPaste,   wxT("Paste"));
  toolBar->AddSeparator();
  toolBar->AddTool (wxID_COMPILE, bmpCompile, wxT("Compile"));
  toolBar->AddTool (wxID_EXPLODE, bmpExplode, wxT("Execute"));
  toolBar->Realize();
  SetToolBar(toolBar);

  memdc = new wxMemoryDC;
  memdc_width = 2048;
  memdc_height = 2048;
  bm = new wxBitmap(memdc_width,memdc_height,-1);
  memdc->SelectObject(*bm);
  memdc->SetBackground(*wxWHITE_BRUSH);
  memdc->Clear();

  GetSize(&current_width,&current_height);
}


P.P.S. Теперь надо на маке поглядеть как оно будет и можно начать прикручивать скроллы...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Shaos wrote: 24 Feb 2025 19:23 Теперь другая напасть - уже в линухе - координаты клика мышью там считаются от тулбара (т.е. уже минус 32 пиксела), однако похоже при обработке мышиных событий проверки на выход за пределы рабочего поля окна не происходит и если я "порисую" на статусбаре и потом увеличу окно, то увижу, что там таки чото нарисовалось (в винде такого нету т.к. тулбар не учитывается)...
На маке ещё смешнее - можно продолжать вести курсор с нажатием далеко за пределы окна и потом увеличив окно можно увидеть, что оно там тоже нарисовало :lol:

P.S. Ещё выяснилось что в wxWidgets-3.2.6, что у меня на маке, уже нельзя использовать старый вариант AddTool - надо переписать тесты 5 и 6 на использование нового варианта...

P.P.S. Попробовал новый "расширенный" вариант AddTool - оно собралось, но тулбар так и не появился...

P.P.P.S. Вот тут описаны особенности работы wxWidgets в макоси:
https://wiki.wxwidgets.org/WxMac-specific_topics
Интересно, что раньше wxWidgets входили в поставку MacOS X:
  • 10.4 has wxWidgets 2.5
  • 10.5 has wxWidgets 2.8.4
  • 10.6 has wxWidgets 2.8.8
  • 10.7 does not ship with wxWidgets. Apps linked to system libraries on 10.4-10.6 will not run.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

Решил я на свой яблосиликон поставить wxWidgets-3.0.5 (как в дебияне 11) напрямую собрав из сырцов (а не через brew как в прошлый раз) - делал вот по этой инструкции:

https://docs.wxwidgets.org/3.2/plat_osx_install.html

но конфигурил вот так (чтобы были статические сборки):

Code: Select all

../configure --with-osx_cocoa --with-macosx-version-min=11.0 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk --disable-shared --enable-macosx-arch=arm64
В моём примере тулбар так и не появился, но вот тест toolbar из поставки wx запустился вот в таком виде:
wxMac-toolbar.jpg
т.е. тулбар воткнулся в заголовок окна (а вот при попытке поиграть флажками, чтобы добавить второй вертикальный тулбар, оно упало)...

P.S. Вот для сравнения как выглядит тот же самый тест toolbar в том же самом wxWidgets-3.0.5 на линухе:
Screenshot from 2025-02-28 09-28-11.png
и с включённым вторым тулбаром:
Screenshot from 2025-02-28 09-28-31.png
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

Shaos wrote: 24 Feb 2025 16:44 Ну embedded отрисовка в Qt вся коммерческая была в 2019 году, не?…
Так мне GUI и не нужно. Мне нужно QtCore, QtNetwork, и прочие.
С уважением, Сергей.
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

aviator wrote: 28 Feb 2025 14:09
Shaos wrote: 24 Feb 2025 16:44 Ну embedded отрисовка в Qt вся коммерческая была в 2019 году, не?…
Так мне GUI и не нужно. Мне нужно QtCore, QtNetwork, и прочие.
Хм, а нафиг Qt нужен если без GUI? ;)
QList использовать вместо std::list? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

Shaos wrote: 28 Feb 2025 14:49 Хм, а нафиг Qt нужен если без GUI? ;)
QList использовать вместо std::list? ;)
Контейнеры это только часть. Самое главное - это динамическое связывание и сигналы-слоты. А ещё платформонезависимые абстракции к сокетам, файлам, портам, базам данных и прочему. Опять же, относительно легко реализовать поддержку принтеров, которые печатают промышленные этикетки (Brady, например). У них родной софт с весьма кривой и костыльной интеграцией со сторонними системами. И всё это расширяемо, можно написать свои специфические протоколы. Интеграция с тем же J-Link и прочими программаторами.
Для внутренних проектов, типа софта для тестирования и программирования железок на производстве, это незаменимо. А гуй в этом случае вообще - веб-страница. Всё крутится в коробке, которая прикручена к стенду Ingun, например. Она воткнута в локалку, а на комп тестировщика вообще ничего не ставится.
С уважением, Сергей.
User avatar
Shaos
Admin
Posts: 24086
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Кодим с wxWidgets

Post by Shaos »

а самим эту прослойку написать чтобы не зависеть от чужих глюков?
кстати наша контора потратила несколько лет, чтобы отовсюду выпилить следы Qt
Я тут за главного - если что шлите мыло на me собака shaos точка net
aviator
Maniac
Posts: 298
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Re: Кодим с wxWidgets

Post by aviator »

В одно лицо не потяну. И так всё от прошивок конечных устройств до шлюзов на мне. Ещё и PIC-ассемблер недавно нарисовался. Никогда с ними не сталкивался, а тут пришлось.
Boost не предлагать. Вот это уж "поделие" так "поделие"... Ещё и тормозное.
С уважением, Сергей.