Как научиться писать на чистом Win API?

fisher555

Нужен какой-нибудь интернет курс, что бы научиться воять приложения с использованием "чистого" Win API, желательно под MVS. Собственно ничего сложного не надо. Мне лишь окошко создать и нарисовать кое-чего на нем( но все равно что бы без косяков - перетащил его в другое место - ничего ен упало). Очень пойму тех людей, которые захотят написать: "Win API отстой - есть С#, ну или MFC хотя бы." - но учтите, что я и сам знаю C# и мог бы им воспользоваться. Просто очень надо именно на Win API. Заранее благодарен за советы.

istran

посмотри книгу Щупак Ю.А. "Win32 API. Эффективная разработка приложений." Там вроде все доходчиво написано. Ну и MSDN конечно.

fisher555

посмотри книгу Щупак Ю.А. "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;
}

enochka1145

А где "WM_DESTROY: PostQuitMessage(0);" ?
Или как ты из своего "while(GetMessage(&msg,hMainWnd,0,0;" собрался выходить?

Elina74

минимальная прога на winapi, которую я видел в книжке, занимала три-четыре больших страницы

enochka1145

Если только тема не стёб, то обрати внимание на WM_MOVE и WM_SIZE. И вообще, что за хлам ты читаешь? Лет 15 назад уже все эти вопросы обсосали до мелочей.

klyv

while(GetMessage(&msg,hMainWnd,0,0;
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Во-первых, GetMessage возвращает ещё нехорошую -1.
Во-вторых, ты уверен насчёт ";" в первой строчке? (надеюсь, ошибка копипаста)

fisher555

Во-первых, GetMessage возвращает ещё нехорошую -1.
Во-вторых, ты уверен насчёт ";" в первой строчке? (надеюсь, ошибка копипаста)
Да, спасибо! тупая ошибка, но я такими страдаю по жизни :(

Dasar

взял бы WTL что ли
Оставить комментарий
Имя или ник:
Комментарий: