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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 10:29   #1
Arderun
Пользователь
 
Регистрация: 11.04.2011
Сообщений: 11
По умолчанию PW_PAINT: переполнение счетчика и перерисовка диалогового окна

Доброго дня. Я совсем новичек в WIN API. буквально со вчера изучаю. В задании необходимо пустить обьект по кругу вокруг стационарного шара. что-то вроде орбиты(траэкторию посчитать уже дело математики), но есть две проблемы.
1. диалоговое окно которое я задал по нажатию леков кнопик мыши обновляется вместе с основным окном
2. по истичению небольшого времени(около минуты) прорисовка анимации завершается и окно на контакт не идет.

разные места собирал по кусочкам местами переводил английские коменыт местами были наши.
Код:
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <string.h>
#include "resource.h"
#include <tchar.h>
#include <math.h>

// фиксированные значения
#define PI 3.1415926
#define RAD 57,295779
#define STEP 3 // 3 градуса за шаг
#define NUM 100 // буфер координат 
static int x[NUM],y[NUM];  //координаты сработавшего текста
#define Win_sizeX 1000 // Размеры окна
#define Win_sizeY 800 // Размеры окна
static int textNum=0;
int EarthХ=Win_sizeX/2,EarthY =Win_sizeY/2, EarthR=35, SatR=5, SatOrbit=EarthR+40, AngleCut =0;;  //  Орбита взята как 40 единиц от радиуса земли 
double SatX=EarthХ+SatOrbit, SatY=EarthY;
double OrbitAngle=0;// Angle= degree*PI/180
int color=100;

//названия
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Спутники Земли");
HINSTANCE hInst;

//функция для регистрации окон
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
// обьявение основного окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// обьявение диалогового окна
BOOL CALLBACK DialogBarDlgProc(HWND, UINT, WPARAM, LPARAM);

//начало главной функции

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{
WNDCLASSEX main;
MyRegisterClass(hInstance);
InitInstance(hInstance, nCmdShow);


MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int) msg.wParam;
}

Задание появилось неожидано и срочно, в другое время я восполню пробелы методично вычитав, но сейчас так поступить просто не успею

Последний раз редактировалось Arderun; 30.04.2012 в 10:32.
Arderun вне форума Ответить с цитированием
Старый 30.04.2012, 10:30   #2
Arderun
Пользователь
 
Регистрация: 11.04.2011
Сообщений: 11
По умолчанию

Код:
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) обработка сообщений
// WM_PAINT  - рисовать главное окно
// WM_DESTROY написать сообщение выхода и возврат
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC hdc; //создаём контекст устройства
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода

//+++++++++++++++++++++++++++++++++++++++++++++++
HBRUSH EarthBrush,SatelliteBrush,ClearBrush;  // кисти для закрашивания земли, спутников, и цветом фона.
EarthBrush=CreateSolidBrush(RGB(0,0,1000));
SatelliteBrush=CreateSolidBrush(RGB(700,0,0));
ClearBrush=CreateSolidBrush(RGB(0,0,0));
HPEN hPen1; //невидимое перо чтобы стереть контурные линии
hPen1=CreatePen(PS_NULL, 1, RGB(0,0,255));

switch (message)
{
	case WM_COMMAND:
		{
			
		}
	case WM_LBUTTONDOWN:
			{//щелчек левой кнопкой
				HDC hdc;
				hdc=GetDC(hWnd);
				x[textNum]=LOWORD(lParam); //узнаём координаты
				 y[textNum]=HIWORD(lParam);
 				SelectObject(hdc,SatelliteBrush);
			Ellipse( hdc,  
			x[textNum]-SatR,  
			y[textNum]-SatR,  
			x[textNum]+SatR,  
			y[textNum]+SatR);
				
				textNum++;
			DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOGBAR),hWnd,DialogBarDlgProc);
			break;
			}



	
			
	case WM_RBUTTONDOWN:  //щелчек правой кнопкой
		{textNum--;
			HDC hdc;
			hdc=GetDC(hWnd);
						
			SelectObject(hdc,ClearBrush);
			Ellipse( hdc,  
			x[textNum]-SatR,  
			y[textNum]-SatR,  
			x[textNum]+SatR,  
			y[textNum]+SatR);

		break;
		
		}
		
	case WM_CREATE:
		{
			 SetTimer(hWnd, 1, 10, NULL);


		}
		 
	case    WM_TIMER:
		{
		   InvalidateRect(hWnd, NULL, FALSE);
			
			////++++++++++++++++++++++ поиск новой координаты
			 OrbitAngle=( OrbitAngle+STEP*PI/180); 
			 if(AngleCut>359/STEP){   //условие для сбрасывания угла по прохождению полного круга.
				 OrbitAngle=0;
				 AngleCut=0;}
			 else AngleCut++;
			SatX=EarthХ + SatOrbit*cos(OrbitAngle);
			SatY=EarthY+ SatOrbit*sin(OrbitAngle);
			//++++++++++++++++++++
			break;
		}
	case WM_PAINT:  
		{	
		 hdc = BeginPaint(hWnd, &ps);
		   
		 		
		         // здесь будет составление изображения
			SelectObject(hdc, hPen1);  
			SelectObject(hdc,EarthBrush);
			Ellipse( hdc, EarthХ-EarthR,EarthY-EarthR,EarthХ+EarthR,EarthY+EarthR); // EarthХ=500,EarthY =400, EarthR=35 земля с центром в EarthХ=235 EarthY =225 радиус EarthR=35  


			SelectObject(hdc,SatelliteBrush);
			Ellipse( hdc,  
			(int)SatX-SatR,  
			(int)SatY-SatR,  
			(int)SatX+SatR,  
			(int)SatY+SatR);

			Sleep(25);
			
			SelectObject(hdc,ClearBrush);
			Ellipse( hdc,  
			(int)SatX-SatR,  
			(int)SatY-SatR,  
			(int)SatX+SatR,  
			(int)SatY+SatR);

			


			//заканчиваем рисовать
			EndPaint(hWnd, &ps);
			break; 
			}
	case WM_DESTROY:   
			PostQuitMessage(0);
			break;
	//default:
			//return DefWindowProc(hWnd, message, wParam, lParam);
			//break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
//return 0;
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX orbitWind;
	orbitWind.cbSize = sizeof(WNDCLASSEX);

	orbitWind.style = CS_HREDRAW | CS_VREDRAW;
orbitWind.lpfnWndProc = WndProc;
orbitWind.cbClsExtra = 0;
orbitWind.cbWndExtra = 0;
orbitWind.hInstance = hInstance;
orbitWind.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
orbitWind.hCursor = LoadCursor(NULL, IDC_ARROW);
orbitWind.hbrBackground=GetStockBrush (BLACK_BRUSH);// по умолчанию фон hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
orbitWind.lpszMenuName = NULL;
orbitWind.lpszClassName = szWindowClass;
orbitWind.hIconSm = LoadIcon(orbitWind.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	return  RegisterClassEx(&orbitWind);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	HWND hWnd;

	hInst =hInstance;
	hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
		0,Win_sizeX/*CW_USEDEFAULT*/,Win_sizeY,NULL,NULL,hInstance,NULL);
	
if (!hWnd)
{
MessageBox(NULL,
_T("вызов CreateWindow неудался!"),
_T("Спутники Земли"),
NULL);

return 1;
}
ShowWindow(hWnd,
nCmdShow);

UpdateWindow(hWnd);

return 0;
}

//BOOL CALLBACK DlgFunc(HWND hw, UINT msg, WPARAM wp, LPARAM lp) 
//BOOL WINAPI EndDialog(HWND hw, int result)// для закрытия диалогового окна

BOOL CALLBACK DialogBarDlgProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //создаём контекст устройства
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
/*
WM_INITDIAL0G вместо WM_CREATE в нем элементы инициализировать
WM_PAINT
*/
switch(mes)
{
case WM_INITDIALOG:
	{
		int V;


	}
case WM_COMMAND:
	{
	}
	case WM_PAINT:
		{


		}
	default:
		return FALSE;
}
return TRUE;
}

//BOOL EndDialog ( HWND hDl, INT_PTR nResult );
остаток кода

Последний раз редактировалось Arderun; 30.04.2012 в 10:32.
Arderun вне форума Ответить с цитированием
Старый 30.04.2012, 14:10   #3
Arderun
Пользователь
 
Регистрация: 11.04.2011
Сообщений: 11
По умолчанию

вопрос про обновляющееся окно снят. Немодальные диалоги наше все . про таймер все еще актуально
Arderun вне форума Ответить с цитированием
Старый 01.05.2012, 12:19   #4
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

у вас утечка GDI вы с каждым сообщением создаёте объекты и не освобождаете их, или создайте один раз или освобождайте их после использования.
microbit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер диалогового окна Samir_ Win Api 0 15.03.2012 11:30
Проверка наличия диалогового окна Diego__ Microsoft Office Word 2 19.11.2010 19:18
У диалогового окна пропадает фон ssashas Помощь студентам 0 25.04.2010 21:22
Создание диалогового окна в Word Busine2009 Фриланс 3 13.07.2009 09:37
Вызов диалогового окна Sapsan Общие вопросы C/C++ 6 30.03.2009 23:03