Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 144
#1

Создание окна интерактивного помощника

10.09.2015, 16:37. Просмотров 757. Ответов 5
Метки нет (Все метки)

Как обычно, хочется сделать что-то интересное, но не хватает навыков, знаний а так же информации.

Итак, мне хотелось бы написать Интерактивного помощника, немного похожего на Скрепку/кошку/собаку из win2000 (office)

Самая главная задумка - отображение отдельной картинки на экране, которая не привязана к окну.
Побочные задумки: при нажатии на картинку происходят те или иные действия.

Я не знаю с чего начать, т.к. не встречал программ, которые могут управлять картинками без окон.
Очень жду ваших советов!

Я думаю, С++ как раз подходит для этого.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2015, 16:37
Ответы с готовыми решениями:

Graphics.h создание окна
Нужно создать окно не с максимальным разрешением, как это делается с помощью ...

Создание Output окна с++
Добрый вечер, как в с++ VS13 создать своё Output окно, чтобы всё писалось в...

Создание окна windows
я работаю под ОС windows язык DEV C++ как создать обыкновенное окно,и допустим...

Создание формы (окна)
Здравствуйте! Кто - нибудь знает как создать окно (или по проще белый...

Создание текстового окна
Добрый день. Пробую создать текствое окно на плюсах. Среда разработки - Qt...

5
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
10.09.2015, 17:23 #2
Так не получится. Сделай окно прозрачным.
1
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 144
10.09.2015, 21:12  [ТС] #3
Так как я использую библиотеку SFML, и нашёл то, что искал, вот вам результат:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <SFML/Graphics.hpp>
 
#if defined (SFML_SYSTEM_WINDOWS)
    #include <windows.h>
 
    bool setShape(HWND hWnd, const sf::Image& image)
    {
        const sf::Uint8* pixelData = image.getPixelsPtr();
        HRGN hRegion = CreateRectRgn(0, 0, image.getSize().x, image.getSize().y);
 
        // Determine the visible region
        for (unsigned int y = 0; y < image.getSize().y; y++)
        {
            for (unsigned int x = 0; x < image.getSize().x; x++)
            {
                if (pixelData[y * image.getSize().x * 4 + x * 4 + 3] == 0)
                {
                    HRGN hRegionPixel = CreateRectRgn(x, y, x+1, y+1);
                    CombineRgn(hRegion, hRegion, hRegionPixel, RGN_XOR);
                    DeleteObject(hRegionPixel);
                }
            }
        }
 
        SetWindowRgn(hWnd, hRegion, true);
        DeleteObject(hRegion);
        return true;
    }
 
    bool setTransparency(HWND hWnd, unsigned char alpha)
    {
        SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
        SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA);
        return true;
    }
 
#elif defined (SFML_SYSTEM_LINUX)
    #include <X11/Xatom.h>
    #include <X11/extensions/shape.h>
 
    bool setShape(Window wnd, const sf::Image& image)
    {
        const sf::Uint8* pixelData = image.getPixelsPtr();
        Display* display = XOpenDisplay(NULL);
 
        // Try to set the window shape
        int event_base;
        int error_base;
        if (XShapeQueryExtension(display, &event_base, &error_base))
        {
            Pixmap pixmap = XCreatePixmap(display, wnd, image.getSize().x, image.getSize().y, 1);
            GC gc = XCreateGC(display, pixmap, 0, NULL);
 
            XSetForeground(display, gc, 1);
            XFillRectangle(display, pixmap, gc, 0, 0, image.getSize().x, image.getSize().y);
            XSetForeground(display, gc, 0);
 
            for (unsigned int y = 0; y < image.getSize().y; y++)
            {
                for (unsigned int x = 0; x < image.getSize().x; x++)
                {
                    if (pixelData[y * image.getSize().x * 4 + x * 4 + 3] == 0)
                        XFillRectangle(display, pixmap, gc, x, y, 1, 1);
                }
            }
 
            XShapeCombineMask(display, wnd, ShapeBounding, 0, 0, pixmap, ShapeSet);
            XFreeGC(display, gc);
            XFreePixmap(display, pixmap);
            XFlush(display);
            XCloseDisplay(display);
            return true;
        }
 
        XCloseDisplay(display);
    }
 
    bool setTransparency(Window wnd, unsigned char alpha)
    {
        Display* display = XOpenDisplay(NULL);
        unsigned long opacity = (0xffffffff / 0xff) * alpha;
        Atom property = XInternAtom(display, "_NET_WM_WINDOW_OPACITY", false);
        if (property != None)
        {
            XChangeProperty(display, wnd, property, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)&opacity, 1);
            XFlush(display);
            XCloseDisplay(display);
            return true;
        }
        else
        {
            XCloseDisplay(display);
            return false;
        }
    }
 
    #undef None // None conflicts with SFML
#elif defined (SFML_SYSTEM_MACOS)
    bool setShape(sf::WindowHandle handle, const sf::Image& image);
    bool setTransparency(sf::WindowHandle handle, unsigned char alpha);
#else
    bool setShape(sf::WindowHandle handle, const sf::Image& image)
    {
        return false;
    }
 
    bool setTransparency(sf::WindowHandle handle, unsigned char alpha)
    {
        return false;
    }
#endif
 
int main()
{
    //FreeConsole(); - закрывает консольку
 
    // Change this to the wanted transparency
    const unsigned char opacity = 255;//185;
 
    // Load an image with transparent parts that will define the shape of the window
    sf::Image backgroundImage;
    backgroundImage.loadFromFile("image.png");
 
    // Create the window and center it on the screen
    sf::RenderWindow window(sf::VideoMode(backgroundImage.getSize().x, backgroundImage.getSize().y, 32), "Transparent Window", sf::Style::None);
    window.setPosition(sf::Vector2i((sf::VideoMode::getDesktopMode().width - backgroundImage.getSize().x) / 2,
                                    (sf::VideoMode::getDesktopMode().height - backgroundImage.getSize().y) / 2));
 
    // These functions return false on an unsupported OS or when it is not supported on linux (e.g. display doesn't support shape extention)
    setShape(window.getSystemHandle(), backgroundImage);
    setTransparency(window.getSystemHandle(), opacity);
 
    // We will also draw the image on the window instead of just showing an empty window with the wanted shape
    sf::Texture backgroundTexture;
    sf::Sprite backgroundSprite;
    backgroundTexture.loadFromImage(backgroundImage);
    backgroundSprite.setTexture(backgroundTexture);
 
    // Main loop to display the image while the window is open (pressing the escape key to close the window)
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed || (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape))
                window.close();
        }
 
        window.clear(sf::Color::Transparent);
        window.draw(backgroundSprite);
        window.display();
    }
 
    return 0;
}
Должно работать

Добавлено через 1 минуту
Код не мой, нашёл на форуме SFML, а по нему на GidHub, там можете поискать исходники
0
UI-Maker
38 / 38 / 11
Регистрация: 05.09.2015
Сообщений: 262
10.09.2015, 21:24 #4
Картинки без окна не бывает. Зато окно можно:
а) Вырезать по региону
б) Вырезать по маске
в) Вырезать по цвету пикселя
г) Использовать Layered
0
infixxx
0 / 0 / 0
Регистрация: 31.07.2016
Сообщений: 1
01.02.2017, 23:09 #5
А на С# как не подскажете?
0
GbaLog-
Любитель чаепитий
3164 / 1470 / 465
Регистрация: 24.08.2014
Сообщений: 5,200
Записей в блоге: 1
Завершенные тесты: 2
02.02.2017, 07:43 #6
Цитата Сообщение от infixxx Посмотреть сообщение
А на С# как не подскажете?
Придётся просто переписать на лад c#.
http://www.sfml-dev.org/download/sfml.net/
0
02.02.2017, 07:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2017, 07:43

Создание окна из консольного приложения
Подскажите пожалуйста как создать окно в консольном с++

Создание диалогового окна в Dev-C++
Доброго времени суток! Только начал изучение C++ (хорошо знаю азы Delphi). Для...

Создание окна API windows
Пример взят из книги Румянцева, азбука программирования в win32 API. Должно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru