Здравствуйте все! Прошу помощи, потому что сам уже замучался. Я хочу создать приложение Windows с окошками на Си++ и для этого у меня есть VS2005. НО: когда создается проект Win32, то это управляемый Си++ для запуска в CLR. Мне нужно получать и обрабатывать разные сообщения для моего окошка, а я даже не могу найти цикл обработки сообщений. Как мне откопать под слоем фрэймворка цикл? По теме обработки сообщений в NET была найдена статья: www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Misc/326.aspx Но там примеры на C#. В итоге я не знаю как мне разобраться с событиями. Подскажите, что делать.
В WndProc. Там создаётся заготовка проги. А ещё сходил бы на firststeps.ru, там для начинающих дока по WinAPI & K°.
Спасибо, буду читать. Пока ждал ответа, нашел в МСДН, что можно получать сообщения окна, установив некий перехватчик. LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { return 0; }; HHOOK h; HOOKPROC HookProcH; HookProcH = (HOOKPROC)GetProcAddress(GetModuleHandle(NULL), "HookProc"); h = SetWindowsHookEx(WH_GETMESSAGE, HookProcH, NULL, 0); Почему не работает?
не рано ли ты за хуки берешься ?) в HookProc нужно обязательно вызывать CallNextHookEx иначе все сообщения дальше твоей функции не пойдут. да и зачем так извращатся, в своей проге ставить хуки чтобы сообщения обработать, хм ЫЫ ) все решается через WndProc
При компиляции возникает ошибка: 1>d:\studio\proj\proj\Form1.h(147) : error C2664: 'ESNFunction' : cannot convert parameter 2 from 'boolean (__stdcall *)(char *,unsigned long)' to 'ESNCB' хотя функция объявлена как ESNFunction (StreamT_t streamType, ESNCB userCB, unsigned long lParam) и тип ESNCB typedef Boolean ( *ESNCB) (char *serverName, unsigned long lParam); Моя функция: boolean __stdcall AddServer(char* ServName,unsigned long lParam) { static int q=0; ServerID_t* w = (ServerID_t*) lParam; lstrcpy((LPSTR)w,(LPSTR)ServName); q++; if (q>1) {return 0;} else return 1; } Вызов: t = ESNFunction(ST_CSTA, AddServer, (unsigned long)&ServerName); Что я сделал неправильно?
Lightwell На первый взгляд: AddServer у тебя stdcall, а в ESNCB этого не указано и зависит от настроек компилятора.
Хм... В документации сказано, что должно быть stdcall. Но без него работает. У меня еще один глуповатый вопрос. Чтобы запустить приложение как сервис, что нужно сделать?
Почитал описание про окна. Там указатель на функцию WndProc используется при заполнении структуры класса окна. Как я понял, мне надо объявить такую же функцию у себя: public ref class Form1 : System::Windows::Forms::Form { ...//конструктор и др. мелочи //моя функция protected: LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam) { if (Message == WM_DESTROY ) { PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,Message,wparam,lparam); } ...//еще несколько функций } Но оно все равно не хочет работать. Почему?
Конечно, хочу! Только я посмотрел и понял, что если я буду без него, то придется окошки программно создавать. Это слишком утомительно, учитывая сколько другой работы надо сделать. Поэтому рисую дизайнером в Managed C++. Или можно рисовать без фрэймворка? static LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam) так добавить нужно? Добавил, но выполнение на функцию не переходит.
Редактор win32 ресурсов не поможет? Правда, код обработчиков писать руками. Эти ресурсы, понятно, слабее, чем в делфи, но, в принципе, альтернатив не много. Вообще, тебе шашечки или ехать?
Мне и то и другое, то есть Borland C Builder. Но библиотеки от смежной конторы поставляются в уже откомпилированном виде. Причем откомпилированы они в студии, а линковщик от борланды их не принимает. Пишет типа формат неверный. :-(((( Я начинаю понимать, за что майкрософт не любят... Так что посоветуете, господа?
Г*но..., IMHO. И не С++ (Sic!), и интерфейс дрянь (нет возможности фиксировать элементы на форме, все тянется как драный гонд*н), неудобная система автонаименований визуальных объектов, вообще стандарт Qt на наименования объектов просто не дает хорошо писать (разве что тотально переименовывать все и вся), архитектура без восторгов, причем несовместимая ни с чем другим. Скажем, часть системных API вызовов из под Qt просто не работает (тот же таймер под Linux). А часть Qt API - это просто обертка к не лучшим библиотекам третьих фирм (qCompress <-> ZLib). Наконец, Unicode - без выбора - и там , где он нафиг не нужен.