Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по цвет для кнопки  (Прочитано 28275 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline Offline

« : 12-05-2005 21:09 » 

Как в Visual C++ сделать кнопки и надписи на них др. цвета.
Есть ctrlcolor, только он почему то меняет цвета statica , dialoga, edit и т.д. а кнопки не меняет хотя должен.
У меня VStudio.NET(2003)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 12-05-2005 23:22 » 

Поставь Owner Draw - true
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #2 : 19-05-2005 22:20 » 

Закинул аттач 4 кб.

* knopka.rar (3.87 Кб - загружено 1256 раз.)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 20-05-2005 09:39 » 

Ну дык, я же сказал - для кнопок это функционирует только если установлен стиль Owner Draw.
В редакторе ресурсов - свойства кнопки на 2 странице второй CheckBox сверху должен быть включен.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #4 : 21-05-2005 20:11 » 

В смысле второй чекбокс?
Я его включал, только на месте кнопки почему-то черный прямоугольник - но работает как кнопка
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 22-05-2005 21:40 » 

ЭТо и есть кнопка, а чёрный цвет ты сам задаёшь:
m_pEditBkBrush = new CBrush(RGB(0, 0, 0));
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #6 : 23-05-2005 20:17 » 

Ладно, проверю. А можно готовый сорц?
И еще, Допустим создается окно с помощбю WinAPI. Можно тут кнопке цвет задать? И как Шрифт в окне усиановить с помощбю WinAPI?
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #7 : 23-05-2005 20:54 » 

Спасибо Джон! А я мимо ушей вторую функцию пропустил. Цвет кнопки поменялся, только теперь шрифта (надписи ОК) не видно. Как ему задать цвет? И можно ли поменять цвет бордюра кнопки?
И еще, как при создании окна с помощью WinAPI CreateWindow установить его (окно) по центру экрана?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 23-05-2005 21:27 » 

Ок, к сожалению коротенько. Значица так, если хочешь что-то сделать, то рисуй сам. API располагает только классами находящимися например в библиотеке comctrl. В них используются настройки винды - для цвета и тд. Это с одной стороны хорошо - при смене настроек всё меняется одинково. Но если ты хочешь делать действительно свой интерфейс, который не "линяет" ни при каких обстоятельствах, то для этого есть ф-ции например обработчик OnPaint (WM_PAINT).  Если ты заметил, то у твоей кнопки бордюра тоже нет. Вот тут есть очень хороший пример, как самому сделать цветные кнопки.
Попробуй для начала сам разобраться, а что не понятно будет - спросишь.
http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169/

2. Для перемещения окна есть ф-я SetWindowPos

HWND hwnd = CreateWindow(...);

для начала тебе надо определить размеры экрана
         HDC hDCScreen = ::GetDC(NULL);
         int nHorRes = ::GetDeviceCaps(hDCScreen, HORZRES);
         int nVerRes = ::GetDeviceCaps(hDCScreen, VERTRES);
         ::ReleaseDC(NULL, hDCScreen);
         int nW = ширина твоего окна;
         int nH = высота твоего окна;
         // определяем координату левого верхнего угла
         int x1= nHorRes/2 - nW/2;
         int y1= nVerRes/2 - nH/2;
            ::SetWindowPos(hwnd, HWND_TOP,x1,y1,nW,nH,0);
примерно так.

Код не компилировал возможны ошибки.

У тебя вообще-то MSDN есть?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #9 : 23-05-2005 21:43 » 

MSDN есть только читать на англ тяжко
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 23-05-2005 21:50 » 

Нееее, его всего читать не надо. Это справочник, чтоб подглядывать - я просто тебе буду тогда ссылки давать в нём по теме. По большому счёту необходимо знать ф-ции и их параметры.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #11 : 24-05-2005 20:21 » 

Как через WM_SETFONT передать окну хендл шрифта, т.е. что конкретно передать? Где сидит этот хендл шрифта и с чем его едят?
Можно ли при создании окна, а конкретно при заполнении WNDCLASS вместо "hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH)"
установить цвет по желанию?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 24-05-2005 20:52 » 

У тебя какой проект? API или MFC?
Что значит "при заполнении WNDCLASS"?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
monrus
Опытный

ru
Offline Offline

« Ответ #13 : 25-05-2005 20:20 » 

Теперь только API. WNDCLASS - класс окна.
У меня вопросов куча. Спасибо, что интересуешся!
Вот еще пара:
Почему не выводится картинка в окно? см. файл.

Как нарисовать прямоугольник и через каждые 5 секунд менять его положение? И можно ли задать сообщения при наведении мыши на этот прямоугольник?

* Bitmap.rar (5.41 Кб - загружено 971 раз.)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #14 : 25-05-2005 20:57 » 

monrus
Цитата
Можно ли при создании окна, а конкретно при заполнении WNDCLASS вместо "hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH)"
установить цвет по желанию?
Вот что говорит MSDN
Цитата
hbrBackground

Identifies the class background brush. This member can be a handle to the physical brush to be used for painting the background, or it can be a color value. A color value must be one of the following standard system colors (the value 1 must be added to the chosen color). If a color value is given, you must convert it to one of the following HBRUSH types:

COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT

 

The operating system automatically deletes class background brushes when the class is freed. An application should not delete these brushes, because a class may be used by multiple instances of an application.
When this member is NULL, an application must paint its own background whenever it is requested to paint in its client area. To determine whether the background must be painted, an application can either process the WM_ERASEBKGND message or test the fErase member of the PAINTSTRUCT structure filled by the BeginPaint function.
т.е. кисточку ты можеш в принципе сам сделать.
Например hbrBackground=CreateSolidBrush(RGB(255,25,25));
Если ты задаш  NULL. То ты сможеш сам рисовать фон, реализуя  сообшение WM_ERASEBKGND.

Цитата
Как нарисовать прямоугольник и через каждые 5 секунд менять его положение? И можно ли задать сообщения при наведении мыши на этот прямоугольник?
Нарисовать в произвольном месте или внутри формы?
Если в произвольном месте, тогда просто это будет окошко со стилем WS_POPUP. Все окна которые имеют собственный хэндл могут получать сообшения от мыши. Менять положение через пять секунд можно. Ставится таймер на 5 секунд. и меняеш.
« Последнее редактирование: 25-05-2005 20:59 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
monrus
Опытный

ru
Offline Offline

« Ответ #15 : 25-05-2005 21:04 » 

Хочу создать внутри формы что-то типа Rectangle(x,x,x,x). Но на выходе BOOL. А как получить дескриптор?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 25-05-2005 21:10 » 

Если ты будеш создавать через CreateWindow, То ты получиш свой хэндл окна. Если будеш как-то прорисовывать минуя данную команду. Тогда сообшение нужно будет транслировать из родительского окна. В Borland VCL это примерно так и сделано. Там есть две ветки визуальных компонентов. Одна имеет хэндл, вторая нет. И сообшения транслируются из родительских окон.
« Последнее редактирование: 25-05-2005 21:13 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 25-05-2005 21:11 » 

Цитата
Как нарисовать прямоугольник и через каждые 5 секунд менять его положение?
Для этого тебе подойдет SetTimer(), в качестве одного из параметров задай 5000 и получится что каждые 5 секунд (праметр-время в милисекундах).
Эта функция создает или видоизменяет системный таймер, по сути (боюсь сказать некорректно) она формирует посылку сообщения WM_TIMER указанному окну (ты указываешь хендл окна) через указанный промежуток времени. По сути, как я понимаю, тебе  надо написать обработчик события WM_TIMER (в твоем случае ты там меняешь координаты треугольника) и затем вызвать SetTimer().SetTimer  как ты уже догадался будет посылать сообщение WM_TIMER и соответственно будет вызываться твой обработчик.После того, как надо будет остановить движение треугольника вызови KillTimer();
По честности в АПИ я не реализовывал это, я это делал в МФЦ, но если подождешь дня 2, то скину пример, т.к. мне скоро самому это делать придется, кстати тоже приходится треугольники по форме гонять Улыбаюсь.
зы: когда запостился, то увидил, что тут до меня много ответов пришло, извините если повторил кого-то
« Последнее редактирование: 25-05-2005 21:14 от nikedeforest » Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #18 : 25-05-2005 21:18 » 

nikedeforest, есть два пути у этой функции
Цитата
The SetTimer function creates a timer with the specified time-out value.

UINT SetTimer(

    HWND hWnd,   // handle of window for timer messages
    UINT nIDEvent,   // timer identifier
    UINT uElapse,   // time-out value
    TIMERPROC lpTimerFunc    // address of timer procedure
   );   
 

Parameters

hWnd

Identifies the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.

nIDEvent

Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.

uElapse

Specifies the time-out value, in milliseconds.

lpTimerFunc

Points to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc.
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter.

 

Return Values

If the function succeeds, the return value is an integer identifying the new timer. An application can pass this value, or the string identifier, if it exists, to the KillTimer function to destroy the timer. If the function fails to create a timer, the return value is zero.

Remarks

An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the DispatchMessage function simply calls the callback function instead of the window procedure. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

The wParam parameter of the WM_TIMER message contains the value of the nIDEvent parameter
Если четвертый параметр поставить NULL тогда будет посылаться WM_TIMER. И наче будет вызываться функция обратного вызова.
Сразу предупрежу. эта функция не точна. она приблизительно дает промежутки.
« Последнее редактирование: 20-12-2007 19:39 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
monrus
Опытный

ru
Offline Offline

« Ответ #19 : 25-05-2005 21:59 » 

Создаю ч\з CreateRectIndirect. Можно ли на нем реализовывать сообщения?
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 25-05-2005 22:03 » 

Цитата
Сразу предупрежу. эта функция не точна. она приблизительно дает промежутки.
Я помню, кто-то на этом форуме пытался точное время заставить выдавать   Вот такой я вот, но для треугольников, ИМХО, такая точность не нужна Улыбаюсь.
А параметры функции я читал, просто мне кажется я предложил, то что monrus'у нужно на данный момент, чтобы особо не загоняться, наиболее просто и удобно, но хозяин барин, теперь-то уж он может выбирать Улыбаюсь.
« Последнее редактирование: 20-12-2007 19:42 от Алексей1153++ » Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #21 : 26-05-2005 09:57 » 

monrus, скорее всего ты используеш CreateRectRgnIndirect, а не CreateRectIndirect. Эта функция просто создает регион. При этом этот регион не требует никакой работы для системы. Естественно он не будет получать никаких сообшений от системы. Вся ответственность за дальнейшую работу будет лежать на окне, которое является родителем данного региона. В окне должен быть прописан алгоритм для работы с твоим регионом.
При создании окна при помоши CreateWindow, ты регистрируеш в системе окно. И говориш системе, что для окна требуется обслуживание. Твои заботы только будут правильно воспринимать все сообшения системы. Большинство сообшений отрабатываются по умолчанию, если тебе не нравится функция по умолчанию, ты можеш перехватывать сообшение.
« Последнее редактирование: 26-05-2005 09:58 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines