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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура класса диалога в MDI VC6, профессионалам 
:(
    Опции темы
And234
Дата 29.11.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Структура класса диалога в MDI VC6В MDI приложении для объявления и работы с дочерними диалогами
пытаюсь составить класс для каждого вида диалоговых окон.
объявление класса окна представил в виде
Исходник снизу в РАРе

Код

class MyChild  
{
public:
    BOOL ShowWin();
    HWND hwndChild;
    BOOL NewForm(HWND hwnd_, HINSTANCE hInst_);
    MyChild();
    LRESULT CALLBACK WndProcChild (HWND hwnd_, UINT mMsg_, WPARAM wParam_, LPARAM lParam_);
    virtual ~MyChild();

};

MyChild::MyChild()
{}

MyChild::~MyChild()
{}

BOOL MyChild::NewForm(HWND hwnd_, HINSTANCE hInst_)
{
    hwndChild = CreateWindowEx (0L, 
        "CHILD",                                           
        "First Window", 
        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CAPTION ,                                            
        10, 
        40, 
        200, 
        200, 
        hwnd_, 
        (HMENU) 1,                                           
        hInst_, 
        NULL) ;
    
    return TRUE;
    
}

LRESULT CALLBACK MyChild::WndProcChild (HWND hwnd_, UINT mMsg_, WPARAM wParam_, LPARAM lParam_) 
{
    // обработка сообщений от формы

    return TRUE;
}

BOOL MyChild::ShowWin()
{
    ShowWindow(hwndChild, SW_SHOWNORMAL);
    return TRUE;
}

теперь необходимо зарегистрировать в объявлении класса процедуру обработки сообжений
регистрирую как указатель на член класса таким образом
Код

// класс мамки

    wclass.cbSize        = sizeof (wclass) ;
    wclass.lpszClassName = "MAIN" ;
    wclass.hInstance     = hInstance ;
    wclass.lpfnWndProc   = WndProc ;
    wclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    wclass.hIcon         = hiconApp ;
    wclass.lpszMenuName  = NULL;
    wclass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1) ;
    wclass.hIconSm       = hiconApp ;
    
    RegisterClassEx (&wclass) ;
    
// необходимый указатель 

    LRESULT (MyChild::*fgh)(HWND, UINT, WPARAM, LPARAM) const = 0;
    fgh = MyChild::WndProcChild;

// класс дочки

    wclass.lpszClassName = "CHILD" ;
    wclass.lpfnWndProc   = fgh ;
    wclass.hCursor       = LoadCursor (NULL, IDC_IBEAM) ; 
    wclass.hIcon         = NULL ;
    wclass.lpszMenuName  = NULL ;
    wclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
    wclass.hIconSm       = NULL ;
    
    RegisterClassEx (&wclass) ;

компилятор выдает следующее
ссылаясь на строку
Код

fgh = MyChild::WndProcChild;

Compiling...
error C2440: '=' : cannot convert from 'long (__stdcall MyChild::*)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long (__thiscall MyChild::*)(struct HWND__ *,unsigned int,unsigned int,long) const'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
error C2440: '=' : cannot convert from 'long (__thiscall MyChild::*)(struct HWND__ *,unsigned int,unsigned int,long) const' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
There is no context in which this conversion is possible
Error executing cl.exe.

Avely001.exe - 2 error(s), 0 warning(s)



Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Child.rar 6,91 Kb
PM MAIL ICQ   Вверх
Fixin
Дата 29.11.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Во-первых, ты пытаешься получить адрес ф-ции до создания экземпляра класса. Но я с классами не очень дружу.
Во-вторых, если это не задание и не личный интерес, то есть MFC - там умные дядбки все это уже реализовали, правда не очень красиво и довольно увесисто. Если просто учишься и деланшь это сам для себя, то посмотри статьи о внутреннем устройстве MFC (естественно, исходный ее код закрыт, но но мозги-то есть...)
Добавлено @ 14:29
Но, вообще, компилятор говорит о несоответствии типов.
PM MAIL ICQ   Вверх
Neitron
Дата 29.11.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fixin @ 29.11.2005, 14:26)
Во-первых, ты пытаешься получить адрес ф-ции до создания экземпляра класса. Но я с классами не очень дружу.
Во-вторых, если это не задание и не личный интерес, то есть MFC - там умные дядбки все это уже реализовали, правда не очень красиво и довольно увесисто. Если просто учишься и деланшь это сам для себя, то посмотри статьи о внутреннем устройстве MFC (естественно, исходный ее код закрыт, но но мозги-то есть...)
Добавлено @ 14:29
Но, вообще, компилятор говорит о несоответствии типов.

Ф-ция имее свой адрес, еще до создания экземпляра класса.
Дело в другом.

Ф-ция должна быть статической.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Fixin
Дата 29.11.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Если сделать так:
Код
LRESULT (CALLBACK MyClass::*fgh)(HWND, UINT, WPARAM , LPARAM );
    fgh = MyClass::ProcWinChild;

    wclass.lpszClassName = "CHILD" ;
    wclass.lpfnWndProc   = fgh;
    wclass.hCursor       = LoadCursor (NULL, IDC_IBEAM) ; 
То остается доказать, что fgh - это WNDPROC.
Добавлено @ 14:45
Цитата(Neitron @ 29.11.2005, 15:39)
Ф-ция имее свой адрес, еще до создания экземпляра класса.
Да, да, забыл.
Цитата(Neitron @ 29.11.2005, 15:39)
Ф-ция должна быть статической.
Это где?

PM MAIL ICQ   Вверх
Neitron
Дата 29.11.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кому доказать и зачем?
....
WNDPROC определен как
Код

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);


Ф-ция обработчик сообщений обязана быть в классе объявлена как статическая.

Это сообщение отредактировал(а) Neitron - 29.11.2005, 14:53


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Fixin
Дата 29.11.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Вот, компилится, а работает или нет - не знаю.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Look_at.rar 2,10 Kb
PM MAIL ICQ   Вверх
Neitron
Дата 29.11.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Человек же просил через ф-цию член, а не через ф-цию друг.......=)


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
And234
Дата 29.11.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Огромное Спасибо.
То что нужно.
Изучаю САМ в МФС загляну.
В литературе этого не нашел по этому залез с вопросом.

Модератору -> сори впервые на форуме.
Модератору -> после того как выяснил что все только смотрят выложил еще 2 копии темы с разъяснениями.


Почему Окно Workspace отображает как глобальная процедура а не как член класса?
PM MAIL ICQ   Вверх
And234
Дата 30.11.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fixin -> исходник работает, ОК.
но как член объявил так (по совету Neitron).

Выглядит так.

Код

class MyClass  
{
public:
/    static LRESULT CALLBACK Fu1(HWND hwnd_, UINT uint_, WPARAM wparam_, LPARAM lparam_) {return 1};
    MyClass();
    virtual ~MyClass();

};


регистрация процедуры обработчика
Код

wclass.lpfnWndProc   = (WNDPROC) MyClass::Fu1 ;   





PM MAIL ICQ   Вверх
Fixin
Дата 30.11.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Немножко подправил, только что-то фокус не ставится на дочернее, но это уже не ко мне smile. И еще, вроде мелкомягкие решили уйти от технологии мультидоков... скорее зря.

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

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


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

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


 




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


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

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