Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП и WinAPI, ??? 
:(
    Опции темы
igmyrj
Дата 20.2.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 7.11.2005

Репутация: нет
Всего: нет



Всю свою жизнь я писал 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; //Если не статическая, то не компилится тут
  }
};


Это сообщение отредактировал(а) igmyrj - 20.2.2008, 00:04
PM MAIL   Вверх
jonie
Дата 20.2.2008, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



см. как например я делал когда-то... 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);
....
}




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
EnergoHokum
Дата 20.2.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Вот в этой теме мне рассказывали, как-же затолкать обработчик сообщений в класс. Если есть желание, могу код скинуть, только он не сильно комментирован.
PM MAIL ICQ   Вверх
igmyrj
Дата 20.2.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 7.11.2005

Репутация: нет
Всего: нет



А! Спасибо! Блин, как же я сам не допер до этого... все было так просто! Спасибо, большое.
PM MAIL   Вверх
Alca
Дата 24.1.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



EnergoHokum, засвети код.  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Dem_max
Дата 24.1.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Вот господа не мучайтесь пользуйтесь готовым кодом 
тема тут - http://forum.sources.ru/index.php?showtopic=159560&st=0
В этой тебе смотрим готовую библиотеку от ElcnU.
последняя библиотека тут - БИБЛИОТЕКА

Цитата

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    класс оконного разделителя


Это сообщение отредактировал(а) Dem_max - 24.1.2009, 13:35


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1195 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.