Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/41: Рейтинг темы: голосов - 41, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 5

Рисование в CDialog (MFC)

19.04.2011, 03:06. Показов 8616. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто нибудь подскажите как узнать HWND диалога или любого его элемента

А вообще мне нужно как-то при нажатии кнопки создавать окно в которое выводится графика.Я так понимаю сначала надо узнать хендл окна, потом получит контекст для него и тогда можно рисовать в него через GDI или DirectDraw. На форуме я нашел несколько похожих тем но что-то не догнал как это делать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2011, 03:06
Ответы с готовыми решениями:

MFC CDialog
Простейший случай - подключаю диалог к SDI. При компиляции не видит класс диалога, хотя по нажатию точки выдает список его элементов ... ...

MFC, CDialog, перехват координат курсора мышки
Всем добрый день. Есть задача перехватить координаты курсора мышки внутри окна и за пределами диалогового окна. Исследую данную...

VC++ 6.0 (MFC) Dialog, : public CDialog - Как иниц-ть событие создания окна диалога?
Visual C++ 6.0 SP5 MFC - простой диало созданный встроенным мастером в общем мне нужно как диалог со всеми кнопками вырисовался...

8
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
20.04.2011, 03:56
Для получения HWND далога:
C++
1
::GetDlgItem(HWND hDlg,int Id);
hDlg - HWND диалога
Id - id элемента в диалоге
В MFC у класса CWnd (CDialog) просто GetDlgItem(int id);
HWND самого диалога - переменная m_hWnd

Рисование:
C++
1
2
3
HDC hdc=::GetDC(m_hWnd);//CDC *dc=GetDC();
//рисуем
ReleaseDC(m_hWnd,hdc);//ReleaseDC(dc);
По поводу Вашей задачи давайте код - разберёмся.
0
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 5
20.04.2011, 14:50  [ТС]
Большое спасибо за объянение это именно то что я хотел узнать. Вообще надо в диалоге на элементе Picture вывести график. Сейчас поработаю с кодом и определю новые проблемы.
0
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
20.04.2011, 18:11
Я бы порекомендовал присмотреться к событию WM_PAINT методу OnPaint, познакомится с ними и понять для чего они предназначены, прежде чем приступать к решению поставленной перед Вами задачи.

С уважением,
Владимир
0
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 5
23.04.2011, 21:03  [ТС]
Сообщение WM_PAINT поступает приложению когда необходимо перерисовать часть или все окно. Это бывает нужно когда часть или все целиком окно приложения перекрывается другим окном. Соответственно в метод OnPaint нужно вставить функцию перерисовывающую заново все что мы вывели в окно. У меня с этим проблем вреде пока нет (в смысле оно перерисовывается нормально). Вопрос в другом
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
CWnd wnd=GetDlgItem(IDC_STATIC1);//узнаем hwnd окна
CDC cDC=GetDC(wnd);//узнаем DC
RECT rect;//создаем структуру для хранения границ окна
CPen pen;//создаем перо для рисования
CBrush brush;//создаем кисть для рисования
 
wnd->GetClientRect(&rect);//определяем границы окна
 
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));//инициализирум сплошное перо толщиной в 1 пиксел белого цвета
 
brush.CreateSolidBrus(RGB(0,0,0));//инициализируем кисть черного цвета
 
CBrush *OldBrush=cDC->SelectObject(&brush)//выбираем кисть в DC, сохраняя указатель на старый объект
 
cDC->Rectangle(&rect);//заливаем окно выбранной в контекст кистью
 
CPen OldPen=cDC->SelectObject(&pen);//выбираем в контекст перо, сохраняя указатель на старое
 
cDC->MoveTo(rect.right-40,0);//переносим перо в верхний правый угол на 40 пикселей не доходя до границы окна
сDC->LineTo(rect.right-40,rect.bottom);//чертим белую вертикальную линию
 
cDC->SelectObject(OldPen);//освобождаем перо из контекста
 
pen.DeleteObject();//удаляем перо
 
pen.CreatePen(PS_DASH,1,RGB(255,0,0);//создаем пунктирное перо красного цвета
 
cDC-SelectObject(&pen);//выбираем его в контекст (т.к. значение старого уже записано в OldPen не имеет смысла присваивать его заново)
 
cDC->MoveTo(0,rect.bottom2);//ставим перо слева по середине окна(то что [rect.bottom2] может не быть челым числом не важно это проверяется и округляется строчкой раньше
cDC->Lineto(rect.right,rect.bottom2);//проводим пунктирную красную горизонтальную линию
 
сDC->SelectObject(OldPen);//выбираем старое перо
cDC->SelectObject(OldBrush);//выбираем старую кисть
 
//т.к. делается все в MFC диалоге нет смысла вызывать 
//Pen.DeleteObject();
//Brush.DeleteObject();
 
wnd->ReleaseDC(cDC);//освобождаем DC
Проблема в том что проводится не КРАСНО-ЧЕРНАЯ пунктирная линия а КРАСНО-БЕЛАЯ т.е. пропуски линии не окрашиваютя в цвет фона (ЧЕРНЫЙ)
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
23.04.2011, 22:30
Поставте перед рисованием пунктирной линии:
C++
1
cDC->SetBkMode(TRANSPARENT);
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
24.04.2011, 02:07
Если надо сделать пунктир двух цветов,к примеру красно-жёлтый,то
C++
1
2
cDC->SetBkMode(OPAQUE);
cDC->SetBkColor(RGB(255,255,0));
0
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 5
24.04.2011, 03:06  [ТС]
Спасибо, работает но всвязи с этим появляется еще один вопрос. Я не могу понять как правильно передать все параметры функции CreatePen c 5 параметрами. В частности дойдя до структуры LOGBRUSH не могу правильно ее определить. Насколько я понял поля структуры являются ссылками на другие структуры(и так не один раз). Всеэто вместе должно обеспечивать практически любую конфигуряцию пера вплоть до определяемых пользователем DIB массивов в разумных пределах(они же BMP файлы на диске как я понял). Например, меня не устраивает набор стандартных стилей мне бы хотелось создать свой стиль напоминающий PS_DOT но с большим расстоянием между точками. Упоминания о том что это возможно, я в инете нашел, вроде бы даже не надо создавать отдельный ресурс (как для заливки узором кистью) но как это реализовать все равно не пойму !!!
0
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 5
27.04.2011, 01:46  [ТС]
Спасибо всем. Ответ дал wiwiw c форума на www.realcoding.net . Выкладываю его здесь вдруг кому еще пригодится.
C++
1
2
3
4
5
6
7
8
LOGBRUSH *lb;
LOGBRUSH lb = { BS_SOLID, RGB(100,100,100),0};//цвет, стиль
 
DWORD arr[2];
arr[0]=2;//полоски
arr[1]=5;//промежутки
 
Pen.CreatePen(PS_USERSTYLE,1,&lb,2,arr);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2011, 01:46
Помогаю со студенческими работами здесь

функция Get Document не работает в CDialog. как получить документ в CDIalog
пишу прогу на DOc/view в MFc. есть обычный диалог с кнопкой. при нажатии на кнопку хочу получить указатель на документ используя функцию...

Рисование в MFC
Рисую я так: dc->elipce(x1, x2, y1, y2); А как изменить цвет этого элипса? Мне посоветовали такие функции: CPen...

Рисование фигур в MFC
Мне надо сделать лабу - в окошке заставить двигаться фигуры, поражденные друг от друга. Иерархия такая: точка -> треугольник ->...

Рисование в окне (mfc c++)
Задание: разработать программу, позволяющую рисовать эллипсы в окне мышью. Предусмотреть в меню Undo, Redo и Del all. С помощью...

C++ mfc рисование двадцатиугольника
Здравствуйте ! Нужно создать программу которая будет считывать данные (в случайном порядке) из файла с координатами вершин выпуклого...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru