Другие языки программирования и технологии
начал изучать winApi но тут же возникли проблемы
пишу на С++ MSVS 2010. пытаюсь сделать простое окно. все вроде работает но вот когда пытаюсь закрыть приложение (нажимаю на крестик) процесс в диспетчере задач остается. вот собственно код: #include <windows.h> LRESULT __stdcall WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon ( NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (3); wc.lpszMenuName = NULL; wc.lpszClassName = L"class"; RegisterClass (&wc); HWND hWnd = CreateWindow (L"class",L"Заготовка программы",WS_OVERLAPPEDWINDOW,150,100,500,400,NULL,NULL,hInstance,NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (true) { if (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } } return 0; } HRESULT __stdcall WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,message,wParam,lParam); } return 0; }
Скопировал этот текст себе в vc++ 2008, выдал две ошибки при компиляции в строке wc.hIcоn = LoadIcоn ( NULL, IDI_APPLICATION); . Стёр ее, заново написал, и все ок. Х. з. что за глюк. Ну да ладно.
Попробуй вот в этой строке
if (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) заменить hWnd на NULL, и скомпилируй проект. При закрытии окна процесс будет завершаться правильно. Сам попадал на такую ошибку, и тоже долго мучался с ней)) )
Есть еще одна проблема: при запуске твоей проги процессор загружен до 100 % ( ну или одно ядро до 100 %). В моем случае, на двухъядерном на 50 %. Так вот, тут можно так подправить код:
Вместо вот этого блока :
while (true)
{
if (PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Напиши его так:
while(GetMessage(&msg, NULL, 0,0)
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Тогда процессор не будет хаотично повторять этот цикл, а будет его обрабатывать только при поступлении очередного сообщения, и нагрузка с процессора снимется в разы. У меня после подправления показывает 0 %( ну на самом деле, наверное, несколько десятых процента) .
Попробуй вот в этой строке
if (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) заменить hWnd на NULL, и скомпилируй проект. При закрытии окна процесс будет завершаться правильно. Сам попадал на такую ошибку, и тоже долго мучался с ней)) )
Есть еще одна проблема: при запуске твоей проги процессор загружен до 100 % ( ну или одно ядро до 100 %). В моем случае, на двухъядерном на 50 %. Так вот, тут можно так подправить код:
Вместо вот этого блока :
while (true)
{
if (PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Напиши его так:
while(GetMessage(&msg, NULL, 0,0)
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Тогда процессор не будет хаотично повторять этот цикл, а будет его обрабатывать только при поступлении очередного сообщения, и нагрузка с процессора снимется в разы. У меня после подправления показывает 0 %( ну на самом деле, наверное, несколько десятых процента) .
Незнаю, когда я пишу подобную прогу на PureBasic, все работает как задумано и процесс завершается при закрытии окна.
Может лучше if (msg.message == WM_QUIT) ExitProcess(0);
Иначе выпадает в стандартный обработчик ошибок, хотя все равно закрыться должен был
Собственно ясно - он просто прекращает обрабатывать сообщения выходя из цикла, окно так и будет висеть, так что пиши как указал я
Иначе выпадает в стандартный обработчик ошибок, хотя все равно закрыться должен был
Собственно ясно - он просто прекращает обрабатывать сообщения выходя из цикла, окно так и будет висеть, так что пиши как указал я
Похожие вопросы
- Начал изучать PHP(мой первый язык программирования)
- Начал изучать html,css и понял что не моё,
- Вопрос про программирование: Я начал изучать Паскаль, потом планирую изучать Delphy, а вот что дальше изучать не знаю.
- Возникла проблема, связанная с фотошопом
- начал изучать PHP, и вот задумался сразу начать изучать С++. Знаний программирования нет. Стоит ли учить сразу С++??
- Я начал изучать Visual Basic2010. Что вы можете посоветовать мне? подробнее внутри
- Не рано ли в 11 лет изучать языки программирования? Уже начал изучать С# и не плохо получается
- Из-за каких причин ты начал изучать программирование? Что больше всего заинтересовало тебя в этом процессе?
- Только начал изучать C++ и уже вопрос.
- вчера ночью начал делать свой сайт, начал полностью с нуля в итоге возникло очень много вопросов: как создать форум, как