API и FreeBasic. (Цвета контролов, часть первая)
В этой статье дошла очередь до изменения внешнего вида контролов с помощью банального изменения их цвета. Хочется заметить, что у некоторых контролов это делается очень просто, у других чуть сложнее, а например у стандартных кнопок изменить цвет можно только рисуя ее полностью вручную при помощи стиля BS_OWNERDRAW (если интересно здесь пример).
И так начнем с тех контролов, у которых замена цвета устанавливается с помощью функции SendMessage с отправкой определенных сообщений.
Замена цветов фона и текста редактора RichEdit
Для установки фона достаточно отправить сообщение EM_SETBKGNDCOLOR , при этом если в параметре WPARAM будет передано значение FALSE , то в параметре LPARAM можно передать константу , определяющую цвет. Если в параметре WPARAM значение TRUE, то будет использоваться системный цвет(фон окна). Например:
' красим фон белым цветом
SendMessage(hwndRichEdit,EM_SETBKGNDCOLOR,FALSE,&hFFFFFF)
Для установки цвета текста нужно заполнить структуру CHARFORMAT и отправить сообщение EM_SETCHARFORMAT . При этом в параметре WPARAM нужно передать одну (или несколько объединенных) констант , а в параметре LPARAM указатель на структуру. Например:
' красим весь текст зеленым цветом Dim cf As CHARFORMAT cf.cbSize = Sizeof(cf) cf.dwMask = CFM_COLOR cf.crTextColor = &h00FF00 SendMessage(hwndRichEdit , EM_SETCHARFORMAT , SCF_ALL , Cast(LPARAM,@cf))
Замена цветов фона и текста TOOLTIP
Для замены цвета нужно отправить одно из ниже перечисленных сообщений:
TTM_SETTIPBKCOLOR - цвет фона
TTM_SETTIPTEXTCOLOR - цвет текста
При этом в параметре WPARAM передать константу , определяющую нужный цвет. Например:
SendMessage(hwndToolTip,TTM_SETTIPBKCOLOR,&hff,0)
Замена цвета фона StatusBar
У этого контрола стандартными средствами меняется только фон с помощью сообщения SB_SETBKCOLOR. Константа с указанным цветом передается в параметре LPARAM. Например:
SendMessage(hwndToolTip,SB_SETBKCOLOR,0,&hB385)
Замена цветов фона и индикатора ProgressBar
PBM_SETBKCOLOR - цвет фона (константа необъявлена в FB
0.24)
TTM_SETTIPTEXTCOLOR - цвет индикатора
Для объявления константы PBM_SETBKCOLOR можно использовать этот код:
#DEFINE PBM_SETBKCOLOR 8193
Константа с цветом передается в параметре LPARAM, например:
SendMessage(hwndProgress,SB_SETBKCOLOR,0,&h0)
Замена цветов фона и текста ListView
LVM_SETBKCOLOR - цвет фона окна контрола
LVM_SETTEXTBKCOLOR - цвет фона
текста
LVM_SETTEXTCOLOR - цвет текста
Константа с цветом передается в параметре LPARAM, например:
SendMessage(hwndListView,LVM_SETTEXTCOLOR ,0,&hA066)
Замена цветов фона и текста TreeView
TVM_SETBKCOLOR - цвет фона
TVM_SETTEXTCOLOR - цвет текста
Константа с цветом передается в параметре LPARAM, например:
SendMessage(hwndTreeView,TVM_SETBKCOLOR ,0,&hff)
Замена цветов у календарей
MCM_SETCOLOR - универсальное сообщение для замены 6 частей календаря
Константа с цветом передается в параметре LPARAM. В параметре WPARAM указывается константа, соответствующая той части, у которой следует изменить цвет:
MCSC_BACKGROUND - задний фон
MCSC_MONTHBK - фон отображения окна
месяцев
MCSC_TEXT - цвет текста окна месяцев
MCSC_TITLEBK - фон заголовка
окна года
MCSC_TITLETEXT - цвет текста окна года
MCSC_TRAILINGTEXT - цвет
текста дней, которые не являются днями текущего месяца
SendMessage(hwndCalendar,MCM_SETCOLOR,MCSC_TRAILINGTEXT,&h00ff00)
Замена цветов вышеуказанными способами может быть выполнена из любого места в программе. Изменения цветов остальных контролов в следующей части. Напоследок рабочий пример изменения цветов RichEdit:
#INCLUDE "windows.bi" #INCLUDE "win/commctrl.bi" #INCLUDE "win/richedit.bi" LoadLibrary "RICHED20.DLL" Dim msg As MSG Dim As WNDCLASSEX wc Dim As String NameClass="MyClass" Dim As HINSTANCE Hinst=GetModuleHandle(0) Function wndproc(hwnd As HWND, msg As Uinteger,_ wparam As WPARAM, lparam As LPARAM) As Integer Select Case msg Case WM_DESTROY PostQuitMessage(0) Case WM_CREATE Var hwndRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "RICHEDIT20A", "Изменение цвета в RichEdit Control",_ WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_MULTILINE Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL,_ 10,10,250,140, hwnd, Cast(HMENU,1), 0, 0) ' красим фон черным цветом SendMessage(hwndRichEdit,EM_SETBKGNDCOLOR,FALSE,&h0) ' красим весь текст Dim cf As CHARFORMAT cf.cbSize = Sizeof(cf) cf.dwMask = CFM_COLOR cf.crTextColor = &h7F5FdF SendMessage(hwndRichEdit , EM_SETCHARFORMAT , SCF_ALL , Cast(LPARAM,@cf)) ' красим диапазон текста с 6 по 12 символы Dim ch As CHARRANGE ch.cpMin = 5 ch.cpMax = 12 SendMessage(hwndRichEdit,EM_EXSETSEL,0,Cast(LPARAM,@ch)) cf.cbSize = Sizeof(cf) cf.dwMask = CFM_COLOR cf.crTextColor = &hFF0000 SendMessage(hwndRichEdit , EM_SETCHARFORMAT , SCF_SELECTION, Cast(LPARAM,@cf)) End Select Return DefWindowProc(hwnd,msg,wparam,lparam) End Function With wc .cbSize=SizeOf(WNDCLASSEX) .style=CS_HREDRAW Or CS_VREDRAW .lpfnWndProc=@wndproc .hInstance=Hinst .hIcon=LoadIcon(0,IDI_WINLOGO) .hCursor=LoadCursor(0,IDC_ARROW) .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME) .lpszClassName=StrPtr(NameClass) .hIconSm=.hIcon End With If RegisterClassEx(@wc)=0 Then Print "Register error, press any key" Sleep End Endif CreateWindowEx(0,NameClass,"Изменение цвета в RichEdit",_ WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,290,200,0,0,Hinst,0) While GetMessage(@msg,0,0,0) TranslateMessage(@msg) DispatchMessage(@msg) Wend
содержание | назад | вперед