Рисование мышью
В чём моя ошибка?
#include <Windows.h>
#include <malloc.h>
#include <stdio.h>
unsigned int VertexAmount=0;
struct Vertex
{
short X;
short Y;
};
Vertex *Vertexes;
void OnDraw(HWND hWnd)
{
PAINTSTRUCT ps;
char lpString[10];
HDC hDC=BeginPaint(hWnd, &ps);
SetBkColor(hDC, RGB(255, 0, 0));
SetTextColor(hDC, RGB(255, 255, 255));
for(unsigned int i=0; i<VertexAmount; i++)
{
sprintf(lpString, "%d", i);
TextOut(hDC, Vertexes.X, Vertexes.Y, lpString, strlen(lpString));
}
EndPaint(hWnd, &ps);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_LBUTTONDOWN:
Vertexes=(Vertex*) realloc(Vertexes, (VertexAmount+1)*sizeof(Vertex));
Vertexes[VertexAmount].X=lParam;
Vertexes[VertexAmount].Y=lParam>>16;
VertexAmount++;
break;
case WM_RBUTTONDOWN:
Vertexes=(Vertex*) realloc(Vertexes, 0);
VertexAmount=0;
break;
case WM_PAINT:
OnDraw(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
char szWindowClass[]="Vertexes";
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC) WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor=LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=NULL;
RegisterClassEx(&wcex);
HWND hWnd=CreateWindow(szWindowClass, szWindowClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
Vertexes=(Vertex*) malloc(VertexAmount*sizeof(Vertex));
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
free(Vertexes);
return (int) Msg.wParam;
}
А ты не пробовал в обработке мышастых сообщений делать Invalidate?
Цитата:
Originally posted by wanja
А ты не пробовал в обработке мышастых сообщений делать Invalidate?
А ты не пробовал в обработке мышастых сообщений делать Invalidate?
Именно!!!
InvalidateRect(hWnd, NULL, TRUE); и всё работает, вот только кто мне теперь объяснит почему надо именно так?
Цитата:
Originally posted by Stanky
Именно!!!
InvalidateRect(hWnd, NULL, TRUE); и всё работает, вот только кто мне теперь объяснит почему надо именно так?
Именно!!!
InvalidateRect(hWnd, NULL, TRUE); и всё работает, вот только кто мне теперь объяснит почему надо именно так?
Чтобы пришло сообщение WM_PAINT, конечно. А то в WM_MOSEDOWN только меняется массив, который к экрану гвоздями не прибит!!!
Цитата:
Originally posted by wanja
Чтобы пришло сообщение WM_PAINT, конечно. А то в WM_MOSEDOWN только меняется массив, который к экрану гвоздями не прибит!!!
Чтобы пришло сообщение WM_PAINT, конечно. А то в WM_MOSEDOWN только меняется массив, который к экрану гвоздями не прибит!!!
Дык, и UpdateWindow() тоже WM_PAINT посылает!!!
В чём именно разница?
И какой массив ты имеешь в виду?
Цитата:
Originally posted by Stanky
Дык, и UpdateWindow() тоже WM_PAINT посылает!!!
В чём именно разница?
Дык, и UpdateWindow() тоже WM_PAINT посылает!!!
В чём именно разница?
Не обязательно. Видимо она не считает, сто после каждого клика окно надо перерисовывать.
Цитата:
И какой массив ты имеешь в виду?
Vertexes
Цитата:
Originally posted by Stanky
Дык, и UpdateWindow() тоже WM_PAINT посылает!!!
В чём именно разница?
И какой массив ты имеешь в виду?
Дык, и UpdateWindow() тоже WM_PAINT посылает!!!
В чём именно разница?
И какой массив ты имеешь в виду?