Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > ООП и WinAPI


Автор: igmyrj 20.2.2008, 00:02
Всю свою жизнь я писал WinAPI приложения используя обычный процедурный подход. Но тут встала задача разработать все это с точки зрения ООП. Сразу у меня возникла проблема - в методы класса автоматом передается this, и если я объявляю функцию разбора сообщений в классе, ничего не компилируется. Да, эту функцию можно сделать static, но внутри нее идет работа с полями класса и вызов методов класса. Выходит, что мне придется делать все содержимое этого класса статическим? Я так не хочу! Помогите пожалуйста разобраться...
Ах, да, код:
Код

class WinAPI
{
private:
  int x, y;
  
  int SomeMethod( int a, int b )
  {
    // Че-то делаем
  }
public:
  static LRESULT CALLBACK WinFunc( HWND hWnd, UINT Msg,
                                                  WPARAM wParam, LPARAM lParam )
  {
    switch (Msg)
    {
    case WM_CREATE:
      SomeMethod(0, 0);  // Если эта функция статическая, не компилится тут
      return 0;
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    }

    return DefWindowProc(hWnd, Msg, wParam, lParam);
  }

  void CreateWindow( ....... )
  { 
     wc.lpfnWndProc = WinFunc; //Если не статическая, то не компилится тут
  }
};

Автор: jonie 20.2.2008, 01:18
см. как например я делал когда-то... http://e-jonie.narod.ru/tmp/screenshooter.7z  (правда недописано, мож допишет хто?)))

там в общем есть class CWinWrap (это типа враппер над окном) , в нем и запихан цикл обратки сообщений
а сохранение и загрузка указателя на класс, которому "принадлежит" обработчик так :
Код

// гдето в меотде класса создаем окошко
    _hwnd = CreateWindowEx(_dwExtendedStyle, _pszClassName,
        _pszTitle, _dwStyle, x, y, nWidth, nHeight,
        hParent, hMenu, hInstance, (void*)this);

//а это та статическая обработка сообщений
LRESULT CALLBACK CWinWrap::BaseWndProc(HWND hwnd, UINT msg,
                                      WPARAM wParam, LPARAM lParam)
{
    //A pointer to the object is passed in the CREATESTRUCT
    if(msg == WM_NCCREATE)
        SetWindowLongPtr(hwnd, GWLP_USERDATA,
        (LONG_PTR)((LPCREATESTRUCT)lParam)->lpCreateParams);

    BOOL bProcessed = FALSE;
    LRESULT lResult;

    //Retrieve the pointer
    CWinWrap *pObj = (CWinWrap *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
....
}


Автор: EnergoHokum 20.2.2008, 11:07
http://forum.vingrad.ru/topic-186362.html мне рассказывали, как-же затолкать обработчик сообщений в класс. Если есть желание, могу код скинуть, только он не сильно комментирован.

Автор: igmyrj 20.2.2008, 22:43
А! Спасибо! Блин, как же я сам не допер до этого... все было так просто! Спасибо, большое.

Автор: Alca 24.1.2009, 12:49
EnergoHokum, засвети код.  smile 

Автор: Dem_max 24.1.2009, 13:30
Вот господа не мучайтесь пользуйтесь готовым кодом 
тема тут - http://forum.sources.ru/index.php?showtopic=159560&st=0
В этой тебе смотрим готовую библиотеку от ElcnU.
последняя библиотека тут - http://ullib.googlecode.com/files/ULLib.2.3.3.zip

Цитата

CULApp Класс приложения(01.05.2007) 
template <class CULWndClass> class CULMessageMap - класс обработки добавления и обработки сообщений (с реализацией аналога ON_REFLECT_...)
CULSubClass Класс для сабклассирования контролов(12.10.2007) 
CULWnd Класс root для всех окон(24.10.2007) 
ULBars::CULRebar Класс ребара(11.08.2007) 
ULBars::CULStatusBar Класс статусбара(12.10.2007) 
ULBars::CULToolBar Класс тулбара(12.10.2007) 
ULControls::CULEdit Класс обёртка лдя EDIT контрола(16.07.2007) 
ULControls::CULHotKey Класс обёртка лдя EDIT контрола(16.07.2007) 
ULControls::CULListBox Класс обёртка лдя LISTBOX контрола(08.09.2007) 
ULControls::CULMenu Класс обёртка лдя меню(24.10.2007) 
ULControls::CULToolTip Класс контрола подсказок(06.09.2007) 
ULControls::ULButtons::CULBitmapButton Класс bitmap кнопки(15.10.2007) (не использовать для чекбокса и радиобатона) 
ULControls::ULButtons::CULButton Класс кнопки(08.09.2007) 
ULControls::ULButtons::CULCustomButton Класс родитель для CULStyleButton и CULBitmapButton (не использовать для чекбокса и радиобатона)(15.10.2007) 
ULControls::ULButtons::CULHyperLink Класс гиперссыка(17.07.2007) 
ULControls::ULButtons::CULStyleButton Класс стильной кнопки(15.10.2007) (не использовать для чекбокса и радиобатона) 
ULDB::CULODBC Класс ODBC базы данных(20.08.2007) 
ULDlgs::CULDlg Класс диалогого окна(2006) 
ULDlgs::CULPropPage Класс страницы для окна свойств(2006) 
ULDlgs::CULPropSheet Класс окна свойств(2006) 
ULDlgs::CULSkinDlg Класс скин-диалогого окна(17.10.2007) 
ULFrames::CULFrameWnd Класс главного окна(фрейма)(2006) 
ULFrames::CULMDIChildWnd Класс дочернего окна архетектуры MDI(03.08.2007) 
ULFrames::CULMDIClientWnd Класс клиентского окна архетектуры MDI(26.07.2007) 
ULFrames::CULMDIFrameWnd Класс главного окна архетектуры MDI(2006) 
ULGraphs::ULDC::CULClientDC Класс контекста клиентской области окна(10.09.2007) 
ULGraphs::ULDC::CULDC Класс контекста 
ULGraphs::ULDC::CULPaintDC Класс контекста клиентской области окна(10.09.2007) применяется только в обработчиках WM_PAINT 
ULGraphs::ULDC::CULWindowDC Класс контекста окна(10.09.2007) 
ULGraphs::ULGObjs::CULBitmap Класс битового изображения(15.10.2007) 
ULGraphs::ULGObjs::CULBrush Класс кисти(15.10.2007) 
ULGraphs::ULGObjs::CULFont Класс шрифта(15.10.2007) 
ULGraphs::ULGObjs::CULPalette Класс палитры(15.10.2007) 
ULGraphs::ULGObjs::CULPen Класс пера(15.10.2007) 
ULGraphs::ULGObjs::CULRgn Класс региона(15.10.2007) 
ULOther::CULProfileReg Класс профиля приложения в реестре(17.08.2007)
ULOther::CULPtr< Type > Класс "умного" указателя (30.07.2007) хотя до умного ещё далеко 
ULOther::CULStrT< Type > Класс строки(13.10.2007) 
ULStates::CULLogFile Класс для ведения отладочного лога: утечки памяти и времени выполнения кода(2006) 
ULStates::CULMemState Класс для отслеживания утечки памяти(2006) 
ULStates::CULTimeState Класс для определения времени выполнения кода с учетом вытесняющей многозадачности, т.е. только выделенные кванты времени (2006) 
ULStates::CULWatchState Класс для определения времени выполнения кода без учета вытесняющей многозадачности (2006) 
ULThreads::CULCriticalSection Класс критической секции(27.08.2007) 
ULThreads::CULEvent Класс события(11.10.2007) 
ULThreads::CULMutex Класс мютекса(11.10.2007) 
ULThreads::CULQueueThread Класс потока с очередью(27.08.2007) 
ULThreads::CULThread Класс потока(27.08.2007) 
ULWndCtrls::CULStatusBarCtrl Класс статусбара размещенного на плавающей панельке(12.10.2007) 
ULWndCtrls::CULToolBarCtrl Класс тулбара размещенного на плавающей панельке(12.10.2007) 
ULWndCtrls::CULWndCtrl Класс окна типа тулвиндоу, которое может прилепляться к краям клиентской области окна родителя(21.07.2007) 
ULWndCtrls::CULWndCtrlList Класс - контейнер для плавающих панелек(03.08.2007)


и еще

Цитата

ULCOMs  Пространство имён классов COM(некоторая попытка реализовать своё, точнее обернуть существующие общие понятия)
CULDllApp  класс динамической библиотеки
ULCommDlgs    Пространство имён классов обёрток для некоторых стандартных диалогов
ULListCtrlEx  пространство имен расширенного лист контрола 
CULSplitter    класс оконного разделителя

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)