Регистрация: 22.12.2009
Сообщений: 3
|
Программа в Win32 API
Вобщем, мне надо написать программу в Visual C++ 6 Win32 API.
Суть программы: После старта программы, появляется пустое окно. Пользователь нажимает клавишу на клавиатуре, и вверху в окне в рандомном месте появляется кнопка с символом, который нажал пользователь. Сразу после того, как кнопка появилась, она начинает падать вниз и там (внизу) исчезает. Пользователь в это время может нажимать еще клавиши, и всегда в рандомном месте сверху появляются кнопки и начинают падать. Но есть условие: если кнопка еще не исчезла, над ней не может появиться еще одна.
Вот мой код:
Код:
#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;
}
}
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.
|