NWSTK

From Wikipedia, the free encyclopedia

初版 2020年 (5年前) (2020)
最新版
0.0.0 / 2020/04
プログラミング
言語
SuperC/C++ Nex
NWSTK
開発元 NOWSMARTSOFT
初版 2020年 (5年前) (2020)
最新版
0.0.0 / 2020/04
プログラミング
言語
SuperC/C++ Nex
対応OS Windows/Android/WebAssembly
ライセンス Proprietary
公式サイト yutakaaoki.github.io
テンプレートを表示

NWSTKは、NOWSMARTSOFTが開発したWindows・Android・WebAssembly用のマルチプラットフォームGUIツールキットである。

1つの SuperC ソースで、全ての対応プラットフォーム用のアプリケーションを作製できる。 Windows出力は、32BIT版と64BIT版の両方に対応している。 SuperCは、NWSCというコンパイラでコンパイルする。 Widgetは、全て、直線描画や矩形塗りつぶし、文字描画などプラットフォームが備えた基本グラフィックを 使って独自に描画しているため、原則的にはピクセル単位でどのプラットフォームでも全く同じ見た目になる。 特徴として、ブラウザ上でも一時停止できるタイプのWin32で言うところの「モーダルダイアログ」を作成できることや、Sleep()相当の関数で指定した時間だけその場で停止できることが挙げられる。 本来、JavaScriptやWebAssemblyでは、このような方法でその場で停止することは出来ないが、SuperCだと特殊なアルゴリズムを用いて関数をコンパイラが自動的に変形することで、条件が満たされるまでブラウザのイベントキューに戻り、条件が満たされると関数の元の場所に戻ってくることが出来る機能を持っているため可能となっている。WebAssemblyでは、関数スタックを覚えておくことも出来ないので、関数の元の場所に戻る際には独自に覚えておいた情報に基づいて関数の「巻き戻し」動作が行われる。

フレームワーク

フレームワークの大まかな流儀はMFCに近くなっているため、MFCを理解している人は NWSTKを理解するのも容易である。 MS Windowsとよく似た Window システムをサポートし、プルダウンメニューや、Windowの中にWindowを入れるMDI Child Windowもサポートしている。

グラフィック

グラフィックは2Dと3Dに対応しており、後者は OpenGLまたはWebGL を使っているが、どのプラットフォームに出力する場合でもアプリケーション層のソースレベルでは(OpenGL ESに近いところの)OpenGL 2.0としてC言語で記述できるため、1つのソースをほとんど修正することなく全てのプラットフォームに対応できる。 同様に、前者(2Dグラフィック)も原則として1つのソースで、全てのプラットフォームに対応できる。

キー入力

Windowに対するキー入力はイベントハンドラで受け取ることが出来る。仮想キーコードや生キーコード(RawKeyCode)を受け取る CWnd::OnKeyDown()と、Unicodeを受け取るCWnd::OnChar()が利用できる。 OnChar()は、どのプラットフォームにおいても、日本語IMEを使った日本語入力に対応している。 顔文字などの16BIT Unicodeではサロゲートペアで表現される文字も、自動的にUTF32に変換される。 Android出力やWebAssembly出力では、ソフトウェアキーボードと物理キーボードに対応している。 WebAssemblyでは、キー入力も含めた全ての入出力はJSの機能を用いることによって行われるが、 JSのキー入力イベントは、日本語を入力することが出来ない。 しかし、NWSTKでは、HTMLのtextarea要素を上手く利用することにより、あたかも、WindowsのWM_CHARイベントで日本語を受け取っているかのように、CWnd::OnChar()イベントが呼び出され、アプリケーション作者目線では、HTMLのtextareaの存在を意識する必要が無い。また、IMEがONの場合でも、BackSpaceキーなどをCWnd::OnKeyDown()やCWnd::OnChar()で受け取ることが可能である。 仮想キーコードでは、数字キーやカーソルキーを入力した時、メインキーを押したことに起因するのか、テンキー(NUM PAD)を押したことに起因するのかが区別できないため、便利なエディタを作りたいときには不便である。 そこで、NWSTKでは、仮想キーコード以外に、生キーコード(RawKeyCode)もサポートすることによって、メインキーとテンキー、左右シフトキー、左右コントロールキーなどが明確に区別できるようにしてある。

マウス入力/タッチ入力

タッチ入力は、Android版では、二点以上を同時に触れる入力にも対応している。 これによりWindowのサイズをピンチイン/ピンチアウト操作で変更できる。

Android出力やWebAssembly出力では、タッチした座標にNWSTKが自らタッチマークを表示することにより、どの座標をタッチしたことになったのかが分かる様になっており、細かなオブジェクトを触るのが容易になっている。 WebAssembly出力では、タッチマークの中心部分に数ドット幅の小さな穴が開けてあるため、タッチマークが表示されても、遮ることなくHTML要素を普段通りクリックすることが可能であるため、HTML要素との共存が容易である。 同様に、Android出力でも、Android OSが備えた任意の Widget要素とNWSTKを共存させた状態でタッチマークを表示させ、Android のWidget要素をタッチして反応させることが可能である。

自由なZ-Order の修正

MS Windows の Window システムでは、タイトルバーをクリックすると、必ずその Window が最前面に出てくる様になっているが、NWSTKでは、マウスやタッチパネルでタイトルバーをクリックまたはタッチしてポインターを動かさずにその場で離すと、「UpDownBox」が現れ、WindowのZ-Orderを好きなように変更できる。 この機能は、MS Windows も含めて全ての対応プラットフォームで利用できる。 この機能により、画面に沢山のWindowが有る時、Windowの前後関係を変えずに後ろのウィンドウを移動したり、Windowの前後関係を変えずに後ろのウィンドウに容易に文字やグラフィックを入力することが出来る。

透明ウィンドウのサポート

全ての対応プラットフォームで透明 Window に対応している。 例えば、Windows版でも、透明化WindowがChildWindowにはサポートされていないところのWinXPにおいても、Win32のEDIT Controlですら透明化できる。 技術的には、Windowを独自にバックサーフェイス(メモリーDC)上で合成することによって実現している。 Win32 Edit Controlの場合は、Windowを何枚も重ねることにより、本当の Edit Control と同じ座標で、見えない奥の方に隠し、そのWndFuncをフックしてメモリーDC上に描画させ、メインのバックサーフェイス上で透明重ね合わせをしたものを、画面上に描画する仕組みをとっている。 ただし、この仕組みを用いると僅かではあるが速度低下が起きる。3Dゲームではそれが問題になることもあるので、OpenGLなどの描画はこの仕組みをカットして物理画面のHDC(デバイスコンテキスト)にダイレクトに描画することもできるようなモードも持っている。

メッセージループ

JSコードやJavaコードの挿入

脚注

Related Articles

Wikiwand AI