Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
1

Убегание окна от курсора

20.03.2010, 16:31. Показов 1679. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать)
такая классическая задачка в общем

пока реализовано само окно и кривое определние координат курсора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <windows.h>
 
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 
 int nCmdShow)
{
 HWND hwnd;
 MSG msg;
 WNDCLASS w;
 memset(&w,0,sizeof(WNDCLASS));
 w.style = CS_HREDRAW | CS_VREDRAW;
 w.lpfnWndProc = WndProc;
 w.hInstance = hInstance;
 w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 w.lpszClassName = "My Class";
 RegisterClass(&w);
 hwnd = CreateWindow("My Class", "Lab6", WS_OVERLAPPEDWINDOW,
 300, 200, 200, 180, NULL, NULL, hInstance, NULL);
 ShowWindow(hwnd,nCmdShow);
 UpdateWindow(hwnd);
 while(GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return msg.wParam;
}
 
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
 switch (Message)
 {
 case WM_DESTROY: 
 PostQuitMessage(0);
 break;
 case WM_MOUSEMOVE:
        int x,y;
        x=LOWORD(lparam);
        y=HIWORD(lparam);
        char u[10];
        _itoa_s(x,u,10,10);
        if(u[1]==0)
            u[1]=' ';
        if(u[2]==0)
            u[2]=' ';
        _itoa_s(y,u+4,6,6);
        u[3]='x';
        SetWindowText(hwnd,u);
        break;
 default:
 return DefWindowProc(hwnd, Message, wparam, lparam);
 }
 return 0;
}
Добавлено через 2 часа 19 минут
Окно от курсора убегает так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 case WM_MOUSEMOVE:
        int x,y;
        x=LOWORD(lparam);
        y=HIWORD(lparam);
        char u[10];
        _itoa_s(x,u,10,10);
        if(u[1]==0)
            u[1]=' ';
        if(u[2]==0)
            u[2]=' ';
        _itoa_s(y,u+4,6,6);
        u[3]='x';
        SetWindowText(hwnd,u);
MoveWindow(hwnd,120,100,200,180,TRUE);
        break;
Пэчаль в том, что он двигает окно лишь в заданные координаты x и y
как сделать, чтобы эти x y были случайными?)

Добавлено через 5 минут
C++
1
MoveWindow(hwnd, rand() % GetSystemMetrics(SM_CXSCREEN) - 200, rand() % GetSystemMetrics(SM_CYSCREEN) - 180, 200, 180, TRUE);
Надо было просто это добавить в case WM_MOUSEMOVE:

Теперь осталось только реализовать то, что при двойном щелчке убегание прекращалось))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2010, 16:31
Ответы с готовыми решениями:

Движение курсора мыши должно плавно менять цвет фона окна.
точнее 2 1) Движение курсора мыши должно плавно менять цвет фона окна. Левый верхний угол -...

Убегание окна от курсора
В виду того, что тему создал не в том разделе, перенес сюда собственно прошу помочь с моментами...

"Убегание" всплывающего окна при масштабировании
Добрый вечер! Прошу Вашей помощи, т.к. весь день просидела за решением данной проблемы, но так и не...

Как сделать анимацию прозрачности окна при наведении курсора мыши и его ухода с окна
Я сделал так (из класса убрал всё лишнее, только по теме оставил): using System; using...

1
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
24.03.2010, 17:57  [ТС] 2
Народ, помогите доделать прогу)))
Нужно чтобы с помощью двойного щелчка убегание прекращалось...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <windows.h>
#include <cstdlib>
#include <ctime>
 
 
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 
 int nCmdShow)
{
srand(time(0));
 HWND hwnd;
 MSG msg;
 WNDCLASS w;
 memset(&w,0,sizeof(WNDCLASS));
 w.style = CS_HREDRAW | CS_VREDRAW;
 w.lpfnWndProc = WndProc;
 w.hInstance = hInstance;
 w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 w.lpszClassName = "My Class";
 RegisterClass(&w);
 hwnd = CreateWindow("My Class", "Lab6", WS_OVERLAPPEDWINDOW,
 300, 200, 200, 180, NULL, NULL, hInstance, NULL);
 ShowWindow(hwnd,nCmdShow);
 UpdateWindow(hwnd);
 while(GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return msg.wParam;
}
 
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
 switch (Message)
 {
 case WM_DESTROY: 
 PostQuitMessage(0);
 break;
case WM_MOUSEMOVE:
int x,y,z;
        x=LOWORD(lparam);
        y=HIWORD(lparam);
        z=0;
        char u[10];
        _itoa_s(x,u,10,10);
        if(u[1]==0)
            u[1]=' ';
        if(u[2]==0)
            u[2]=' ';
        _itoa_s(y,u+4,6,6);
        u[3]='x';
         SetWindowText(hwnd,u);
        MoveWindow(hwnd, rand() % GetSystemMetrics(SM_CXSCREEN) - 200, rand() % GetSystemMetrics(SM_CYSCREEN) - 180, 200, 180, TRUE);
        break;
 
case WM_LBUTTONDBLCLK:
 
    break;
 default:
 return DefWindowProc(hwnd, Message, wparam, lparam);
 }
 return 0;
}
Добавлено через 38 минут
то есть у меня

C++
1
2
if (z==0)
MoveWindow(hwnd, rand() % GetSystemMetrics(SM_CXSCREEN) - 200, rand() % GetSystemMetrics(SM_CYSCREEN) - 180, 200, 180, TRUE);
но

C++
1
2
3
case WM_LBUTTONDBLCLK:
    z=1;
break;
не передает значения, чтобы цикл завершился

Добавлено через 11 минут
программа теперь рабоатает, сам разобрался)
вся проблема в том, что я неправильно писал WM_LBUTTONDBLCLK (это двойной клик по клиенской области), а надо WM_NCLBUTTONDBLCLK (это по неклиентской, по заголовку)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case WM_MOUSEMOVE:
int x,y;
        x=LOWORD(lparam);
        y=HIWORD(lparam);
        char u[10];
        _itoa_s(x,u,10,10);
        if(u[1]==0)
            u[1]=' ';
        if(u[2]==0)
            u[2]=' ';
        _itoa_s(y,u+4,6,6);
        u[3]='x';
         SetWindowText(hwnd,u);
         if (UserDoneDoubleClick == false)
        MoveWindow(hwnd, rand() % GetSystemMetrics(SM_CXSCREEN) - 200, rand() % GetSystemMetrics(SM_CYSCREEN) - 180, 200, 180, TRUE);
        break;
 
case WM_NCLBUTTONDBLCLK:
UserDoneDoubleClick = true;
break;
0
24.03.2010, 17:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2010, 17:57
Помогаю со студенческими работами здесь

Координаты курсора относительно окна
Просто покажите мне, как сделать так, чтобы на экране были показаны координаты курсора. Я себе это...

Координаты курсора мыши относительно окна
использую вот такую штучку в backgroundworker-е: for (;;) { Point point1 =...

Координаты курсора вместо имени окна
Как сделать, чтобы если водить курсором внутри окна приложения, то название окна менялось показывая...

“Фишеровское убегание” в культуре как причина общей деградации
Тем, кто читал книги по биологии и имеют представление о фишеровском убегании, будет легче понять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru