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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2011, 20:35   #1
Ko3blpb
 
Регистрация: 22.12.2009
Сообщений: 3
По умолчанию Программа в Win32 API

Вобщем, мне надо написать программу в Visual C++ 6 Win32 API.
Суть программы: После старта программы, появляется пустое окно. Пользователь нажимает клавишу на клавиатуре, и вверху в окне в рандомном месте появляется кнопка с символом, который нажал пользователь. Сразу после того, как кнопка появилась, она начинает падать вниз и там (внизу) исчезает. Пользователь в это время может нажимать еще клавиши, и всегда в рандомном месте сверху появляются кнопки и начинают падать. Но есть условие: если кнопка еще не исчезла, над ней не может появиться еще одна.
Вот мой код:
Код:
// Buttons.cpp
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
	
	int Q=0;
	char s[1]="";
	int x1=0, y1=0;  
	int x2=0, y2=0;  
	int Number=1;			    
	int xltop=0,yltop=0;        
	int xrbottom=0,yrbottom=0;  
	int qw=1;					
	int Y1=0,X1=0;
	int i=1;	
	int num[20]={0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950};
	int rand_2,u,I=0;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
///////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND hWnd;  
	char szClassName[] = "MyClass";
	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, "Cannot register class", "Error", MB_OK);
		return 0;
	}
	
	hWnd = CreateWindow( 
		szClassName, "Buttons", WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		(HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL
	);
	
	if (!hWnd) {
		MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
		return 0;
	}

	ShowWindow(hWnd, nCmdShow); 
	
	RECT rect;

	while (GetMessage(&msg, NULL, 0, 0))  
	{
		GetWindowRect(hWnd,&rect);
			if((xrbottom-xltop)!=(rect.right-rect.left)  || (yrbottom-yltop)!=(rect.bottom-rect.top))
			{		
				qw=1;
				x2=0;
				y2=0;
				
				while(qw<Number)
				{
					MoveWindow(GetDlgItem(hWnd,qw),x2,y2,50,50,TRUE);
					qw=qw+1;
						if((x2+50)<(xrbottom-xltop))		 
						x2=x2+50;
						/*else
						{ 
							x2=0;
						    y2=y2+50;
						}*/
				}
			}
	yltop=rect.top;
	xltop=rect.left;
	xrbottom=rect.right;
	yrbottom=rect.bottom;
		
		DispatchMessage(&msg);
			
			if(msg.message==WM_KEYDOWN)
			{
				srand( time(NULL));
				rand_2=	rand()%20;
				if (rand_2==I)
				{u=1;}
				else
				u=num[rand_2];

				HWND Button=CreateWindow("BUTTON",s, WS_CHILD | WS_BORDER,u,y1,50,50,hWnd,(HMENU)Number,hInstance, NULL);
				ShowWindow(Button,nCmdShow);

				if((x1+50)<(xrbottom-xltop))		 
			    x1=x1+50;
				Number=Number+1;
			}

	}

	return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMSG, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	RECT rect;
	PAINTSTRUCT ps;
	int userReply;

	switch (uMSG)
	{
	case WM_PAINT:
		hDC = BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		break;

	case WM_COMMAND:
			
		Q=LOWORD(wParam);
		ShowWindow(GetDlgItem(hWnd,Q),SW_HIDE);
		DestroyWindow(GetDlgItem(hWnd,Q));
		x2=y2=0;
		break;
	
	case WM_CREATE:
		SetTimer (hWnd,1,1000,NULL);
		break;
	
	case WM_TIMER:  
		RECT a;

		while(i<Number)
			{
				GetWindowRect(GetDlgItem(hWnd,i),&a);
				Y1=a.top;
				MoveWindow(GetDlgItem(hWnd,i),u,Y1+10,50,50,TRUE); i+=1;
			}
		break;

	case WM_KEYDOWN:
		s[0]=char(wParam);
		break;
	
	case WM_CLOSE:
		userReply = MessageBox(hWnd, "Do you really want to quit?","Exit", MB_YESNO | MB_ICONQUESTION);
		if (IDYES == userReply)
			DestroyWindow(hWnd);
		break;

    case WM_DESTROY:
		KillTimer(hWnd,1);
		PostQuitMessage(0);
		return 0;

	default:
		return DefWindowProc(hWnd, uMSG, wParam, lParam);
	}

	return 0;
}

Основная проблема в том, что кнопки почему-то не падают до конца.
Код:
	
case WM_TIMER:  
		RECT a;

		while(i<Number)
			{
				GetWindowRect(GetDlgItem(hWnd,i),&a);
				Y1=a.top;
				MoveWindow(GetDlgItem(hWnd,i),u,Y1+10,50,50,TRUE); 
i+=1;
			}
		break;
Плюс я еще не знаю как реализовать условие того, что в одной колонке не может быть более одной кнопки.

Нуждаюсь в вашей помощи.

Последний раз редактировалось Ko3blpb; 05.01.2011 в 20:41.
Ko3blpb вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
API Win32 в ассемблере Alex_VK Помощь студентам 1 24.12.2010 02:51
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Win32 API. VS2008. Как создать приложение win32 в vs2008? Aleksandr_Yanov Visual C++ 4 12.09.2010 00:59
Win32 Api revaldo666 Win Api 10 06.07.2010 00:48
Win32 Api! alexov Общие вопросы C/C++ 7 09.02.2009 22:25