Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 14:14   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Проблема с проебразованием

Доброго времени суток Уважаемые специалисты. Последнее время стал упорно придерживаться ООП, но теперь возникла ситуация где мне необходимо преобразовать системную процедурку а за пределы класса я не хочу ее вытаскивать.
Выделил место красным цветом где идет преобразование, подскажите пожалуйста как бэ сделать!?

Код:
namespace System
{
 class CMy3D
 {
 public:
  static HINSTANCE hInstance;	

  CMy3D::CMy3D();
  CMy3D::~CMy3D();
  CMy3D::CMy3D(HINSTANCE hInstance);

  void Init();	 
  void Hook();
  void UnHook();

 private:
  bool InitCamera;
  bool MoveCamera;
  int MouseX, MouseY;
  float *Camera_Zoom, *Camera_RotY, *Camera_RotZ, *Camera_PosZ, *Camera_ClipX, *Camera_ClipY, *Camera_GlClip;
  BOOL MouseSetHook(BOOL set_or_remove);	
  BOOL KeyboardSetHook(BOOL set_or_remove);
  LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
  LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
 };
}
extern System::CMy3D My3D;
Код:
BOOL System::CMy3D::MouseSetHook(BOOL set_or_remove)
{
 if (set_or_remove == TRUE)
 {
  if (MouseHook == NULL)
  {
  MouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, this->hInstance, GetCurrentThreadId()); // Invalid type cnversion
  if (!MouseHook)
   return FALSE; 
  }
 } 
 else { 
  return UnhookWindowsHookEx(MouseHook); MouseHook = NULL; 
 }
 return TRUE;
};
Код:
LRESULT CALLBACK System::CMy3D::MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if (((lParam >> 31) & 1) && (nCode == HC_ACTION)) 
 {
  // ...
 }
 return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
}
Вот что сказал мне компилятор:
Цитата:
My3D.cpp(55): error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'HOOKPROC'
1> None of the functions with this name in scope match the target type

Последний раз редактировалось coNsept; 24.06.2011 в 14:27.
coNsept вне форума Ответить с цитированием
Старый 24.06.2011, 14:20   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

чота я не догнал, что надо сделать. в первом коде - установка хука на mouseProc, во втором - уже KeyboardProc. но чую, что автору нужны статичные функции в классе
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.06.2011, 14:24   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Упс, извини все напутал. (Сейчас оформил корректно)
coNsept вне форума Ответить с цитированием
Старый 24.06.2011, 14:30   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
логично, SetWindowsHookEx хочет указатель на функцию, а ты пытаешься привести указатель на функцию-член к указателю на функцию (CMy3D видимо класс?). ну как я уже и сказал - static функция в классе

хех, ну или сделать промежуточную статик функцию, которая перенаправит вызов функции-члену
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 24.06.2011 в 14:33.
pproger вне форума Ответить с цитированием
Старый 24.06.2011, 15:38   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

незя сделать статик, я уже как только не пробовал. По крайней мере у меня не получилось.
pproger ты тут у нас умненький, покажи на примечике пожалуйста.
coNsept вне форума Ответить с цитированием
Старый 24.06.2011, 16:06   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

что значит нельзя, когда можно. на, на коленке накидал
Код:
#include <windows.h>
#include "stdafx.h"

class A {
public:
	A(HINSTANCE instance) : hInst(instance)
	{}

	bool setHook()
	{ return SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInst, 0); }

private:
	static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
	{ return CallNextHookEx(0, nCode, wParam, lParam); }

	HINSTANCE hInst;
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	MSG msg;

	A a(hInstance);

	if (!a.setHook())
		exit(1);

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.06.2011, 16:12   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Мне интересно одно. Вот смотрел примерчик один.
Click Чувак ниже приводит якобы рабочий код, где в классе, именно там объявлена статическая системная процедура.
Только вот меня 2010 студия отругала следующим: a storage class not be specified here
Вот интересная штукенция, почему так?
да и в твоем примере тоже самое

Код:
class Render
{
    void Func();

    static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
} g_Render;

    static LRESULT CALLBACK Render::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {

        g_Render->Func();

        switch (uMsg)
        {
                //...
        }
    }
coNsept вне форума Ответить с цитированием
Старый 24.06.2011, 16:20   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
ну откуда ж я знаю, где ты там этот класс пытаешься объявить. код рабочий
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.06.2011, 16:23   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Все все все, pproger ты крут и очень умен, спасибо я разобрался
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37