NWSTK

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
NWSTK
開発元かいはつもと NOWSMARTSOFT
初版しょはん 2020ねん (4ねんまえ) (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(デバイスコンテキスト)にダイレクトに描画びょうがすることもできるようなモードもっている。

メッセージループ[編集へんしゅう]

すべての対応たいおうプラットフォームがメッセージループをつ。 具体ぐたいてきには、すべてのプラットフォームで、Win32のGetMessage(), PeekMessage(), DispatchMessage()相当そうとう関数かんすう存在そんざいしており、それをわせることにより独自どくじのメッセージループをどこでもくことができる。 たとえば、キーイベントハンドラやメニューハンドラのなかで、独自どくじのメッセージループをけば、条件じょうけんたされるまでその半永久はんえいきゅうてき停止ていしすることも可能かのうである。 このことにより、MS WindowsのWin32と流儀りゅうぎのプログラムが可能かのうとなるため、Win32やMFCから移植いしょくやすい。 技術ぎじゅつてき側面そくめんでは、ブラウザじょうのJSでは、本来ほんらいはメッセージループを自分じぶんでは記述きじゅつできないため、このようなことはWebAssemblyをもちいても純粋じゅんすいなC/C++やRust言語げんごをコンパイルしただけではできない。しかし、SuperCの場合ばあい、コンパイラが関数かんすう自動的じどうてき特殊とくしゅ変形へんけいすることができるようになっているため、WebAssembly出力しゅつりょくにおいても、SuperCのソースコードレベルでは簡単かんたん記述きじゅつできる。 ブラウザじょうのWebAssemblyばんにおいてキーイベントハンドラやメニューハンドラのなか独自どくじのメッセージループをいた場合ばあい内部ないぶてきには単純たんじゅん無限むげんループではなく、プラットフォームの(えない)イベントキューに自動的じどうてき一旦いったんもどり、せいのイベントが発生はっせいすると、関数かんすうもどされて、条件じょうけんをチェックする、ということが条件じょうけんたされるまでかえされる。このときにもちいられている技術ぎじゅつは、大域たいいきジャンプを強化きょうかしたようなものである。大域たいいきジャンプでは、一方向いちほうこうにしかジャンプできないが、SuperCでは、スタックの情報じょうほう上手うま記録きろくすることにより、双方向そうほうこうにジャンプできるようになっている。なお、通常つうじょうのプラットフォームでは、関数かんすうもど記録きろくするスタックとローカルオート変数へんすう記録きろくするスタックが共通きょうつうであるため、その共通きょうつうスタックだけを記録きろくすれば比較的ひかくてき簡単かんたんにこの機能きのう実現じつげんできる。しかし、LLVMでは、関数かんすうもどりアドレスを記録きろくするスタックとローカルオート変数へんすう記録きろくするスタックがべつであるし、スタックの内容ないよう単純たんじゅんなバイトれつとしてコピーしたり、スタックポインタをLLVMアセンブラレベルで独自どくじさい設定せっていするのも禁止きんしちかいため、単純たんじゅんにはかない。SuperCでは、せいのイベントキューにもどさいには、LLVMのretぶんふくすうかい連続れんぞくして使つかい、ぎゃく関数かんすう場所ばしょもどときには、LLVMのcallぶん関数かんすう階層かいそうすうおな回数かいすうだけ使つかっている。そのさい関数かんすうかり引数ひきすう必要ひつようあらば設定せっていなおしている。 もし、この仕組しくみを使つかわずに単純たんじゅんなループで待機たいきした場合ばあい、CPUの消費しょうひは100%にちかくなり電池でんち消耗しょうもう発熱はつねつりょうはげしくなるが、NWSTKの独自どくじメッセージループで待機たいきする場合ばあいには、この仕組しくみをもちいているため、CPUパワーの消費しょうひは0にちかく、モバイルデバイスにおける電池でんち消耗しょうもう最小限さいしょうげんにできる。

JSコードやJavaコードの挿入そうにゅう[編集へんしゅう]

EM_ASM() ぶんもちいると、WebAssemblyばんではJSコードが、AndroidばんではJavaコードが、その容易ようい挿入そうにゅうできる。このさい、SuperCからの引数ひきすう容易ようい指定していできる。EM_ASM()のJSコード、Javaコードのなかから、SuperCのソースコードにいた関数かんすうすことも容易ようい出来できる。 また、EM_ASM()ぶんなかにおいても、Cの#defineマクロ、#if, #endif などのぜん処理しょり指令しれいや、SuperCのmif, melse, mrept などの拡張かくちょうマクロ構文こうぶんなどがそのまま利用りようできるため、SuperCレベルでのマクロ定数ていすうを、JSやJavaコードのなかにそのまま記述きじゅつすることが出来でき便利べんりにソースをくことが出来できる。 JavaばんのEM_ASM()では、Javaがわかり引数ひきすうかた名前なまえ指定していすることにより、SuperCがわじつ引数ひきすう指定していした文字もじれつ配列はいれつを、Javaの文字もじれつやByteArrayに自動じどう変換へんかんすることが出来でき、この仕組しくみがかった場合ばあいくらべてソースコードの記述きじゅつりょう大幅おおはばらせる。

脚注きゃくちゅう[編集へんしゅう]