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


changecolorrichedit.png

содержание | назад | вперед