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

Создать окно с TButton и TImage (+рисование)

17.06.2009, 20:53. Показов 4614. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте...

Я больше по Делфи, но вдруг срочно понадобилось делать программу в C++...

С C++ знакомился в институте, но сами, наверное, знаете, что мало в каких институтах нормальная программа...
И знаком только с консольными приложениями (под Д.О.С.).

Вот нашел код, который создаёт окно с кнопкой, при нажатии на которую показывается диалоговое окно:
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>
 
LRESULT CALLBACK MainWinProc(HWND,UINT,WPARAM,LPARAM);
 
#define ID_MYBUTTON 1 /* èäåíòèôèêàòîð äëÿ êíîïî÷êè âíóòðè ãëàâíîãî îêíà */
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int ss)
{
    /* ñîçäàåì è ðåãèñòðèðóåì êëàññ ãëàâíîãî îêíà */
    
    WNDCLASS wc;
    wc.style=0;
    wc.lpfnWndProc=MainWinProc;
    wc.cbClsExtra=wc.cbWndExtra=0;
    wc.hInstance=hInst;
    wc.hIcon=NULL;
    wc.hCursor=NULL;
    wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName=NULL;
    wc.lpszClassName="Example 4 MainWnd Class";
    if (!RegisterClass(&wc)) return FALSE;
    
    /* ñîçäàåì ãëàâíîå îêíî è îòîáðàæàåì åãî */
    
    HWND hMainWnd=CreateWindow("Example 4 MainWnd Class","EXAMPLE4",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
    if (!hMainWnd) return FALSE;
    ShowWindow(hMainWnd,ss);
    UpdateWindow(hMainWnd);
    MSG msg;
    
    /* öèêë îáðàáîòêè ñîáûòèé */
 
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
/* ïðîöåäóðà îáðàáîòêè ñîîáùåíèé äëÿ ãëàâíîãî îêíà */
 
LRESULT CALLBACK MainWinProc(HWND hw,UINT msg,WPARAM wp,LPARAM lp)
{
    switch (msg)
    {
        case WM_CREATE:
        /* ïðè ñîçäàíèè îêíà âíåäðÿåì â íåãî êíîïî÷êó */
            CreateWindow("button","My button",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,5,5,100,20,hw,(HMENU)ID_MYBUTTON,NULL,NULL);
 
        /* ñòèëü WS_CHILD îçíà÷àåò, ÷òî ýòî äî÷åðíåå îêíî è äëÿ íåãî âìåñòî äåñêðèïòîðà ìåíþ áóäåò ïåðåäàí öåëî÷èñëåííûé èäåíòèôèêàòîð,
        êîòîðûé áóäåò èñïîëüçîâàòüñÿ äî÷åðíèì îêíîì äëÿ îïîâåùåíèÿ ðîäèòåëüñêîãî îêíà ÷åðåç WM_COMMAND */
        
        return 0;
        case WM_COMMAND:
        
        /* íàæàòà íàøà êíîïî÷êà? */
 
        if ((HIWORD(wp)==0) && (LOWORD(wp)==ID_MYBUTTON))
            MessageBox(hw,"You pressed my button","MessageBox",MB_OK|MB_ICONWARNING);
        return 0;
        case WM_DESTROY:
        /* ïîëüçîâàòåëü çàêðûë îêíî, ïðîãðàììà ìîæåò çàâåðøàòüñÿ */
            PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hw,msg,wp,lp);
}
Мне нужно ещё как-то добавить туда TImage (или как оно в C++ зовётся) и при нажатии на кнопку попиксельно рисовать рисунок и выводить его на этот TImage...

И так как скорость вывода рисунка тоже важна, было бы неплохо использовать какой-то аналог ScanLine в Делфи...
Есть ли что-то подобное в C++ ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2009, 20:53
Ответы с готовыми решениями:

Рисование TImage.
ребята может кто может помочь написать мини-программу...... КАК СДЕЛАТЬ РИСУЮЩУЮ КИСТЬ НА timage???

Рисование в TIMAGE
Добрый день.У меня графический редактор хотелось бы узнать почему после преобразования изображения в 32х32 и растягивания его попиксельно...

Рисование на TImage
Можно ли по определённым координатам нарисовать с файла ?(ну на Timage) и как это сделать.

16
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.06.2009, 01:02
Оно не в "С++ зовется", оно в WINAPI зовется. Так как ты пишешь на апи, то С++ тут не при чем. Тебе нужно прочитать документацию по виндовому элементу static, сделать ему тип соответствующий для имэйджей и делать с ним, что хочешь. Либо ты можешь рисовать картинку прямо на канве у окна. Дешево и сердито.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
18.06.2009, 01:24  [ТС]
Я же говорил - знаком только с консольными приложениями...
Я нашел код делающий окно и кнопку и совершенно не в курсе как он работает...

Мне нужно на C++...

А про ScanLine не знаете?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.06.2009, 01:42
Так если не в курсе, читать надо.
Код - чистый винапи.
http://www.dotnetheaven.com/Up... 8701e43292
http://www.firststeps.ru/cbuilder/r.php?15
Я, конечно, извиняюсь, но что мы должны сделать? За вас код засунуть в редактор и скомплировать? Создайте win32 проект, безо всяких mfc и прочей лабуды, добавьте файл, туда код рабочий. Потом Build и все готово.
Про scanline уже не помню, так как, не прогал под винду уже давно. И билдерами не пользовался.

P. S. вот что билдеры делают с прогерами. Люди так и думают, что в винде есть tbutton и timage

Добавлено через 9 минут 30 секунд
Только что прочитал про scanline. Это все на более низком уровне также может быть реализовано обычным кодом с использованием указателя буфера. Как я понимаю, вся разница в том, что scanline использует прямой доступ к цветовым данным, без вызовов функций апи. По сути, буфер и указатель. Никто не мешает использовать буфер картинки и нам. BITMAPINFOHEADER, BITMAPINFO. Находим, где в памяти данные и напрямую оттуда читаем/пишем. Вот и scanline готов. (не забудим о формате изображение/количестве байт на пиксел и т д)
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
18.06.2009, 01:49  [ТС]
P. S. вот что билдеры делают с прогерами. Люди так и думают, что в винде есть tbutton и timage
Ну... Я на чистом Делфи работаю... Там есть такие компоненты...
Я, конечно, извиняюсь, но что мы должны сделать? За вас код засунуть в редактор и скомплировать? Создайте win32 проект, безо всяких mfc и прочей лабуды, добавьте файл, туда код рабочий. Потом Build и все готово.
Создать пустой win32 проект я умею... Где находится кнопка "Скомпилировать" тоже знаю...
У меня "кода рабочего" нету...
Так как ты пишешь на апи, то С++ тут не при чем.
Может код из первого поста и "чистый винапи", но у меня задание "на C++"...

Или это одно и то же?

Говорю же - никогда не работал на этом C++...
В Делфи создание окна, TButton, TImage и обработчика нажатия на кнопку за 4 щелчка мыши делается...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.06.2009, 01:51
Ну вот, самое время научиться.
Может код из первого поста и "чистый винапи", но у меня задание "на C++"...

Или это одно и то же?
Код использующий винапи просто написан на С++. Все ок.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
18.06.2009, 02:04  [ТС]
Писать код за других людей мне не хочется.
Понимаю.....

Просто C++ не моя специализация, так сказать...

Код использующий винапи просто написан на С++. Все ок.
Хм... А окно, рисунок, кнопку и её обработчик возможно без винапи сделать?
Если "да", то мне скорее всего надо без винапи.....

Ну вот самое время научиться.
Планировал приступить к самоизучению C/C++ чуть позже, но тут понадобилось срочно переделать прогу с Делфи на C++...

Вот странно: называется Visual C++, а на деле нифига не "визуал"...
Вот в Делфи и Visual Basic всё "визуально" - вот фома, вот на неё кнопку "рисуешь" - а тут?

Может в меню надо что-то нажать, чтоб также показывалось, а я не вкурсе просто?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.06.2009, 02:08
А тут то, что учит программировать, а не формочки рисовать. То, работая с чем, будешь понимать, как работает система. Большинство программистов C++builder, delphi даже не знаю, что существует такая вещь, как winapi, сообщения и т. д.. Кошмар.
Вообще можно создать проект MFC dialog based и в нем лепить формочки.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
18.06.2009, 02:25  [ТС]
Большинство программистов C++Builder, Delphi даже не знают, что существует такая вещь, как WinApi, сообщения и.т.д. Кошмар.
Ну что вы хотите от студента, только начавшего свой путь в программировании?

Сейчас нашёл кое-где, как можно дополнить код из первого поста... Кажется также на ванапи...
Вместе вышло что-то вроде этого:

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
#include <windows.h>
LRESULT CALLBACK MainWinProc(HWND,UINT,WPARAM,LPARAM);
#define ID_MYBUTTON 1
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int ss)
{
    WNDCLASS wc;
    wc.style=0;
    wc.lpfnWndProc=MainWinProc;
    wc.cbClsExtra=wc.cbWndExtra=0;
    wc.hInstance=hInst;
    wc.hIcon=NULL;
    wc.hCursor=NULL;
    wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName=NULL;
    wc.lpszClassName="MyClass";
    if (!RegisterClass(&wc)) return FALSE;
    HWND hMainWnd=CreateWindow("MyClass","Window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
    if (!hMainWnd) return FALSE;
    ShowWindow(hMainWnd,ss);
    UpdateWindow(hMainWnd);
    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK MainWinProc(HWND hw,UINT msg,WPARAM wp,LPARAM lp)
{
    PAINTSTRUCT PaintStruct;
    HDC hDC;
    char sx[256],sy[256];
    static int fl = 0 ;
    static int fl1 = 0 ;
    static int fl2 = 0 ;
    static int fl3 = 0 ;
    POINT Coordinats;
    hDC = GetDC(hw);
    switch (msg)
    {
        case WM_CREATE:
            CreateWindow("button","My button",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,20,510,460,40,hw,(HMENU)ID_MYBUTTON,NULL,NULL);
        return 0;
        case WM_PAINT:
            hDC=BeginPaint(hw, &PaintStruct);
            int i;
            int j;
            int color;
            j=0;
            for (j=0; j<=499; j=j+1)
            {
                i=0;
                for (i=0; i<=499; i=i+1)
                {
                    color=RGB(i+i,i+j,j+j);
                    SetPixel(hDC, i, j, color);
                }
            }
            EndPaint(hw, &PaintStruct);
            return 0;
        case WM_COMMAND:
        if ((HIWORD(wp)==0) && (LOWORD(wp)==ID_MYBUTTON))
            MessageBox(hw,"You pressed my button","MessageBox",MB_OK|MB_ICONWARNING);
        return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hw,msg,wp,lp);
}
0
5 / 5 / 0
Регистрация: 21.12.2008
Сообщений: 82
18.06.2009, 06:26
AutoBot, Делай лучше на MFC там быстрее разберешься.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
19.06.2009, 00:56  [ТС]
Сделал версию и на MFC, только снова не понятно как ScanLine'ом делать...
И, кстати, как сделать чтоб рисунок на Picture не стирался при перекрытии?

Добавлено через 9 часов 20 минут 20 секунд
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.06.2009, 01:29
Выше я описал, как работает scanline. Нужно использовать буфер изображения напрямую в памяти. Или ищите аналог scanline в MFC. Но, насколько я помню, его там нет.
Нужно перерисовывать изображение в обработчике WM_PAINT, чтобы не стиралось.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
19.06.2009, 02:34  [ТС]
Я так делал:
C++
1
2
3
CWnd *pWnd = GetDlgItem(IDC_PICTURE1);
CDC *pDC = pWnd->GetWindowDC();
pDC->SaveDC();
а потом на ней рисовал...
C++
1
pDC->SetPixel(x, y, color);
Наверное надо было на временном Bitmap'е как-то делать...
Его можно будет глобально объявить?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.06.2009, 02:46
Погоди, погоди. Рисуешь-то ты в при апдейте окна? Твой код рисования должен быть в обработчике перерисовки окна. сообщение WM_PAINT называется, если память не изменяет.
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
21.06.2009, 13:54  [ТС]
При нажатии на кнопку...
Оно секунды 3-4 рисуется... Думаю в WM_PAINT оно будет слишком тормозить...

Добавлено через 25 минут 11 секунд
Я же не фон для формы делаю, а иллюстрацию...

В Делфи нарисовал что-нибудь в TImage.Canvas и всё... Оно само чтоль всё перепрорисовывает?
Скрывает всё самое интересное от меня?

Может в Делфи внутри TImage есть переменная типа Bitmap где хранится нарисованное, а при WM_PAINT оно скрытно от программистов делает что-то вроде:
Delphi
1
BitBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);


Добавлено через 11 часов 58 минут 6 секунд
Фуф... Ща сдал Физику..... Почти 3-е суток не спал...

Теперь можно будет передохнуть и нормально подумать что к чему...

Добавлено через 21 час 0 минут 9 секунд
Вот попытался глобально объявить Bitmap:
C++
1
2
3
4
5
6
7
class CMy222Dlg : public CDialog
{
// Construction
public:
    CMy222Dlg(CWnd* pParent = NULL);    // standard constructor
    HBITMAP hMyBitmap;
    CBitmap m_MyBitmap;
Я его вообще там объявил-то?)

И как связаны эти CBitmap и HBITMAP? На котором теперь рисовать?

Добавлено через 2 часа 16 минут 56 секунд
Так... С этим вроде разобрался (хотя наугад делал)...
А вот как заставить своё окно перерисоваться (как бы программно послать ему WM_PAINT)?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
21.06.2009, 14:01
В Делфи нарисовал что-нибудь в TImage.Canvas и всё... Оно само чтоль всё перепрорисовывает?
Да.
А вот как заставить своё окно перерисоваться (как бы программно послать ему WM_PAINT)?
В MFC есть уверен функция для этого (что-нибудь со словом paint), но я не помню. А так, есть sendmessage, есть updatewindow и т д
0
290 / 5 / 0
Регистрация: 17.06.2009
Сообщений: 82
21.06.2009, 14:18  [ТС]
Здесь не очень-то много помогающих нашлось...

Я уже сюда переселился: http://forum.sources.ru/index.php?showtopic=275560
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2009, 14:18
Помогаю со студенческими работами здесь

Рисование на TImage
У меня есть картинка TImage и у нее загружается *.png файл. Нужно на этой картинке нарисовать красный прямоугольник, что я и делаю: ...

Рисование эллипса на TImage
Здравствуйте! Мне нужно нарисовать эллипс на timage. Проблема в том,что мне нужно сделать так,чтобы эллипс рисовался удержанием кнопки...

Рисование прозрачностью на TImage
Доброго времени суток. Есть два TImage друг на друге. Надо изменять рисунок верхнего так, что бы образовывались прозрачные участи, что...

Рисование на TImage.Canvas
Добрый день! возникла следующая проблема: На форме добавлен компонент TImage. Свойство TImage.Align = alClient; при создании формы...

TImage:рисование линий
проблема такого характера: 1)нужно с помощю мыши нарисовать линию. 2)высчитать длину линии в пикселях Подскажите как это...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru