API и FreeBasic. (дочерние окна-календарь)

Контролы классов: SysMonthCal32 и SysDateTimePick32 представляют собой календари. В первом случае календарь визуально отображен, во втором спрятан, таким образом экономя место. В создании практически нет никаких отличий по отношению к уже рассмотренным контролам. И все же такие контролы как календари, combobox, listbox, и еще несколько других требуют на системе Windows XP подгрузки функции InitCommonControls() , описание которой находится в файле commctrl.bi   Если вы работаете под системой Windows 7 , то инициализировать данную функцию не обязательно.

Основные на мой взгляд используемые сообщения с контролом-это получение и установка даты и времени. Для этих действий можно применить сообщения DTM_GETSYSTEMTIME и DTM_SETSYSTEMTIME. Все же используемые сообщения можете найти здесь При отправке этих сообщений в одном из параметров необходимо передавать адрес структурированной переменной SYSTEMTIME. Именно из\в нее получают\устанавливают результат.

Пример:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
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
    Static As HWND SM,SMD
    Select Case msg
        Case WM_DESTROY
            PostQuitMessage(0)
        Case WM_CREATE
            SM=CreateWindowEx( WS_EX_CLIENTEDGE, "SysMonthCal32", "",WS_VISIBLE Or WS_CHILD,10,10,200,200, hwnd, Cast(HMENU,1), 0, 0)
            SMD=CreateWindowEx(0, "SysDateTimePick32", "",WS_VISIBLE Or WS_CHILD,220,30,80,20, hwnd, Cast(HMENU,2), 0, 0)
            CreateWindowEx(0, "button", "Получить дату",WS_VISIBLE Or WS_CHILD Or BS_MULTILINE,220,60,90,40, hwnd, Cast(HMENU,3), 0, 0)
            CreateWindowEx(0, "button", "Установить дату",WS_VISIBLE Or WS_CHILD Or BS_MULTILINE,220,110,90,40, hwnd, Cast(HMENU,4), 0, 0)
        Case WM_COMMAND
            Dim ST As SYSTEMTIME
            Select Case Loword(wParam)
                Case 3
                    SendMessage(SM,DTM_GETSYSTEMTIME,0,Cast(LPARAM,@ST))
                    MessageBox(0,ST.wyear & ":" & ST.wmonth & ":" & ST.wday,"",0)
                Case 4
                    ST.wYear=2000
                    ST.wmonth=1
                    ST.wday=1
                    SendMessage(SMD,DTM_SETSYSTEMTIME,0,Cast(LPARAM,@ST))
            End Select
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
' Заполнение структуры WNDCLASSEX
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,"Календари",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,340,260,0,0,Hinst,0)
' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend

Вот что примерно должно получиться:

cal_api.png

Всего доброго!

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