Форум: "WinAPI";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизСоздание окна с помощью CreateWindowEx в Си Найти похожие ветки
← →
niko © (2006-12-15 13:20) [0]В чём дело? Пишу код в dll. При её загрузки генерирую поток и в нём создаю окно, предварительно зарегесрировав класс данного окна. Почему то окно не создаётся, CreateWindowEx возвращает NULL (код ошибки = 6).
MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
0 , 0, 300, 100,
0 , 0, hModule, NULL);
← →
Сергей М. © (2006-12-15 13:29) [1]Похоже на то, что параметр hModule содержит некорректное значение, а именно не явзяется действительным хэндлом модуля, действительно существующего в АП тек.процесса.
← →
niko © (2006-12-15 13:37) [2]Проверял имя файла на который указывает hModule - всё правельно!
← →
clickmaker © (2006-12-15 13:42) [3]MSDN, CreateWindowEx
hInstance
[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
← →
Сергей М. © (2006-12-15 13:51) [4]
> clickmaker © (15.12.06 13:42) [3]
А мож у него для тек.приложения выставлен режим совместимости с Маздаем ?
Просто иных предположений в этих условиях пока нет. Род.окно, согласно справке, можно не указывать (оно опционально), если в стиле указан WS_POPUP.
← →
BiN © (2006-12-15 13:58) [5]Попробуй типа
MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
0 , 0, 300, 100,
GetForegroundWindow , 0, hModule, NULL);
← →
BiN © (2006-12-15 14:03) [6]Пардон, не учел замечание Сергея М про popup-окна. Но все равно попробуй -)
← →
niko © (2006-12-15 14:10) [7]Всем спасибо!
Я вроде как класс не правельно создал (прописал стандартный - заработало). Хотя в Delphi мой класс работает нормально.
← →
clickmaker © (2006-12-15 14:18) [8]
> [7] niko © (15.12.06 14:10)
а что за класс и как создал? И что за стандартный?
← →
niko © (2006-12-15 14:32) [9]Класс создавал так:
WNDCLASSEX window;
. . . . . .
window.cbSize = sizeof (window);
window.style = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc = WindowProc;
window.cbClsExtra = 0;
window.cbWndExtra = 0;
window.hInstance = hModule; // теперь согласен и на NULL
window.hIcon = LoadIcon (0,IDI_APPLICATION);
window.hCursor = LoadCursor (0,IDC_ARROW);
window.hbrBackground = CreateSolidBrush(RGB(182, 219, 255));
window.lpszMenuName = NULL;
window.lpszClassName = "ClassName";
RegisterClassEx(&window);
Заработало когда при создании формы указал название класса не "ClassName", а "ComboBox".
← →
clickmaker © (2006-12-15 15:07) [10]
> [9] niko © (15.12.06 14:32)
если уж RegisterClassEx, тогда надо и hIconSm указывать. Иначе можно и без Ex обойтись
← →
niko © (2006-12-15 15:29) [11]
> [10] clickmaker © (15.12.06 15:07)
А можно по подробней как правельно создовать свой класс и регестировать его? (на примере)
Может я где какую мелочь упустил.
Мой класс не регестрируется. GetLastError = "The system cannot find the file specified."
← →
clickmaker © (2006-12-15 15:46) [12]
> GetLastError = "The system cannot find the file specified."
а это тут причем? где у тебя обращение к файлам?
← →
niko © (2006-12-15 16:05) [13]
> [12] clickmaker © (15.12.06 15:46)
Вот весь код функции:
void CreateMyForm()
{
window.cbSize = sizeof (window);
window.style = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc = WindowProc;
window.cbClsExtra = 0;
window.cbWndExtra = 0;
window.hInstance = (HINSTANCE)Dll_hModule;
window.hIcon = LoadIcon (0,IDI_APPLICATION);
window.hIconSm = NULL;
window.hCursor = LoadCursor (0,IDC_ARROW);
window.hbrBackground = CreateSolidBrush(RGB(182, 219, 255));
window.lpszMenuName = NULL;
window.lpszClassName = "ClassName";
RegisterClassEx(&window);
_err= GetLastError(); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, _err, 0, Buffer_err,sizeof(Buffer_err), NULL);
OutInfo(Buffer_err, _err);
MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
0 , 0, 300, 100,
NULL , NULL, (HINSTANCE)Dll_hModule, NULL);
ShowWindow(MyWnd, SW_SHOW);
while (GetMessage(&Mmsg, NULL, NULL, NULL))
{
TranslateMessage(&Mmsg);
DispatchMessage(&Mmsg);
}
}
GetLastError = 2 ("The system cannot find the file specified.")
← →
clickmaker © (2006-12-15 16:16) [14]
> [13] niko © (15.12.06 16:05)
если RegisterClassEx сработала успешно, то в GetLastError может быть значение, оставшееся там от какой-то предыдущей ошибки
if ( RegisterClassEx() == 0 )
{
_err =
..
}
WindowProc как объявлена?
← →
niko © (2006-12-15 16:22) [15]
LRESULT
WINAPI WindowProc (HWND wnd,
unsigned int msg,
WPARAM wparam,
LPARAM lparam)
{
return 0;
}
← →
clickmaker © (2006-12-15 16:30) [16]
> [15] niko © (15.12.06 16:22)
LRESULT
WINAPI WindowProc (HWND wnd,
unsigned int msg,
WPARAM wparam,
LPARAM lparam)
{
switch (msg)
{
case WM_CREATE:
return 0;
}
return DefWindowProc(wnd, msg, wparam, lparam);
}
← →
niko © (2006-12-15 16:35) [17]
> [16] clickmaker © (15.12.06 16:30)
Чувак, ты крут!!!
Спасибо - наконец то заработало.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c