Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рисование мышью

2.1K
03 апреля 2004 года
Stanky
48 / / 06.12.2003
Мне надо мышью указать в каких точках будут вершины, но что бы я ни делал окно не хочет перерисовываться пока я его не разверну, сверну и так далее... При нажатии правой кнопки всё должно стираться!!!

В чём моя ошибка?


#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;
}
424
03 апреля 2004 года
(C)dragon
307 / / 04.12.2002
Вообще-то блоки case надо объединять в {}

Добавь в обработчик сообщения WM_RBUTTONDOWN вызов UpdateWindow(hWnd);
2.1K
03 апреля 2004 года
Stanky
48 / / 06.12.2003
Цитата:
Originally posted by (C)dragon
Вообще-то блоки case надо объединять в {}



Вообще-то там break не просто так стоит!!!

Цитата:
Добавь в обработчик сообщения WM_RBUTTONDOWN вызов UpdateWindow(hWnd);



Я же сказал, что пробовал и так и сяк - не пашет зараза и всё тут!!!

Попробуй сам откомпилить и проверь!!!

424
03 апреля 2004 года
(C)dragon
307 / / 04.12.2002
Вместо UpdateWindow надо вставлять такой вызов:

InvalidateRect(hWnd, NULL, true);

тогда всё работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог