FrontPage > C/C++ > Xt、Xmからグラフィックの使用

X ToolkitやMotifからグラフィックの使用

「X Toolkit」や「Motif」にはグラフィック描画関数が無いので、Xlibを使うことになります。
描画用のWidgetには、MotifのXmDrawingAreaXmDrawnButton等が使われます。

「Expose(XmNexpose)」等のイベントを使用しなくても描画は可能ですが、
ウインドウが重なると消えてしまうため 「Expose(XmNexpose)」を使用せず描画させる為には、
バッファリング機能(バッキングストア)をONにする必要があります。

バッキングストアには、描画速度の低下等副作用もありますし標準ではOFFですので、
描画処理は、イベント(Expose)処理にて行うのが一般的です。


Xのグラフィックの関数を使用するためには、 Window (WidgetをXtWindowにて変換)や
Display情報 (WidgetをXtDisplayにて変換)が必要です。

※XtRealizeWidget(Widget); するまでは、実体が無いので変換は出来ません。

メインループ前に

/* グラフイック・コンテキスト */
GC              gc ;

・・・

XtRealizeWidget(Widget); 

・・・

/* グラフィック・エリアの生成 */
gc = XCreateGC (XtDisplay (widget), XtWindow (widget), 0, 0) ;

/* 描画イベントの追加 (描画function:drawCB) */
XtAddCallback (widget, XmNexposeCallback, (XtCallbackProc)drawCB, gc) ;

イベント(drawCB)

void    drawCB(Widget wd, GC gc, XmDrawingAreaCallbackStruct *cdata){

    /* ディスプレイ */
    Display         *display ;
    /* ウインドウ */
    Window          window ;

    /* ディスプレイ取得 */
    display = XtDisplay (wd);

    /* ウインドウ取得 */
    window = XtWindow (wd);

    /* Display、Drawable[Window、Pixmap]、GCを使用し描画。 */

    ・・・

}

※直接Window(Widget)に描画するとちらつくことがあります。(グラフィックのちらつき防止参照)
※イベントで描画処理を記述している場合は、手動イベントを発行する事で再描画を行うことも出来ます。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-24 (日) 16:21:27