На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Наши Исходники"
Раздел предназначен для публикации различных исходников и программных решений (в виде исходных текстов), которые Вы считаете достойными внимания и/или интересными. Язык исходника значения не имеет. Это может быть C/C++, Pascal, Perl, PHP, C#, Foth, Prolog или любой другой существующий язык программирования. Единственный момент – в названии темы этот язык должен быть указан. Например, «[C++] Представление чисел в римской записи». Сам исходный текст должен содержаться в первом посте темы. Если исходник занимает не больше одного-двух экранов, то допустимо его публикация непосредственно в посте. Иначе исходный текст должен быть прикреплен к посту в виде архива. Кроме того, первый пост должен содержать:

- Информацию о платформе/компиляторе, для которых предназначен исходный текст (если эта информация существенна)
- Ссылку на оригинал и автора (если публикуется чужой исходный текст)
- Максимально подробное описание – какую задачу решает опубликованный исходный текст, и чем он интересен.

Плагиат крайне не приветствуется. Также не приветствуется публикация исходных текстов вирусов, крэков и т. п. информации. Это элементарно противозаконно.

Для быстрого поиска нужного исходника можно воспользоваться навигатором:
Быстрый поиск по разделу
Страницы: (13) [1] 2 3 ...  12 13 все  ( Перейти к последнему сообщению )  
> [C++] GUI на API (библиотека), Очередной велосипед :)
    Ключевые слова: GUI, WinApi, Win32, библиотека

    Часто на форуме задается вопрос о написании гуевого приложения на C++ с использованием API без MFC/WTL, так после некоторого обсуждения этого вопроса по электронной почте с ElcnU и часто встречающимися вопросами решил написать маленькую обертку для API функций для создания пользовательского интерфейса.

    Первая версия и примеры использования в аттаче.

    На данный момент есть много недоделанного, типа написание кучи оберток для класса CDC и класса WinRoot (базового класса окон), но это мелочи, основная идея реализована. По мере возможности и желания буду добавлять функционал и выкладывать новые версии.

    К преимуществам могу отнести такое как небольшой размер релизного приложения по сравнению с MFC приложениями и простота использования.

    Пример использования:
    ExpandedWrap disabled
      namespace
      {
        using namespace SimpleWinLib;
        class MyModal : public ModalDialog
        {
        public:
          MyModal()
          {
            AddHandler(this, WM_COMMAND, &MyModal::OnCommad);
            AddHandler(this, WM_DESTROY, &MyModal::OnDestroy);
          }
          LRESULT OnCommad(WPARAM wParam, LPARAM)
          {
            if (LOWORD(wParam) == IDC_BUTTONTEST)
              ::MessageBox(GetHWND(), TEXT("Yo!"), TEXT(""), MB_ICONINFORMATION);
            return TRUE;
          }
          LRESULT OnDestroy(WPARAM, LPARAM)
          {
            MessageBox("OnDestroy");
            return TRUE;
          }
          BOOL OnOk()
          {
            MessageBox("OnOk");
            return ModalDialog::OnOk();
          }
          BOOL OnCancel()
          {
            MessageBox("OnCancel");
            return ModalDialog::OnCancel();
          }
        };
      }
       
      int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
      {
        App::Init(hInstance, lpCmdLine);
        MyModal().Create(NULL, IDD_MAINDIALOG);
        return App::GetInst()->Run();
      }



    P.S. Оригинал обсуждения темы лежит здесь
    Сообщение отредактировано: BlackEmperor -

    Прикреплённый файлПрикреплённый файлDlg.zip (58.54 Кбайт, скачиваний: 1085)
      Моя версия библиотеки обёрток менее наворочена, чем у BlackEmperor, но тоже работает :D
      Пока реализовано:
      1. CULWnd - родитель для всех последующих классов окон
      2. CULDlg - класс диалога
      3. CULFrameWnd - класс главного окна
      (примеры использования и сама библиотека в атаче)
      ЗЫ: Продолжение следует...
      Сообщение отредактировано: ElcnU -

      Прикреплённый файлПрикреплённый файлfrmULLib.zip (113.04 Кбайт, скачиваний: 711)
      "Бубен Team Edition for Developers"
      ULLib | ULj2me
        Цитата ElcnU @
        Пока реализовано:
        1. CULWnd - родитель для всех последующих классов окон
        2. CULDlg - класс диалога
        ЗЫ: Продолжение следует...

        Ну вот развитие началось :)
        Скоро выложу свое продолжение с обертками для некоторых контролов ...
          Вот как и обещал появилось некое развитие либы, новую версию выкладываю в аттаче с примером и испоьняемым файлом.
          Немного изменил событийную модель...
          В общем если будут заинтересованные продолжу тему ...
          Пример маленького приложения на диалогах с обработкой событий в предке и потомке:
          ExpandedWrap disabled
            #include "resource.h"
            #include "Dialogs.h"
             
            namespace
            {
              using namespace SimpleWinLib;
              class MyModalBase : public MessageFilter<ModalDialog>
              {
              public:
                MyModalBase()
                {
                  AddHandler(this, WM_INITDIALOG, &MyModalBase::OnInitDialog);
                  AddHandler(new HandlerOnPaint<MyModalBase>(this, &MyModalBase::OnDraw));
                }
                LRESULT OnInitDialog(WPARAM, LPARAM)
                {
                  return TRUE;
                }
                BOOL OnDraw(CDC* dc)
                {
                  dc->TextOut(5, 5, "Hi");
                  return FALSE;
                }
              };
             
              class MyModal : public MessageFilter<MyModalBase>
              {
              public:
                MyModal()
                {
                  AddHandler(this, WM_INITDIALOG, &MyModal::OnInitDialog);
                  HandlerOnCommand<MyModal>* Commands = new HandlerOnCommand<MyModal>(this);
                  AddHandler(Commands);
                  Commands->AddHandler(IDC_BUTTON_1, &MyModal::OnBtn1);
                  Commands->AddHandler(IDC_BUTTON_2, &MyModal::OnBtn2);
                }
                LRESULT OnInitDialog(WPARAM, LPARAM)
                {
                  return FALSE;
                }
                BOOL OnBtn1()
                {
                  MessageBox("1");
                  return TRUE;
                }
                BOOL OnBtn2()
                {
                  MessageBox("2");
                  return TRUE;
                }
              };
            }
             
            int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
            {
              App::Init(hInstance, lpCmdLine);
              MyModal().Create(NULL, IDD_MAINDIALOG);
              return App::GetInst()->Run();
            }


          На мой взгляд достаточно просто в использованиии
          Прикреплённый файлПрикреплённый файлDlg.zip (41.36 Кбайт, скачиваний: 494)
            Продолжаю писать обёртки :wall:
            1. CULWnd - родитель для всех последующих классов окон (переделал по примеру ЫукпШ)
            2. CULDlg - класс диалога
            3. CULFrameWnd - класс главного окна
            4. CULApp - класс приложения.
            5. CULToolBar - класс тулбара
            (примеры использования и сама библиотека в атаче)
            ЗЫ: Продолжение следует...
            Сообщение отредактировано: ElcnU -

            Прикреплённый файлПрикреплённый файлULLib.ZIP (64.83 Кбайт, скачиваний: 659)
            "Бубен Team Edition for Developers"
            ULLib | ULj2me
              Народ, ну есть же WTL, мощь шаблонов которого несомненна. Ничего личного.
              Кибальчиш
                Цитата XPiS, 13.11.2006, 3:19:06, 1339636
                Народ, ну есть же WTL, мощь шаблонов которого несомненна.

                Импровезируем :yes:
                "Бубен Team Edition for Developers"
                ULLib | ULj2me
                  Цитата XPiS @
                  Народ, ну есть же WTL, мощь шаблонов которого несомненна. Ничего личного.

                  Дык, никто с этим не спорит, полностью согласен, да, есть :)
                  А как на счет полета мысли от безделия в сторону изобретения очередного велосипеда? :) Так как реальная работа ооочень редко приносит интурес, она рутинна по большей своей части. А тут ;)

                  P.S. Ничего личного, но уж сколько релизов всяких алгоритмов сортировки и поиска написано, переписано, а ведь народ пишет ;) очередной велосипед. Написал, понравилось поделился :lol: Ничего личного, просто навеяло :D ;)
                  Сообщение отредактировано: BlackEmperor -
                    Цитата XPiS @
                    Народ, ну есть же WTL, мощь шаблонов которого несомненна. Ничего личного.

                    Честно говоря, от "мощи" шаблонов ATL/WTL я не в восторге.
                    "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                    Морган Фриман
                    Реализация шаблонов Jinja2 для C++ Jinja2 C++
                      Цитата BlackEmperor @
                      А как на счет полета мысли от безделия в сторону изобретения очередного велосипеда? :) Так как реальная работа ооочень редко приносит интурес, она рутинна по большей своей части. А тут ;)

                      нет ну за это только ++ ;)
                      Цитата Flex Ferrum @
                      Честно говоря, от "мощи" шаблонов ATL/WTL я не в восторге.

                      хм.... в принципе я из не юзаю, т.к. довольно СЛОЖНО разбираться. Но очень мощно. А что именно не доставляет восторг? :ph34r:
                      Кибальчиш
                        2 XPiS - приобщайся ;)
                        Ударим велосипедами по безделию и неинтересности :lool: а там и для себя найдется польза, как-никак а и что-то новое для себя открываешь при написании подобного, а это уже плюс в проф. навыках есть ...
                          Вот делюсь последней версией...
                          Изменения: после некоторого обсуждения в аське и епочте на тему упорщения добавления обработчикав событий типа таких как WM_COMMAND, которые потом еще нужно и разбирать от какой кнопки что пришло и т.д., так же обсуждение было на тему скрытия WinMain от конечного пользователя.
                          Вот пример исользования:
                          ExpandedWrap disabled
                            namespace
                            {
                              using namespace SimpleWinLib;
                             
                              class MyModal : public MessageFilter<ModalDialog>
                              {
                              public:
                                MyModal()
                                {
                                  AddHandler(this, WM_INITDIALOG, &MyModal::OnInitDialog);
                                  AddHandler(CreateHandlerOnPaint(this, &MyModal::OnDraw));
                                  HandlerOnCommand<MyModal>* Commands = CreateHandlerOnCommand(this);
                                  AddHandler(Commands);
                                  Commands->AddHandler(IDC_BUTTON_1, &MyModal::OnBtn1);
                                  Commands->AddHandler(IDC_BUTTON_2, &MyModal::OnBtn2);
                                }
                                BOOL OnBtn1()
                                {
                                  MessageBox("1");
                                  return TRUE;
                                }
                                BOOL OnBtn2()
                                {
                                  MessageBox("2");
                                  return TRUE;
                                }
                                LRESULT OnInitDialog(WPARAM, LPARAM)
                                {
                                  MessageBox("OnInitDialog");
                                  return TRUE;
                                }
                                BOOL OnDraw(CDC* dc)
                                {
                                  dc->TextOut(5, 5, "Hi");
                                  return FALSE;
                                }
                              };
                             
                              class MyApp : public App::UserTheApp
                              {
                                void OnInit()
                                {
                                  MyModal().Create(NULL, IDD_MAINDIALOG);
                                }
                                static MyApp TheApp;
                              };
                              MyApp MyApp::TheApp;
                            }


                          Пример для диалогового окна, но все в силе от старого, т.е. моно и с немодальными окнами работать и с "простыми окнами" (пример приводился выше).

                          Так теперь скрыта WinMain и пользователю теперь, чтоб что-то сделать на ините ему просто нужно отнаследоваться от App::UserTheApp как это и сделано в примере в классе MyApp, переопределить метод OnInit и в нем что-то делать, ну ессно создатьокно :D . Объект класса MyApp должен быть один, ну а в примере создан синглтон, который это и делает, а так как все методы его приватные, то просто создать его экземпляр нельзя.

                          Немного описания:

                          AddHandler(this, WM_INITDIALOG, &MyModal::OnInitDialog); - добавление обработчика на некоторое событие (в данном случае на WM_INITDIALOG)

                          AddHandler(CreateHandlerOnPaint(this, &MyModal::OnDraw)); - CreateHandlerOnPaint упрощает обработку событий WM_PAINT

                          HandlerOnCommand<MyModal>* Commands = CreateHandlerOnCommand(this); - создание обработчика на WM_COMMAND, который и будет разбираться с какой кнопки пришел евент
                          AddHandler(Commands); - добавляем этот обработчик к объекту

                          Commands->AddHandler(IDC_BUTTON_1, &MyModal::OnBtn1); - просто добавляем обработчик на кнопку, а не на эвент WM_COMMAND с дальнейшим его разбором, разбор сделает специализированный обработчик!


                          Очередная версия в аттаче. Все собрано под MS VC++ 7.1 основной пользовательский код в файле main.cpp
                          Сообщение отредактировано: BlackEmperor -

                          Прикреплённый файлПрикреплённый файлDlg.zip (53.56 Кбайт, скачиваний: 521)
                            Настоятельно рекомендую обработчики перевести на использование boost::function/boost::signal. Открывает достаточно широкие возможности. Например:
                            ExpandedWrap disabled
                              MyModal()
                                  {
                                    // ...
                                    // ...
                                    Commands->AddHandler(IDC_BUTTON_1, boost::bind(&MyModal::OnBtn, this, "1"));
                                    Commands->AddHandler(IDC_BUTTON_2, boost::bind(&MyModal::OnBtn, this, "2"));
                                  }
                                  void OnBtn(const char* msg)
                                  {
                                    MessageBox(msg);
                                  }
                            "Математики думают, что Бог в уравнениях, нейрологи уверены, что Бог в мозге, а программисты уверены, что Бог — один из них."
                            Морган Фриман
                            Реализация шаблонов Jinja2 для C++ Jinja2 C++
                              Цитата Flex Ferrum, 16.11.2006, 21:42:31, 1345720
                              void OnBtn(const char* msg)

                              то есть один обработчик для всех кнопок?
                              Толчком написания классов было избавление от функции WndProc или DlgProc, где вся обработка проходила в одной функции. А ты предлагаешь опять к этому вернуться (только не в статическом варианте)?
                              "Бубен Team Edition for Developers"
                              ULLib | ULj2me
                                Цитата Flex Ferrum @
                                Настоятельно рекомендую обработчики перевести на использование boost::function/boost::signal. Открывает достаточно широкие возможности.

                                При обсуждении темы еще в разделе "Visual C++" и еже с ним, первый вараинд был с использованием stl и сразу посыпались не белосновательные "крики" на тему, что это и еще и ее тащить надо, так что отказался от нее (о чем не жалею :) ), а тут еще boost притянуть... Неее, в данной разработке, ни boost'а, ни stl'а, ни Loki не будет, только WinAPI. Есть мысль еще кое чего написать/поделиться, вот там будет как минимум stl, а может и еще чего что активно советуют повсюду.

                                Цитата

                                ExpandedWrap disabled
                                  void OnBtn(const char* msg)
                                  {
                                    MessageBox(msg);
                                  }



                                Это один обработчик на несколько событий с дальнейшим разбором, что от кого пришло и что делать дальше, как раз от этого я и пытался уйти - "Одно событие - один обработчик" (в данном случае одна команда - один обработчик), а то так и до сишного свича можно дойти ;)
                                О предложенной идее я писал выше:
                                Цитата

                                Изменения: после некоторого обсуждения в аське и епочте на тему упорщения добавления обработчикав событий типа таких как WM_COMMAND, которые потом еще нужно и разбирать от какой кнопки что пришло и т.д.
                                Сообщение отредактировано: BlackEmperor -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (13) [1] 2 3 ...  12 13 все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1416 ]   [ 15 queries used ]   [ Generated: 19.09.20, 03:39 GMT ]