teapot Posted July 31, 2005 Report Share Posted July 31, 2005 Здравствуйте! У меня возникла небольшая проблема. Не поможете ли? Дело вот в чём... Элементарнейшая операция - создание окна функцией CreateWindow (C++). И во всей моей огромной проге компилер находит только 1 (!) ошибку - в параметрах этой функции. Итак, что у меня: hWnd = CreateWindow(szProgName, "smth", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL,(HMENU)NULL, (HANDLE)hInstance,(LPVOID)NULL); Что "должно быть" (всплывающая подсказка) : HWND CreateWindow (LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam) Как видим, "должно" быть 10 параметров, но у меня их 11, и это правильно, потому что при попытке убрать любой из параметров выдаётся ошибка о недостаточном их числе. Что говорит компилер по моему варианту: error C2664: 'CreateWindowExA' : cannot convert parameter 11 from 'void *' to 'struct HINSTANCE__ *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast Очевидно, что находя после 6 "правильных" параметров "неправильный, лишний", компилер сбивается со счета и несёт ерунду. Убираем 7-ой параметр и пишем NULL в конце списка параметров: error C2664: 'CreateWindowExA' : cannot convert parameter 8 from 'struct HWND__ *' to 'int' This conversion requires a reinterpret_cast, a C-style cast or function-style cast Вот такая ерунда. Помогите! В лучшем случае - зашлите рабочий вариант, пожалуйста. ir042kav@study.tcde.ru Спасибо! Quote Link to comment Share on other sites More sharing options...
mmap Posted July 31, 2005 Report Share Posted July 31, 2005 Используй MSDN: HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); Правильно будет: hWnd = CreateWindow(szProgName, "smth",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); И вообще не надо бездумно "подгонять" переменные к тому типу, что нужны функции... И следует ЧИТАТЬ сообщения о ошибках: Компилятор ругается на то, что HINSTANCE это не void* (чем HANDLE по сути и является...) Если у тебя переменная hInstance имеет правильный тип, то её НАДО передавать без преобразования. А NULL вообще почти никогда принудительно ни к чему не преобразовывают... P.S.: [b]hInstance[/b][in] Windows 95/98/Me: Handle to the instance of the module to be associated with the window. Windows NT/2000/XP: This value is ignored. Quote Link to comment Share on other sites More sharing options...
Andrew.Egorovsky Posted August 1, 2005 Report Share Posted August 1, 2005 teapot: 1. Есть CreateWindow, а есть CreateWindowEx - разные ф-ции, делающее одно и то же, у CreateWindowEx больше параметров. Иатк: HWND CreateWindow( LPCTSTR lpClassName, // registered class name LPCTSTR lpWindowName, // window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // window-creation data ); ClassName - никакого отношения к имени программы изначально не имеет. Это то же самое имя, которое задаешь при вызове RegsiterClass - регистрации класса окон. Можно использовать и "стандарнтые", например BUTTON, EDIT и т.п. WindowName - понятно что ;) dwStyle - битовая маска стилей окна (констант WS_*)- как оно будет выглядеть, будет ли иметь заголовок, сис. меню и т.д. Это смотри в MSDN. x,y,*Width - координаты верхнего левого угла и размеры окна. hWndparent - "родительское" окно hMenu- понятно. HINSTANCE - да, инстанс твоей проги. Вот только зачем приводить его к HANDLE??? Как правило, в WinMain/DllMain первый параметр и так имеет тип HINSTANCE.... его можно сохранить, а потом использовать... Можно, конечно, и "кривым" путем идти... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.