Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366

Пропадает нарисованный полигон

24.05.2013, 16:30. Показов 1722. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, может я что-то, где-то не дочитал...
Написал я функцию которая рисует полигон на моем приложении:
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
void CCircleDrawDlg::DrawPolygon()
{
    CClientDC PolygonDc(this);
    CBrush brush(RGB(0,191,255));
    CBrush* br = PolygonDc.SelectObject(&brush);
    CPoint ch[5];
 
    //Первая точка
    ch[0].x = 20;
    ch[0].y = 20;
    
    //Вторая точка
    ch[1].x = 360;
    ch[1].y = 40;
 
    //Третья точка
    ch[2].x = 220;
    ch[2].y = 310;
 
    //Четвертая точка
    ch[3].x = 70;
    ch[3].y = 200;
 
    //Пятая точка
    ch[4].x = 20;
    ch[4].y = 20;
 
    PolygonDc.Polygon(ch,5);
    PolygonDc.SelectObject(br);
}
Но при уходе окна на задний план (когда я активирую другое приложение) полигон пропадает и на форме диалога ничего нет. В чем может быть проблема
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2013, 16:30
Ответы с готовыми решениями:

Пропадает нарисованный на Canvas прямоугольник и текст в клиент-серверном приложении
Доброго времени Вам. Вопросик, возник... Короче есть клиент он: 1. Делает скриншот экрана. 2. Добавляет на него полупрозрачный...

Непонятки с Canvas: Появляется полигон и сразу же пропадает
Имеется код: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, ...

Полигон питания и полигон земли по разные стороны текстолита
Народ, подскажите плиз. Развожу тут плату одну, сделал так, что под 64-ногой TQFP есть полинон земли, к которой все земляные выводы микрухи...

15
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
06.06.2013, 00:59  [ТС]
Есть программа, исходный код которой у меня в приципе есть, но она очень большая и разбираться в ней очень проблематично, т.к. состоит она из сотни .cpp(.h) файлов. Мне нужно просто нарисовать поверх клиентской области приложения что-нибудь. Нуб рисую допустим тот же полигон, код которого приведен выше. Но он появляется за тем, что изображено в клиентской области, а мне нужно изобразить на переднем плане.
В какую сторону обратить свой взор?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
06.06.2013, 09:58
проблема в том что вы рисуете на клиентской области, когда окно уходит на задний план, или закрывается другим окном или еще чем, а потом становится активным, ему приходит сообщение о перерисовке, т.к в событии перерисовки нету вашего метода, то он не отрисовывается.
1
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
06.06.2013, 12:13  [ТС]
Да, но если я вставлю свою функцию отрисовки полигона(метод) в событие перерисовки(OnPaint()), то полигон будет появляться при первой прорисовке приложения, а не по кнопке, как мне хотелось бы.

Добавлено через 46 минут
Есть такое событие у окна как: ON_WM_ACTIVATE(), вызывается,когда окно CWnd должно быть активным или неактивным. Правда я не понимаю, что подразумевается под словом активным или неактивным, т.е. свернутым, или не свернутым?
Но, если вставить мою функцию рисования полигона в функцию вызываемую по этому событию, то полигон отлично перерисовывается после смены и возвращения фокуса на мое приложение.
Вопрос, про то как отобразить этот полигон на переднем плане в сложной программе остается открытым...
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
06.06.2013, 12:22
Цитата Сообщение от Xantrax Посмотреть сообщение
Да, но если я вставлю свою функцию отрисовки полигона(метод) в событие перерисовки(OnPaint()), то полигон будет появляться при первой прорисовке приложения, а не по кнопке, как мне хотелось бы.

Добавлено через 46 минут
Есть такое событие у окна как: ON_WM_ACTIVATE(), вызывается,когда окно CWnd должно быть активным или неактивным. Правда я не понимаю, что подразумевается под словом активным или неактивным, т.е. свернутым, или не свернутым?
активный, это когда у вас на окне стоит фокус.
тоесть если вы открыли вашу программу, и счелкните на окно с блокнотом, ваше окно станет не активным, если обратно на окно с программой, то активным.

если провести по неактивному окну вашей программы, другим окном, поидее рисунок затерется/
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
06.06.2013, 12:57  [ТС]
Т.е. вот допустим:
C++
1
2
3
4
5
6
7
void CCircleDrawDlg::OnActivate(UINT n, CWnd *t, BOOL m)
{
    if(n==WA_ACTIVE)
   {
       DrawPolygon();
   }
}
, то по SHIFT+ALT мое окно(диалог) должно прорисовывать полигон, а по активизации окна(диалога) из панели управления по щелчку мыши - не должен прорисовываться полигон?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
06.06.2013, 14:06
http://msdn.microsoft.com/ru-r... 1c334.aspx
тут вроде все ясно написано.. читайте msdn

Добавлено через 6 минут
можете еще использовать Spy++ , и увидите что когда происходит, где что затирает и т.п
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
06.06.2013, 14:51  [ТС]
можете еще использовать Spy++
SPY использую как Process Explorer, а как им пользоваться, где почитать?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
06.06.2013, 15:02
Цитата Сообщение от Xantrax Посмотреть сообщение
SPY использую как Process Explorer, а как им пользоваться, где почитать?
ну например, жмете ctr+f или найти окно, с помощью прицела выделяете нужное вам окно, на том же окошке, есть 2 радиоботана, св-ва и сообщения, выбирайте сообщения и увидете все сообщение которые обрабатывает ваше выбранное окно. исходя из этого можно делать выводы: что, где, когда вызывается и чем треться, ну и решать проблему
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
07.06.2013, 14:44  [ТС]
Хочу вернуться к своей текущей задумке, нарисовать поверх приложения что-нибудь(полигон, круг, прямую).
Т.е. в исходном коде я пишу свою функцию создания полигона в которой:
1) я получаю текущий контекст устройства;
2) создаю точки моего полигона;
3) Говорю ему нарисовать полигон (Polygon()).
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
void CMainFrame::DrawPolygon()
{
    myDC = new CDC();
    myDC = GetDC();
        CBrush brush(RGB(0,191,255));
    CBrush* br = myDC->SelectObject(&brush);
 
   
    CPoint ch[5];
 
    //Первая точка
    ch[0].x = 20;
    ch[0].y = 20;
    
    //Вторая точка
    ch[1].x = 360;
    ch[1].y = 40;
 
    //Третья точка
    ch[2].x = 220;
    ch[2].y = 310;
 
    //Четвертая точка
    ch[3].x = 70;
    ch[3].y = 200;
 
    //Пятая точка
    ch[4].x = 20;
    ch[4].y = 20;
 
    myDC->Polygon(ch,5);
    myDC->SelectObject(&br);
}
Он у меня рисуется, но за клиентской частью. Как бы мой полигон вывести на передний план?

Добавлено через 23 часа 3 минуты
Подскажите пожалуйста, я хочу чтобы каждый раз при нажатии кнопки у меня к массиву точек Cpoint ch[] прибавлялась к y координате число, ну и соответственно полигон увеличивался...
Я пишу в функции обработки нажатия кнопки:
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
void CCircleDrawDlg::OnBnClickedOk()
{
        n = 0;                                     //DWORD n;
        CPoint ch[5];
 
        //Первая точка
        ch[0].x = 20;
        ch[0].y = 20+n;
        
        //Вторая точка
        ch[1].x = 360;
        ch[1].y = 40+n;
 
        //Третья точка
        ch[2].x = 220;
        ch[2].y = 310+n;
 
        //Четвертая точка
        ch[3].x = 70;
        ch[3].y = 200+n;
 
        //Пятая точка
        ch[4].x = 20;
        ch[4].y = 20+n;
 
        DrawPolygon(ch);
        n+=5;
   
} 
 
void CCircleDrawDlg::DrawPolygon(CPoint ch[])
{
    CClientDC PolygonDc(this);
    CBrush brush(RGB(0,191,255));
    PolygonDc.SelectStockObject(&brush);
    PolygonDc.Polygon(ch,5);
    PolygonDc.SelectStockObject(BLACK_BRUSH);
}
Но у меня полигон не изменяется. Пытался как-то перерисовать окно:Invalidate(), UpdateWindow(), но что-то все без толку...
Подскажите пожалуйста, как реализовать?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
07.06.2013, 15:08
вы же к y всегда прибавляете 0
у вас в начале процедуры N скидывается в 0

=> у вас всегда 1 рисунок..
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
07.06.2013, 15:18  [ТС]
У старушка засвистела? Нет!
Согласен, дурак, переменную n, надо инициализировать нулем в OnInitDialog().
Да, но сейчас у меня рисуется куча полигонов со смещением по оси y, а как сделать, чтобы всегда рисовался 1?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
07.06.2013, 15:26
перед рисованием очищайте фон (заливаете каким либо цветом)
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
07.06.2013, 15:35  [ТС]
А как вообще удалить нарисованный полигон? Залить предыдущий полигон фоном приложения?
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
07.06.2013, 15:48
ну заливают обычно "полотно" на котором рисуется, а потом все заново отрисовывается, ну или вариант да, какую то конкретную область если ты знаешь наверняка где он
0
20 / 20 / 2
Регистрация: 28.11.2012
Сообщений: 366
07.06.2013, 16:30  [ТС]
Осталось только выяснить какими методами(методами в прямом смысле) можно получить фон клиентской части окна и залить его же... (Я думаю, нужно искать какой-нить метод у CWnd или CDialog, типа GetColor и FillRgn)...
Заранее извиняюсь, в MSDN не забанили, но оно у меня просто не работает(выдает ошибку, что Internet Explorer cannot be shown because the specified help collection 'ms-help//MS.MSDNQTR.v80.en' is invalid), так же как и VS2005 работает наполовину.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2013, 16:30
Помогаю со студенческими работами здесь

Распознать нарисованный символ
Есть некоторое изображение Img_1.ico с изображением символа 'М' как или каким образом возможно конвертировать этот символ с изображения в...

Исчезает нарисованный овал
Доброго времени суток! Столкнулся с проблемой рисования, а именно имеется label, в который выводится текст, далее нарисовал вокруг этого...

Отзывчивой календарь нарисованный в 2D
Постала задача из "Большим" календарем. Большой календарь нашел сдесь. Он отрисовывается в 2D, все супер, но мне нужно при нажатии на...

Нарисованный квадрат исчезает
Добрый день всем. Ребята подскажите пожалуйста почему нарисованный квадрат исчезает через некоторое время. { ...

Удалить нарисованный текст с Picturebox
Всем доброго времени суток! Написал на Picturebox текст. Dim StringToDraw As String = "Кликните на меня." Dim...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru