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
Вот что примерно должно получиться:
Всего доброго!
содержание | назад | вперед