Платформа Win32 - Окна

Предыдущая тема Следующая тема Перейти вниз

Платформа Win32 - Окна

Сообщение  Замабувараев в Ср Авг 27, 2008 1:46 pm

Windows
Окно в приложении, написанном для операционных систем Microsoft® Windows® или ReactOS® — это прямоугольная область экрана, выводящее информацию на дисплей и получающее ввод от пользователя. Окно совместно использует экран с другими окнами, включая те от других приложений. Только одно окно одновременно может получить ввод от пользователя. Пользователь может использовать мышь, клавиатуру, или другое устройство ввода данных, чтобы взаимодействовать с этим окном и приложением.
Почти каждый объект в Windows — это окно. Все кнопки, флажки, раскрывающиеся списки, меню, кнопка пуск, даже рабочий стол — это всё окно. Каждое окно имеет определённый класс, который может быть встроенным в Windows, а может быть созданный пользователем.

Создание класса окна
Подключаем заголовочный файл:

Код:
#Include "windows.bi"

И объявляем две функции, которые нам понадобятся:

Код:
Declare Function WinMain(ByVal hInstance As HINSTANCE, ByVal hPrevInstance As HINSTANCE, ByVal szCmdLine As String, ByVal iCmdShow As Integer) As Integer
Declare Function WndProc(ByVal hWnd As HWND, ByVal wMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT

Функция WinMain нужна для регистрации и создания нашего окна, а функция WndProc будет принимать сообщения, посылаемые операционной системой.
Для создания окна нам необходимо зарегистрировать собственный класс окна, например, функцией RegisterClass. Эта функция принимает структуру типа WNDCLASS, которую необходимо инициализировать.

Код:
Function WinMain (ByVal hInst As HINSTANCE, _
                  ByVal hPrevInstance As HINSTANCE, _
                  ByVal szCmdLine As String, _
                  ByVal iCmdShow As Integer) As Integer   
   
    Dim wMsg As MSG ' Сообщение, полученное от окна
    Dim wc As WNDCLASS ' Структура для регистрации класса окна
    Dim hWnd As HWND ' Идентификатор создаваемого окна
   
    With wc
       .style        = CS_HREDRAW Or CS_VREDRAW ' стиль прорисовки окна
       .lpfnWndProc  = @WndProc ' Адрес функции, которая будет принимать сообщения от опрерационной системы
       .cbClsExtra    = 0
       .cbWndExtra    = 0
       .hInstance    = hInst ' Идентификатор процесса
       .hIcon        = LoadIcon(NULL, IDI_APPLICATION) ' Значок по умолчанию
       .hCursor      = LoadCursor(NULL, IDC_ARROW) ' Курсор по умолчанию
       .hbrBackground = Cast(HBRUSH, COLOR_BTNFACE + 1) ' Кисть фона окна
       .lpszMenuName  = NULL ' Идентификатор меню, так как у нас нет такового, оставляем пустое значение
       .lpszClassName = @"FreeBASIC Window" ' Адрес строки с именем нашего класса
    End With

     ' Регистрируем класс окна
     ' Если у нас есть ошибки, то RegisterClass возвращает нулевое значение
    RegisterClass(@wc)

Теперь можно создать окно зарегистрированного класса функцией CreateWindow:

Код:
    hWnd = CreateWindow(@"FreeBASIC Window", _ /' Адрес строки с именем только что созданного класса '/
                          "Пример простого окна", _ /' Заголовок окна '/
                          WS_OVERLAPPEDWINDOW, _ /'  '/
                          CW_USEDEFAULT, _ /' Координата X верхнего левого угла окна, но в данном случае используется значение по умолчанию '/
                          CW_USEDEFAULT, _ /' Координата Y верхнего левого угла окна, но в данном случае используется значение по умолчанию '/
                          320, _ /' Ширина окна '/
                          240, _ /' Высота окна '/
                          NULL, _ /' Идентификатор родительского окна, используется если создаваемое окно является дочерним '/
                          NULL, _ /' Идентификатор меню из ресурсов программы, у нас его нет '/
                          hInst, _ /' Идентификатор процесса, создающего окно '/
                          NULL) /' Дополнительные данные, у нас их  нет '/

Функция возвращает идентификатор, с помощью которого можно манипулировать окном. Теперь нам необходимо показать созданное окно и обновить его:
Код:
    ShowWindow(hWnd, iCmdShow)
    UpdateWindow(hWnd)

Запускаем цикл получения сообщений от окна

Код:
    Do While GetMessage(@wMsg, NULL, 0, 0) <> 0   
        TranslateMessage(@wMsg)
        DispatchMessage(@wMsg)
    Loop
   
    Return wMsg.wParam

End Function


Для того, чтобы принимать сообщения от окна нам необходима функция с именем WndProc.

Код:
Function WndProc(ByVal hWnd As HWND, _
                  ByVal wMsg As UINT, _
                  ByVal wParam As WPARAM, _
                  ByVal lParam As LPARAM) As LRESULT
   
    ' Выбираем сообщение, которое мы получили
    Select Case(wMsg)
        Case WM_CLOSE
            ' Сообщение о закрытии окна
          ' Уничтожаем окно
            DestroyWindow(hWnd)
       Case WM_DESTROY
          ' Окно уничтожается
            PostQuitMessage(0)
            Return 0
        Case Else
          ' Отправляем сообщение обработчику
          ' по умолчанию
            Return DefWindowProc(hWnd, wMsg, wParam, lParam)   
    End Select
   
End Function

Теперь осталось самое основное — запуск программы
(Оператор End закрывает программу с кодом завершения, обычно 0, если нет ошибок.)

Код:
   End WinMain(GetModuleHandle(NULL), NULL, Command(), SW_NORMAL)
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  tux в Ср Авг 27, 2008 4:40 pm

О, наши ряды пополняются))
Хорошая статья, основы создания ГУИ под винду есть. К чему особо придраться мона я не нашел
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Eric-S в Чт Авг 28, 2008 8:48 am

Классно!
Очень похоже на соответствующую главу Iczeliona "создание окна на asm32"

Но именно про freebasic.

Теперь бы ещё про хотябы основные элементы, кнопки, поля, менюшки...
И про диалоговые окна dialogbox, к ним про стандартные окна открытия и сохранения файла.

Но по любому, zamabuvaraeu, мой респект и уважуха!


Всем же остальным, возбуждённым, но неудовлетворённым, читать Уроки Iczelion'а

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Замабувараев в Чт Авг 28, 2008 1:18 pm

Вообще, я планирую писать по платформе Win32 много статей, каждая будет постепенно переходить от простого к сложному. Как раз будет и про элементы управления, про меню, ресурсы программы, GDI Plus, многое другое.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Eric-S в Чт Авг 28, 2008 1:45 pm

Отличненько! Будем с нетерпением ждать. Для меня это вообще крайне интересно.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Eric-S в Чт Окт 02, 2008 3:50 am

Пара слов для начинающих разбираться с winApi и окнами.

Это всё кажеться таким странным, внушительным. Вызываеться куча функций с множеством непонятных параметров.
Но вы не пугайтесь, а начните разбираться с этим.
Функций не так уж и много, да и параметров, кстати тоже.

Если что-то выкидывать или упрощать, то пострадает гибкость или функционал.

Комментарии, которых много в примерах, увеличивают код.

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

Да, визуальная разработка облекчает жизнь, особенно дилетантам.
Возьмите в руки весь процесс и вперёд. У вас выйдет намного лучше, чем у них!

zamabuvaraeu, и небольшое замечание. Пожалуйста, после каждого тега открытия кода "code" переводи строчку, так будет удобнее копировать код.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Eric-S в Сб Окт 04, 2008 2:07 am

Вот интересная статья. Хотя это статеищя, или даже мини справочник.
http://dims.karelia.ru/win32/

В статье рассказываеться про программирования win32api и в первую очередь окон.
Про окна, элементы взаимодействие и управления ими очень много инфы.

Кратенько затронуты многие важные темы.
Причём на русском и очень внятно.
Минусом может быть, что речь идёт о borland comand line compilerили просто bcc. Но по сути различий очень мало.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Замабувараев в Вт Окт 07, 2008 2:11 pm

Спасибо за советы по оформлению, все пожелания по оформлению кода и статей учту. Говорите мне это всё сразу, иначе ошибки будут множиться и дальше, с каждой новой статьёй.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  electrik в Чт Дек 11, 2008 11:05 pm

ну вот и я пополняю данный раздел ссылкой
http://dmtsoft.ru/bn/312/as/oneaticleshablon/
там рассказывается про win32 окна, меню, ресурсы, диалоговые окна. данная статья будет интересна тем, кому хочется узнать про устройство rc файлов. к сожалению код программ расчитан под c, но файлы с ресурсами везде одинаковы, заисключением delphi и vb.
кстати, кто-то задавал вопрос про окно ввода(текстовое окно), там есть програмка с окном ввода и списком, но к сожалению на c.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Окна

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения