マルチレイヤ/マルチディスプレイサポート
マルチレイヤ/マルチディスプレイサポート
マルチレイヤのサポート、マルチディスプレイのサポートは、同じように機能します。それぞれの層/ディスプレイは、独自の色設定、独自のサイズと、独自のディスプレイドライバを使用してアクセスすることができます。複数のレイヤーの初期化は非常に簡単です:利用可能なレイヤのGUI_NUM_LAYERSの最大数はGUIConf.hで定義され、各レイヤーは、コンフィギュレーションルーチンLCD_X_Config()で初期化中に作成する必要があるディスプレイドライバのデバイスを必要とすべきである。利用可能なレイヤの最大数に関する制限はありません。Windowsが描画操作は、任意のレイヤーまたはディスプレイに使用することができる、任意のレイヤーまたはディスプレイに配置できます。この観点からだけ小さな違いが本当にあるので、複数のレイヤーや複数のディスプレイは、特定の組み込みシステムは、複数のディスプレイを使用している場合でも、同じ方法で処理されます(同じAPIルーチンを使用して)、単純に複数のレイヤと呼ばれます。
描画操作のためのレイヤーを選択
直接描画する場合、デフォルトの層ごとに0が使用されます。他の層を使用して選択することができますGUI_SelLayer() 1。
サンプル
次のサンプルでは、描画操作のためのレイヤーを選択する方法を示しています。
ボイドMainTask(ボイド){GUI_Init(); GUI_Clear(); GUI_DispStringHCenterAt("レイヤ0"、100、46); / *は* / GUI_SetBkColor(GUI_GREEN)デフォルトのレイヤ0上に何かを描画する/ *レイヤー1上で何かを描画します* / GUI_SelLayer(1); / *選択層1 * / GUI_SetBkColor(GUI_RED); GUI_Clear(); GUI_SetColor(GUI_BLUE); GUI_FillRect(20、20、179、79); GUI_SetColor(GUI_WHITE); GUI_SetTextMode(GUI_TM_TRANS); GUI_DispStringHCenterAt("レイヤ1"、100、46);ながら(1){GUI_Delay(100);}}
上記のサンプルのスクリーンショット
ウィンドウのレイヤーを選択する
ウィンドウマネージャは、自動的にウィンドウがどのレイヤーに配置されているかを追跡します。これはかなり簡単な方法で行われます:ウィンドウマネージャを使用する場合は、すべての層は、最上位レベル(デスクトップ)のウィンドウを持っています。それはこれらのデスクトップウィンドウのいずれかの子孫(子または孫か...)である場合にのみ、この層内の他のウィンドウが表示されます。どのレイヤーウィンドウは、単に、どのデスクトップウィンドウにそれがの子孫であるに依存しています。
サンプル
次のサンプルは、2つの異なるデスクトップウィンドウ上で、3つのウィンドウを作成する方法を示しています。
hWin0 = WM_CreateWindowAsChild(10、20、80、70、WM_GetDesktopWindowEx(0)、WM_CF_SHOW、_cbWin0、0); / * destop 1に2子ウィンドウを作成* / hWin1 = WM_CreateWindowAsChild(10、20、80、70、WM_GetDesktopWindowEx(1 )、WM_CF_SHOW、_cbWin1、0); hWin2 = WM_CreateWindowAsChild(110、20、80、70、WM_GetDesktopWindowEx(1)、WM_CF_SHOW、_cbWin2、0);
上記のサンプルのスクリーンショット
スクリーンショット | ウィンドウの階層 |
1つの層から、他にウィンドウを移動する
これは、いつか非常に望ましいことができ、容易に行うことができます:ウィンドウがその親(1層またはこのldesktopのウィンドウのいずれかdescenedentのデスクトップウィンドウ)から切り離され、他の層にあるウィンドウに接続されている場合、このウィンドウは実際に1つの層から他の層へ移動する。
サンプル
次のサンプルでは、親ウィンドウからウィンドウを切り離す方法と新しい親ウィンドウに付加する例を示します。
/ * destop 0の1つの子ウィンドウを作成* / hWin0 = WM_CreateWindowAsChild(10、20、80、70、WM_GetDesktopWindowEx(0)、WM_CF_SHOW、_cbWin0、0); / * destop 1に2子ウィンドウを作成* / hWin1 = WM_CreateWindowAsChild( 10、20、80、70、WM_GetDesktopWindowEx(1)、WM_CF_SHOW、_cbWin1、0); hWin2 = WM_CreateWindowAsChild(110、20、80、70、WM_GetDesktopWindowEx(1)、WM_CF_SHOW、_cbWin2、0); GUI_Delay(1000); / *デスクトップ1からウインドウ2をデタッチし、デスクトップに0にそれを添付* / WM_AttachWindow(hWin2、WM_GetDesktopWindowEx(0));
それはこれらのデスクトップウィンドウのいずれかの子孫(子または孫か...)である場合にのみ、この層内の他のウィンドウが表示されます。どのレイヤーウィンドウは、単に、どのデスクトップウィンドウにそれがの子孫であるに依存しています。
スクリーンショット | ウィンドウの階層 |
次の表は、新しい親にウィンドウをアタッチした後のスクリーンショットと上記のサンプルのウィンドウの階層を示しています。
スクリーンショット | ウィンドウの階層 |
マルチレイヤのサポートを使用する
emWinは、複数のレイヤーまたは複数のディスプレイを区別しません。複数のレイヤーを使用する場合は、通常、各レイヤーのサイズとドライバは同じです。ビューアは、別のウィンドウ内の各レイヤーを示しています。ビューアの複合ウィンドウには、すべてのレイヤーを示し、高い屈折率を持つ層が低い屈折率を持つ層の上部にあり、透明なピクセルを持つことができます。
透明性
透明度は、カラーインデックス層> 0の0のピクセルの位置で、背景レイヤーの色が見えることを意味します。すべてがレイヤー0インデックス0は透明性のためなので、インデックス0は、色を表示するために使用することはできません。これはまた、これは透明なピクセルの結果になるので、色変換は、色にベストマッチとして0を得てはならないことを意味します。これは、いくつかの固定パレットモードまたはカスタムパレットモードを使用して、あなた独自のパレットを定義するときに注意する必要があることをする必要があることを意味します。結果として0が得られることがない - あなたは、色変換(>インデックス24ビットRGBが)ことを確認する必要があります。
例
次の例では、透明性を使用する方法を示しています。それはレイヤー0の3つのカラーバーを描画します。レイヤ1が白で塗りつぶされ、3透明なアイテムが描かれています。
GUI_SelectLayer(0);
GUI_SetColor(GUI_RED);
GUI_FillRect(0、0、199、33);
GUI_SetColor(GUI_GREEN);
GUI_FillRect(0、34、199、66);
GUI_SetColor(GUI_BLUE);
GUI_FillRect(0、67、199、1"、100、4); GUI_SetColor(GUI_TRANSPARENT); GUI_FillCircle(100、50、35); GUI_FillRect(10、10、40、90); GUI_FillRect(160、10、190、90);
上記の例のスクリーンショット
その結果がディスプレイに表示されている以下の表は、別々のレイヤーと複合ビューの内容を示しています。
レイヤ0 | レイヤ1 | レイヤ2 |
アルファブレンディング
アルファブレンディングは、透明効果を可能にする2つの色を組み合わせる方法です。:C0とC1の2色がCrは次のように計算することができます(0は目に見えないことを意味し、1は100%が見えることを意味0と1の間の値)結果の色をブレンドアルファと組み合わせる必要があると仮定
CR = C0 *(1 - A)+ C1 *
論理的な色は32ビット値として内部的に処理されます。下位24ビットは色の情報のために使用され、アルファブレンディングは、上位8ビットで管理されます。0x00のアルファ値は不透明と0xFFは、(見えない)完全に透明を意味します。
別の方法
アルファの情報を管理するの3つの異なる方法があります。
- レイヤーのアルファブレンディング:アルファ値をブレンドするレイヤーのアルファを持つシステムでは、層に固定されており、機能のLCD_SetAlphaEx()で設定することができます。
- テーブル(LUT)アルファブレンディングをルックアップ:アルファブレンディングのこの種のアルファ情報を管理するためのLUTを使用しています。
- ピクセル単位のアルファブレンディング:背景と組み合わされるレイヤーの各ピクセルは、アルファブレンディングの情報で構成されています。
例
次の例では、ピクセルのアルファブレンディングを使用する方法を示します。それはレイヤー0の円を描画し、黄色の三角形は、アルファ値の垂直方向のグラデーションで水平線のビルド:GUI_SetColor(GUI_BLUE); GUI_FillCircle(100、50、49); GUI_SetBkColor(GUI_TRANSPARENT); GUI_Clear(); (のi = 0;私<100は、i u32="" i="" 255="" 100="" 24="" gui_setcolor="" gui_yellow="" gui_drawhline="" -="" br="">
上記の例のスクリーンショット
下の表は、別々のレイヤーと複合ビューの内容を示して
、結果がディスプレイに表示されている。
ハードウェアカーソル
用語'ハードウェアカーソルが"と別のレイヤー内のカーソルの画像の使用を意味する
背景を透明にする。ハードウェアが複数の層との能力をサポートしている場合は
レイヤーの位置決めemWinを管理するための別のレイヤーを使用するように構成することができます
カーソルを。カーソルのサポートのこの種の主な利点は、パフォーマンスを向上さです
ほんの数レジスタが運動との能力を変更する必要があるので、
カーソル層でのカスタム図面。
レイヤ0 | レイヤ1 | レイヤ2 |