Skip to content

ПошаговоС руководство ΠΏΠΎ созданию прилоТСния Π½Π° WUI

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Ρ‡Π°Π»ΠΈΡΡŒ Π² Π΄Π΅ΠΊΠ°Π±Ρ€Π΅ 2021 Π³ΠΎΠ΄Π°. Наш основной ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (видСомСссСндТСр) использовал WTL для Windows ΠΈ GTKmm для Linux. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Mac Π½Π΅ Π±Ρ‹Π»ΠΎ. Π’Π°ΡΠΊΠ°Ρ‚ΡŒ Π·Π° собой Π΄Π²Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ Π±Π°Π·Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ всё строго ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, Π±Ρ‹Π»ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ. ΠœΡ‹ΡΠ»ΡŒ ΠΎ создании Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° для Mac Π²Ρ‹Π·Ρ‹Π²Π°Π»Π° Π½Π΅Ρ€Π²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΊ...

На Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΉ вопрос β€” ΠΏΠΎΡ‡Π΅ΠΌΡƒ сразу Π½Π΅ сдСлали Π½Π° Qt, ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΊ: это связано, скаТСм Ρ‚Π°ΠΊ, с гастрономичСскими прСдпочтСниями ΠΈ, отчасти, с любовью ΠΊ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹ΠΌ exe. Π”Π° ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Windows.

Π—Π° ΡˆΠ΅ΡΡ‚ΡŒ Π»Π΅Ρ‚ ΠΆΠΈΠ·Π½ΠΈ с двумя ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, ΠΌΡ‹ постСпСнно ΠΏΠΎΠ΄Π±ΠΈΡ€Π°Π»ΠΈ Π»Ρ‘Π³ΠΊΠΈΠ΅ UI-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, написанныС хотя Π±Ρ‹ Π² стилС C++17.

Π”ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ boost ΠΈ любим Π΅Π³ΠΎ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, насколько ΠΌΠΎΠΆΠ½ΠΎ Π»ΡŽΠ±ΠΈΡ‚ΡŒ всСй Π΄ΡƒΡˆΠΎΠΉ...

Π’ 2021 Π³ΠΎΠ΄Ρƒ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Google ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈΠ»ΠΈ Π·Π²Ρ‘Π·Π΄Ρ‹ Π½Π΅ сошлись, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ стоящСго Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ. Всё, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ β€” ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Π±Π°Π·Π΅ HTML-Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° ΠΈ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π½Π°Π΄ wxWidgets. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΎ lvgl, Π΄Π°... Но Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈΡ… тысячи.

wxWidgets Π½Π΅ΠΏΠ»ΠΎΡ…, Π½ΠΎ Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ собствСнной отрисовки, Π±Π΅Π· Ρ€Π°ΠΌΠΎΠΊ для ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° ΠΈ списков, Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Ρ‚ΠΈΠΏΠ° boost/BSD, максимально Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ, ΠΈ Π² ΠΈΠ΄Π΅Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ Windows XP / CentOS 6 Π½Π° стандартном GDI / X11 Π΄ΠΎ Vulkan Π½Π° соврСмСнных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ….

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ UI-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ сразу Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Open Source ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Boost.

Π—Π°Π΄Π°Ρ‡ΠΈ для UI Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°

  • Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Windows (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 7, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π½Π° XP)
  • Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Linux (начиная с Ubuntu 16 / CentOS 6)
  • Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° macOS
  • ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΊΠ½Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ‹
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс ΠΊ подсистСмС рисования, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ платформозависимыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс ΠΊ событиям
  • ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ систСмныС сообщСния, Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΌΡ‹ΡˆΡŒ, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ события
  • Π˜ΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ Π³Π°ΠΌΠΌΡƒ / ΡΡ‚ΠΈΠ»ΡŒ / ΠΈΠΊΠΎΠ½ΠΊΠΈ / изобраТСния всСх ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ²/ΠΎΠΊΠΎΠ½ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ мСста
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ систСму тСкстовых констант для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ надписСй Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ языка
  • Π˜ΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ / ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ основных UI ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ²
  • Π˜ΠΌΠ΅Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠžΠ±Ρ‰Π°Ρ схСма Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°

Π‘Ρ…Π΅ΠΌΠ° WUI

Всё базируСтся Π½Π° Π΄Π²ΡƒΡ… сущностях β€” Window ΠΈ Control. Окно ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ‹, Ρ‚Π°ΠΊΠΆΠ΅ само ΠΎΠΊΠ½ΠΎ являСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠΌ.

Control β€” это любой Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт для взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ: ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°, список, мСню ΠΈ Ρ‚.Π΄. Control Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚ Window, Ρ…Ρ€Π°Π½ΠΈΡ‚ свои состояния ΠΈ рисуСт сСбя Π½Π° графичСском контСкстС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСтся содСрТащим Π΅Π³ΠΎ ΠΎΠΊΠ½ΠΎΠΌ.

Window β€” ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ систСмныС события ΠΈ обСспСчиваСт ΠΈΡ… рассылку подписчикам. Π’Π°ΠΊ ΠΆΠ΅ ΠΎΠΊΠ½ΠΎ Π΄Π°Ρ‘Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° пСрСрисовку своих ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ² ΠΈ прСдоставляСт ΠΈΠΌ свой graphic. ΠšΡ€ΠΎΠΌΠ΅ этого, ΠΎΠΊΠ½ΠΎ управляСт фокусом Π²Π²ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ подписанному ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ»ΠΈ Π² систСму событиС.

Graphic β€” прСдоставляСт интСрфСйс ΠΊ систСмным ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ рисования. Π’ настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ рисованиС Π½Π° Windows GDI/GDI+ ΠΈ Linux xcb/cairo.

Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства: common (rect, color, font), event (ΠΌΡ‹ΡˆΡŒ, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΈ систСмныС события), theme (систСма констант для Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅ΠΌ), locale (подсистСма для хранСния тСкстового ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°), config (для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с настройками прилоТСния).

ΠžΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

Окно ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ систСмныС события: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ отрисовки, Π²Π²ΠΎΠ΄ с ΠΌΡ‹ΡˆΠΈ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, измСнСния устройств, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ сообщСния. Π­Ρ‚ΠΈ сообщСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ подписчикам событий ΠΎΠΊΠ½Π° β€” ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°ΠΌ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ событий ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° производится спСцифичСскими для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° коллбэками. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ систСму событий Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΈ нСобходимости отрисовки части ΠΎΠΊΠ½Π° производится поиск ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пСрСрисовки ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ² ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ вызываСтся draw() ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ‹ с topmost() == true Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ послСдними.

Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» прилоТСния

Windows

MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Linux

void window::process_events()
{
    xcb_generic_event_t *e = nullptr;
    while (started && (e = xcb_wait_for_event(context_.connection)))
    {
        switch (e->response_type & ~0x80)
        {
            case XCB_EXPOSE:
            // ...
        }
    }
}

Основной Ρ†ΠΈΠΊΠ» прилоТСния

int main()
{
    wui::framework::init();

    MainFrame mainFrame;
    mainFrame.Run();

    wui::framework::run();
    return 0;
}

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠΊΠ½Π°:

void MainFrame::Run()
{
    window->init(wui::locale("main_frame", "caption"),
        { -1, -1, width, height },
        wui::window_style::frame, [this]() {
            wui::framework::stop();
        });
}

Π’Ρ€Π°Π½Π·ΠΈΠ΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ (ΠΌΠΎΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ)

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΎΠΊΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄:

void set_transient_for(std::shared_ptr<window> window_, bool docked = true);

Π€Π»Π°Π³ docked ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ модальноС ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Π±Π΅Π· создания физичСского систСмного ΠΎΠΊΠ½Π°.

РСсурсы (Ρ‚Π΅ΠΌΡ‹ ΠΈ Π»ΠΎΠΊΠ°Π»ΠΈ)

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ ΠΈ локаль. Π­Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°ΡŽΡ‚ значСния для ΠΏΠ°Ρ€Ρ‹ сСкция + ΠΊΠ»ΡŽΡ‡.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π΅ΠΌΡ‹ (dark.json)

{
  "controls": [
    {
      "type": "window",
      "background": "#131519",
      "border": "#404040",
      "border_width": 1,
      "text": "#f5f5f0",
      "caption_font": {
        "name": "Segoe UI",
        "size": 18
      }
    },
    {
      "type": "image",
      "resource": "IMAGES_DARK",
      "path": "~/.hello_wui/res/images/dark"
    }
  ]
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π΅ΠΌΡ‹ (light.json)

{
  "controls": [
    {
      "type": "window",
      "background": "#fffffe",
      "border": "#9a9a9a",
      "text": "#191914"
    },
    {
      "type": "image",
      "resource": "IMAGES_LIGHT",
      "path": "~/.hello_wui/res/images/light"
    }
  ]
}

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

WUI Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ мутСксы. ВсС коллбэки ΠΈ систСмныС события приходят ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (wnd_proc Π½Π° Windows ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ оТидания xcb_wait_for_event() Π½Π° Linux).

РСкомСндуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ всС UI-манипуляции Π»ΠΈΠ±ΠΎ Π² коллбэках, Π»ΠΈΠ±ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ UI-ΠΏΠΎΡ‚ΠΎΠΊΠ΅ прилоТСния.

Unicode

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ UTF-8 Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ std::string / char*.

Для взаимодСйствия с WinAPI, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ utf16 Π² wchar_t, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ boost::nowide::widen() / boost::nowide::narrow().

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ wchar Π½Π΅ Π½ΡƒΠΆΠ΅Π½: https://utf8everywhere.org/

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

WUI Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ошибкой, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ bool. Для получСния Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ get_error():

struct error
{
    error_type type;
    std::string component, message;
    bool is_ok() const;
};

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибки послС конструктора:

auto img = std::make_shared<wui::image>(IMG_LOGO);
if (!img->get_error().is_ok()) {
    log("error", img->get_error().str());
}

Hello World ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π’ качСствС основы для любого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° прСдлагаСтся минимальноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сразу сдСлано с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΄ΠΎ большого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ находится Π² examples/hello_world ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ рСсурсов.

main.cpp

Π”Π΅ΠΌΠΎ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ подпись ΠΈ прСдоставляСт ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ отобраТаСтся Π΄ΠΈΠ°Π»ΠΎΠ³ сообщСния ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ закрываСтся.

Hello World 1

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Ρ‚Π΅ΠΌΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° Π½Π° ΡΠ²Π΅Ρ‚Π»ΡƒΡŽ, язык Π½Π° русский ΠΈ Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° "Nice to meet you"

Hello World 2

MainFrame.h MainFrame.cpp

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ‹

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ 14 ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ²:

button

Кнопка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ²: - text - image - image_right_text - image_bottom_text - switcher - radio - anchor - sheet

Кнопка WUI

image

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ отобраТСния ΠΈΠΊΠΎΠ½ΠΎΠΊ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹.

auto logoImage = std::make_shared<wui::image>(IMG_LOGO);

input

Input WUI

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ².

list

Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ список элСмСнтов с ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ.

Бписок WUI

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎΠ΅ мСню с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ².

МСню WUI

И Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρ‹: panel, progress, select, slider, splitter, tooltip, tray, message, text, scroll.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΎΠ²