Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2012, 21:27   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию передвижение линии

здравствуйте, вот имеется код:

Код:
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")

int i=10,j=10,a=10,b=100;
VOID OnPaint(HDC hdc)
{
   Graphics graphics(hdc);
   Pen penl(Color(255, 0, 0, 255));
   graphics.DrawLine(&penl, i, j, a, b);
}
VOID OnPaintRun(HDC hdc, int command)
{
	Pen penl(Color(255, 0, 0, 255));
	Graphics graphics(hdc);
	switch(command)
	{
	case 37:
		break;
	case 38:
		break;
	case 39:
		j+=1;
		b+=1;
		graphics.Clear(Color(0, 0, 0, 0));
		graphics.DrawLine(&penl, i, j, a, b);
		break;
	case 40:
		break;
	default:
		graphics.DrawLine(&penl, i, j, a, b);
		break;
	}
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
   HWND                hWnd;
   MSG                 msg;
   WNDCLASS            wndClass;
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR           gdiplusToken;
   
   // Initialize GDI+.
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   
   wndClass.style          = CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc    = WndProc;
   wndClass.cbClsExtra     = 0;
   wndClass.cbWndExtra     = 0;
   wndClass.hInstance      = hInstance;
   wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
   wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
   wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndClass.lpszMenuName   = NULL;
   wndClass.lpszClassName  = TEXT("GettingStarted");
   
   RegisterClass(&wndClass);
   
   hWnd = CreateWindow(
      TEXT("GettingStarted"),   // window class name
      TEXT("Getting Started"),  // window caption
      WS_OVERLAPPEDWINDOW,      // window style
      CW_USEDEFAULT,            // initial x position
      CW_USEDEFAULT,            // initial y position
      CW_USEDEFAULT,            // initial x size
      CW_USEDEFAULT,            // initial y size
      NULL,                     // parent window handle
      NULL,                     // window menu handle
      hInstance,                // program instance handle
      NULL);                    // creation parameters
	  
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while(GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   
   GdiplusShutdown(gdiplusToken);
   return msg.wParam;
}  // WinMain

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC          hdc;
	PAINTSTRUCT  ps;
	int codec = 0;
	switch(message)
	{
	case WM_KEYDOWN:
		
		hdc=GetDC(hWnd);
		if(ReleaseDC(hWnd,hdc)==0)
		{
			MessageBox(NULL,"рабочая область не освободилась","Warning",MB_OK);
			return 0;
		}
		SetBkColor(hdc,COLORREF("0x000000"));
		//39 - стрелка вправо
		//37 - стрелка влево
		//38 - стрелка вверх
		//40 - стрелка вниз
		codec=(int)wParam;
		codec = (int)lParam;
		hdc = BeginPaint(hWnd, &ps);
		OnPaintRun(hdc,(int)wParam);
		EndPaint(hWnd, &ps);
		UpdateWindow(hWnd);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		OnPaint(hdc);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
}
при нажатии на стрелку вправо, линия должна передвинуться, обработчик клавиш есть, он работает, проверял, но сама линия не хочет двигаться, все, что я перепробовал - в коде, и UpdateWindow, метод Clear, ReleaseDC, не помогло. Подскажите пожалуйста, как это осуществить?
Olejik вне форума Ответить с цитированием
Старый 25.11.2012, 12:41   #2
LancX
Пользователь
 
Аватар для LancX
 
Регистрация: 30.04.2012
Сообщений: 52
По умолчанию

неохота вникать в глубину твоего кода, чисто по логике я бы сделал 2 static числа означающих x и y, которые означают координаты начала линии, и при нажатии клавиш манипулировал этими значениями, допустим:
//стрелка вправо
x++
SendMessage(hWindow,WM_PAINT,0,0);
а в onPaint стирал предыдущую линию и рисовал следующую, по новым координатам. просто и надежно)
При любом расчете, число, правильность которого для всех очевидна, становится источником ошибок.
LancX вне форума Ответить с цитированием
Старый 25.11.2012, 13:56   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от LancX Посмотреть сообщение
SendMessage(hWindow,WM_PAINT,0,0);
Это лучше делать через InvalidateRect()
waleri вне форума Ответить с цитированием
Старый 25.11.2012, 13:57   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

ну у меня там так и сделано, я ими манипулирую, перерисовываю, самый прикол, в том, что если свернуть и развернуть экран, то линия передвигается, а так не хочет, стоит на месте

Код:
case WM_KEYDOWN:
		//39 - стрелка вправо
		//37 - стрелка влево
		//38 - стрелка вверх
		//40 - стрелка вниз
		hdc = BeginPaint(hWnd, &ps);
		x1+=10;
		x2+=10;
		OnPaint(hdc);
		EndPaint(hWnd, &ps);
		SendMessage(hWnd,WM_PAINT,0,0);
		UpdateWindow(hWnd);
		//InvalidateRect(hWnd,,true);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		OnPaint(hdc);
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
вот теперь так написано.
прочитал про InvalidateRect и UpdateWindow, говорят, что 2-я функция запускается без задержки, минуя сообщения, но все равно, если не сворачивать рабочую область, то линия не движется, а если свернуть и развернуть, то линия передвигается как подобает

Последний раз редактировалось Stilet; 25.11.2012 в 14:30.
Olejik вне форума Ответить с цитированием
Старый 25.11.2012, 17:27   #5
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

сделал, нарыл в интернете и вот такую штуку состроил:
Код:
case WM_KEYDOWN:
		//39 - стрелка вправо
		//37 - стрелка влево
		//38 - стрелка вверх
		//40 - стрелка вниз
		x1+=10;
		x2+=10;
		InvalidateRect(hWnd,NULL,true);
		hdc = BeginPaint(hWnd, &ps);
		MoveToEx(hdc, x1, y1, NULL);
		LineTo(hdc,x2,y2);
		EndPaint(hWnd, &ps);
		break;
с Gdiplus попробовал, тоже прокатило, все, тему можно закрывать )

Последний раз редактировалось Olejik; 25.11.2012 в 17:33.
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать из линии, толщиной в несколько пикселей, линии, толщиной 1 пиксель. ImmortalAlexSan Общие вопросы Delphi 12 25.10.2012 19:05
Передвижение объектов. Natasha190989 Паскаль, Turbo Pascal, PascalABC.NET 0 16.04.2011 22:44
передвижение по документу dimonnnn JavaScript, Ajax 0 14.08.2010 21:13
Передвижение фигур rododendron Общие вопросы C/C++ 1 01.06.2009 20:38
Передвижение формы JIK Помощь студентам 2 12.07.2008 17:45