Как научиться писать на чистом Win API?
посмотри книгу Щупак Ю.А. "Win32 API. Эффективная разработка приложений." Там вроде все доходчиво написано. Ну и MSDN конечно.
посмотри книгу Щупак Ю.А. "Win32 API. Эффективная разработка приложений." Там вроде все доходчиво написано. Ну и MSDN конечно.За книжку спасибо. Вот вопрос только возник.
Написал я программу, которая график выводит. Новот проблема - ведет она себя странно. При создании - все получается отлично, окошко создается, график на нем рисуется, все вроде нормально. При попытке переместить окно, или решайпить его оно взаимностью не отвечает(то есть не отвечает вообще никак). Просто замирает на месте и существует в текущем состоянии. На кнопки максимайз и минимайз не реагирует, а убить его можно лишь из Диспетчера задач. При попытке убить через кнопку "закрыть" окошко сжирает 100% процессорного времени(на что?) и приходится килять процесс через вышеупомянутый Диспетчер задач. Из событий только WM_PAINT обрабатываю. Остальное обрабатываю так:
default: return DefWindowProc(hWnd,uMsg,wParam,lParam);
Что я упустил?
UPD: урезал версию своей проги до полного отсутствия смысла и оставил лишь каркас. Проблема осталась! Приведу полный код.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//============================================================================================
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hMainWnd;
char szClassName[] = "My Class";
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
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)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&wc
{
MessageBox(NULL, "Can'not register class","Error", MB_OK);
return 0;
}
hMainWnd = CreateWindow(szClassName,"A Hello Application", WS_OVERLAPPEDWINDOW, 50,50, 1040, 620,
(HWND)NULL, (HMENU)NULLHINSTANCE)hInstance,NULL);
if (!hMainWnd)
{
MessageBox(NULL, "Can'not create window","Error", MB_OK);
return 0;
}
ShowWindow(hMainWnd,nCmdShow);
UpdateWindow(hMainWnd);
while(GetMessage(&msg,hMainWnd,0,0;
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//=========================================================================
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
switch(uMsg)
{
case WM_PAINT:
{
hDC=BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
EndPaint(hWnd, &ps);
}
break;
default: return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
Или как ты из своего "while(GetMessage(&msg,hMainWnd,0,0;" собрался выходить?
минимальная прога на winapi, которую я видел в книжке, занимала три-четыре больших страницы
Если только тема не стёб, то обрати внимание на WM_MOVE и WM_SIZE. И вообще, что за хлам ты читаешь? Лет 15 назад уже все эти вопросы обсосали до мелочей.
while(GetMessage(&msg,hMainWnd,0,0;Во-первых, GetMessage возвращает ещё нехорошую -1.
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Во-вторых, ты уверен насчёт ";" в первой строчке? (надеюсь, ошибка копипаста)
Во-первых, GetMessage возвращает ещё нехорошую -1.Да, спасибо! тупая ошибка, но я такими страдаю по жизни
Во-вторых, ты уверен насчёт ";" в первой строчке? (надеюсь, ошибка копипаста)
взял бы WTL что ли
Оставить комментарий
fisher555
Нужен какой-нибудь интернет курс, что бы научиться воять приложения с использованием "чистого" Win API, желательно под MVS. Собственно ничего сложного не надо. Мне лишь окошко создать и нарисовать кое-чего на нем( но все равно что бы без косяков - перетащил его в другое место - ничего ен упало). Очень пойму тех людей, которые захотят написать: "Win API отстой - есть С#, ну или MFC хотя бы." - но учтите, что я и сам знаю C# и мог бы им воспользоваться. Просто очень надо именно на Win API. Заранее благодарен за советы.