monrus
Опытный
Offline
|
|
« : 12-05-2005 21:09 » |
|
Как в Visual C++ сделать кнопки и надписи на них др. цвета. Есть ctrlcolor, только он почему то меняет цвета statica , dialoga, edit и т.д. а кнопки не меняет хотя должен. У меня VStudio.NET(2003)
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #2 : 19-05-2005 22:20 » |
|
Закинул аттач 4 кб.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #4 : 21-05-2005 20:11 » |
|
В смысле второй чекбокс? Я его включал, только на месте кнопки почему-то черный прямоугольник - но работает как кнопка
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #6 : 23-05-2005 20:17 » |
|
Ладно, проверю. А можно готовый сорц? И еще, Допустим создается окно с помощбю WinAPI. Можно тут кнопке цвет задать? И как Шрифт в окне усиановить с помощбю WinAPI?
|
|
|
Записан
|
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #7 : 23-05-2005 20:54 » |
|
Спасибо Джон! А я мимо ушей вторую функцию пропустил. Цвет кнопки поменялся, только теперь шрифта (надписи ОК) не видно. Как ему задать цвет? И можно ли поменять цвет бордюра кнопки? И еще, как при создании окна с помощью WinAPI CreateWindow установить его (окно) по центру экрана?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #9 : 23-05-2005 21:43 » |
|
MSDN есть только читать на англ тяжко
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #11 : 24-05-2005 20:21 » |
|
Как через WM_SETFONT передать окну хендл шрифта, т.е. что конкретно передать? Где сидит этот хендл шрифта и с чем его едят? Можно ли при создании окна, а конкретно при заполнении WNDCLASS вместо "hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH)" установить цвет по желанию?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Опытный
Offline
|
|
« Ответ #13 : 25-05-2005 20:20 » |
|
Теперь только API. WNDCLASS - класс окна. У меня вопросов куча. Спасибо, что интересуешся! Вот еще пара: Почему не выводится картинка в окно? см. файл.
Как нарисовать прямоугольник и через каждые 5 секунд менять его положение? И можно ли задать сообщения при наведении мыши на этот прямоугольник?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Опытный
Offline
|
|
« Ответ #15 : 25-05-2005 21:04 » |
|
Хочу создать внутри формы что-то типа Rectangle(x,x,x,x). Но на выходе BOOL. А как получить дескриптор?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #16 : 25-05-2005 21:10 » |
|
Если ты будеш создавать через CreateWindow, То ты получиш свой хэндл окна. Если будеш как-то прорисовывать минуя данную команду. Тогда сообшение нужно будет транслировать из родительского окна. В Borland VCL это примерно так и сделано. Там есть две ветки визуальных компонентов. Одна имеет хэндл, вторая нет. И сообшения транслируются из родительских окон.
|
|
« Последнее редактирование: 25-05-2005 21:13 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
nikedeforest
|
|
« Ответ #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
Спокойный
Администратор
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
Опытный
Offline
|
|
« Ответ #19 : 25-05-2005 21:59 » |
|
Создаю ч\з CreateRectIndirect. Можно ли на нем реализовывать сообщения?
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #20 : 25-05-2005 22:03 » |
|
Сразу предупрежу. эта функция не точна. она приблизительно дает промежутки.
Я помню, кто-то на этом форуме пытался точное время заставить выдавать , но для треугольников, ИМХО, такая точность не нужна . А параметры функции я читал, просто мне кажется я предложил, то что monrus'у нужно на данный момент, чтобы особо не загоняться, наиболее просто и удобно, но хозяин барин, теперь-то уж он может выбирать .
|
|
« Последнее редактирование: 20-12-2007 19:42 от Алексей1153++ »
|
Записан
|
ещё один вопрос ...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #21 : 26-05-2005 09:57 » |
|
monrus, скорее всего ты используеш CreateRectRgnIndirect, а не CreateRectIndirect. Эта функция просто создает регион. При этом этот регион не требует никакой работы для системы. Естественно он не будет получать никаких сообшений от системы. Вся ответственность за дальнейшую работу будет лежать на окне, которое является родителем данного региона. В окне должен быть прописан алгоритм для работы с твоим регионом. При создании окна при помоши CreateWindow, ты регистрируеш в системе окно. И говориш системе, что для окна требуется обслуживание. Твои заботы только будут правильно воспринимать все сообшения системы. Большинство сообшений отрабатываются по умолчанию, если тебе не нравится функция по умолчанию, ты можеш перехватывать сообшение.
|
|
« Последнее редактирование: 26-05-2005 09:58 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|