FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 18. Common Control'ы.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

 

Реклама:

тут

Мы узнаем, что такое common control'ы и как их использовать. Этот туториал является не более, чем поверхностным введением в данную тему.

Теория:

Windows 95 принесла несколько новых элементов пользовательского интерфейса, сделавших GUI более разнообразным. Некоторые из них широко использовались и в Windows 3.1, но программисты должны были программировать их самостоятельно. Теперь Микрософт включил их в Windows 9x и NT. Мы изучим их в этом туториале.

Вот список новых контролов:

• Toolbar
• Tooltip
• Status bar
• property sheet
• property page
• Tree view
• List view
• Animation
• Drag list
• Header
• Hot-key
• Image list
• progress bar
• Right edit
• Tab
• Trackbar
• Up-down

Так как новых контролов довольно много, их загрузка в память и регистрация была бы бессмысленной тратой ресурсов. Все эти элементы управления, за исключением rich edit'а, находятся в comctl32.dll, чтобы приложения могли загружать их, когда они им нужны. Rich edit находится в своей собственной dll, richedXX.dll, так как он слишком сложен и поэтому больше, чем остальные.

Вы можете вызвать comctl32.dll, поместив вызов функции InitCommonControls в вашу программу. InitCommonControls - это функция в comctl32.dll, поэтому ее вызов в любом месте вашего кода заставит PE-загрузчик загрузить comctl32.dll, когда ваша программа запустится. Вам не нужно выполнять эту функцию, просто поместите ее где-нибудь. Эта функция ничего не делает! Ее единственной инструкцией является "ret". Ее главная цель - это создание ссылки на comctl32.dll в секции импорта, чтобы PE-загрузчик загружал ее всегда, когда будет загружаться программа. Главным следствием будет являться то, что стартовая функция DLL зарегистрирует все классы common control'ов при загрузке dll. Common control'ы создаются на основе этих классов, как и другие дочерние элементы окон, например, edit control, listbox и так далее.

С rich edit'ом дел обстоит совершенно по другому. Если вы хотите использовать его, вы должны вызвать LoadLibrary, чтобы загрузить его и FreeLibrary, чтобы выгрузить. Теперь давайте научимся создавать common control'ы. Вы можете использовать редактор ресурсов, чтобы внедрить их в диалоговое окно, или создать их самостоятельно. Почти все common control'ы создаются с помощью вызова CreateWindowEx или CreateWindow, путем передачи имени класса контрола. У некоторых common control'ов есть специальные функции для создания, хотя, на самом деле, они являются функциями-обвертками вокруг CreateWindowEx, чтобы сделать создание элемента управления легче. Такие функции перечислены ниже:

• CreateToolbarEx
• CreateStatusWindow
• CreatepropertySheetpage
• propertySheet
• ImageList_Create

Чтобы создавать common control'ы, вы должны знать их имена. Они перечисленны ниже:

Class Name Common Control

Имя класса Common Control'ы

ToolbarWindow32 Toolbar

tooltips_class32 Tooltip

msctls_statusbar32 Status bar

SysTreeView32 Tree view

SysListView32 List view

SysAnimate32 Animation

SysHeader32 Header

msctls_hotkey32 Hot-key

msctls_progress32 progress bar

RICHEDIT Rich edit

msctls_updown32 Up-down

SysTabControl32 Tab


property sheet'ы и property page'ы и контрол image list имеют собственные функции создания. Drag list control - это усовершенствованный listbox, поэтому у него нет своего собственного класса. Вышеприведенные имена проверены путем проверки скриптов ресурсов, генерируемых редактором ресурсов, входящего в Visual C++. Они отличаются от имен, приведенных в справочнике по Win32 API от Borland'а и тех, что указаны в книге Charles рetzold's "programming Windows 95". Вышеприведенный список является точной версией.

Эти common control'ы могут использовать общие стили окна, такие как WS_CHILD и т.п. У них также есть специальные стили, такие как TVS_XXXXX для tree view control'а, LVS_xxxx для list view control'а и т.д. Справочник по Win32 API ваше лучшее руководство в данном случае.

Теперь, когда мы знаем, как создать common control'ы, мы можем перейти к тому, как взаимодействуют common control'ы и их родители. В отличие от дочерних элементов управления, common control'ы не взаимодействуют с родительским окном через WM_COMMAND. Вместо этого они используют сообщение WM_NOTIFY, посылаемое родительскому окну, когда происходит какое-то интересное событие. "родитель" может контролировать "детей", посылая им определенные сообщения, которых введено достаточно много. Вам следует обратиться к справочнику по Win32 API за конкретными деталями.

Давайте посмотрим, как создать рrogress bar и status bar.

Пример:

Скопировать данный код в буфер обмена

Анализ:

end WinMain( hModule,NULL,GetCommandLine(), SW_SHOWNORMAL ) ' вызвать основную функцию
InitCommonControls()

Я специально поместил InitCommonControls после Exitprocess, чтобы продемонстрировать то, что эта функция необходима только для создания ссылки на comctl32.dll в секции импорта. Как вы можете видеть, common control'ы работают, даже если функция InitCommonControls не запускалась.

case WM_CREATE
hwndProgress = CreateWindowEx _
(NULL, _
progressClass, _
NULL, _
WS_CHILD+WS_VISIBLE, _
100, _
200, _
300, _
20, _
hWnd, _
cptr(HMENU,IDC_PROGRESS), _
hModule, _
NULL)

Здесь мы создаем common control. Заметьте, что вызов CreateWindowEx содержит hWnd в качестве хэндла родительского окна. Он также задает ID контрола, для идентификации последнего. Тем не менее, так как у нас есть хэндл окна контрола, этот ID не используется. Все дочерние окна должны иметь стиль WS_CHILD.

CurrentStep = 1000
SendMessage _
(hwndProgress, _
PBM_SETRANGE, _
0, _
CurrentStep shl 16)
SendMessage _
(hwndProgress, _
pBM_SETSTEP, _
10, _
0)

После того, как создан progress bar, мы можем установить его диапазон. Диапазон по умолчанию равен от 0 до 100. Если это вас не устраивает, вы можете указать ваш собственный диапазон с помощью сообщения PBM_SETRANGE. lparam этого сообщения содержит диапазон, максимальное значение в верхнем слове и минимальное в нижнем. Вы также можете указать шаг, используя сообщение PBM_SETSTEP. Этот пример устанавливает его в 10, что означает то, что когда вы посылаете сообщение PBM_STEPIT прогресс бару, индикатор прогресса будет повышаться на 10. Вы также можете установить положение индикатора, послав сообщение PBM_SETPOS. Это сообщение дает вам полный контроль над Progress bar'ом.

hwndStatus = CreateStatusWindow _
(WS_CHILD+WS_VISIBLE, _
NULL, _
hWnd, _
IDC_STATUS)
TimerID = SetTimer _
(hWnd, _
IDC_TIMER, _
100, _
NULL)

Затем мы создаем status bar, вызывая CreateStatusWindow. Этот вызов легко понять, поэтому я не буду комментировать его. После того, как status window создан, мы создаем таймер. В этом примере мы будем обновлять progress bar каждые 100 ms, поэтому нам нужно создать таймер.
function SetTimer _
(byval hWnd as HWND, _
byval TimerID as UINT, _
byval TimerInterval as UINT, _
byval lpTimeрProc as TIMERPROC) as UINT

hWnd : хэндл родительского окна

TimerID : не равный нулю идентификатор таймера. Вы можете создать свой собственный идентификатор.

TimerInterval : временной интервал в миллисекундах, который должен пройти, прежде чем таймер вызовет процедуру таймер или пошлет сообщение WM_TIMER.

lpTimeрProc : адрес функции таймера, которая будет вызываться при истечении временного интервала. Если параметр равен нулю, таймер вместо этого будет посылать родительскому окну сообщение WM_TIMER.

Если вызов прошел успешно, функция возвратит TimerID. В противном случае, будет возвращен ноль. Вот почему идентификатор таймера не должен быть равен нулю.

case WM_TIMER
SendMessage _
(hwndProgress, _
PBM_STEPIT, _
0,0)
CurrentStep -= 10
if CurrentStep = 0 then
KillTimer _
(hWnd, _
TimerID)
TimerID = 0
SendMessage _
(hwndStatus, _
SB_SETTEXT, _ ' _
0, _
cPtr(LPARAM,Message))
MessageBox(hWnd,Message,AppName,MB_OK+MB_ICONINFORMATION)
SendMessage _
(hwndStatus, _
SB_SETTEXT, _
0, _
0)
SendMessage _
(hwndProgress, _
PBM_SETPOS, _
0, _
0)
end if

Когда истекает указанный временной интервал, таймер посылает сообщение WM_TIMER. Вы можете поместить здесь свой код, который будет выполнен. В данном примере, мы обновляем Progress bar, а затем проверяем, было ли достигнуто максимальное значение. Если это так, мы убиваем таймер, после чего устанавливаем текст статус-окна с помощью сообщения SB_SETTEXT. Отображается message box, и когда юзер кликает OK, мы очищаем текст в status bar'е и progress bar'е.

[C] Iczelion, пер. Aquila.

для подробного понимания данного урока, далее идут выдержки из различных источников.

Progress bar,индикатор выполнения.

Каждый раз, когда мы видим индикатор выполнения (Progress bar), мы знаем, что выполняется какой-то процесс. Если индикатор надолго остановился, мы думаем, что программа "зависла" и немедленно перезагружаем компьютер. Поэтому, от того, как вы будете управлять своим индикатором, зависит будет пользователь ждать выполнения процесса или зарекомендует вашу программу, как нерабочую. Наивно конечно думать, что индикатор - это самостоятельный элемент управления, который напрямую связан с событиями, происходящими в программе. На самом деле, это просто "мультик", призванный отвлечь пользователя от грустных мыслей, пока тянется какой-то процесс. Сама полоска индикации никаких сообщений не генерирует, зато охотно их принимает. И вот как это делается:

Сообщения ей передаёт знакомая функция:
function SendMessage (byval hWnd as HWND, byval messg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT

Первый идентификатор hwndProgress- идентификатор окна полосы прокрутки. Поскольку мы создаём её не как ресурс, а создаём динамически, то используем для её создания функцию CreateWindow, следовательно, наша полоса является самым настоящим окном, которому можно посылать сообщения.

messg - сообщение. Оно может принимать значения:

PBM_SETPOS - Установка текущей позиции индикатора. wParam - значение новой позиции, lParam = 0.
PBM_SETRANGE - Установка диапазона значений. wParam = 0, а lParam содержит начальный и конечный диапазоны. Вот как это выглядит:

SendMessage(hwndProgress, PBM_SETRANGE, 0, MAKELPARAM(0,50)) ' диапазон от 0 до 50

PBM_SETSTEP - задаёт шаг изменения индикатора. wParam = шаг, lParam = 0.
PBM_STEPIT - заставляет индикатор сделать шаг вперёд, то есть закрасить заданное количество клеточек.

Макрокоманда MAKELPARAM создает значение для использования его в сообщении как параметр lParam. Макрокоманда соединяет заданные величины.

Синтаксис

LPARAM = MAKELPARAM(wLow,wHigh)

Параметры

wLow
Устанавливает младшее слово нового значения.
wHigh
Устанавливает старшее слово нового значения.

Возвращаемые значения
Возвращаемое значение - значение LPARAM.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686