この記事 きじ は検証 けんしょう 可能 かのう な参考 さんこう 文献 ぶんけん や出典 しゅってん が全 まった く示 しめ されていないか、不十分 ふじゅうぶん です。 出典 しゅってん を追加 ついか して記事 きじ の信頼 しんらい 性 せい 向上 こうじょう にご協力 きょうりょく ください。(このテンプレートの使 つか い方 かた ) 出典 しゅってん 検索 けんさく ? : "NWSTK" – ニュース · 書籍 しょせき · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2020年 ねん 11月 )
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に自動 じどう 変換 へんかん することが出来 でき 、この仕組 しく みが無 な かった場合 ばあい と比 くら べてソースコードの記述 きじゅつ 量 りょう は大幅 おおはば に減 へ らせる。
コマンド入力 にゅうりょく データ入出力 にゅうしゅつりょく 表示 ひょうじ コンテナ ナビゲーション 特殊 とくしゅ ウィンドウ 関連 かんれん 項目 こうもく