FrontPage > C/C++ > Xt、Xmからグラフィックの使用
「X Toolkit」や「Motif」にはグラフィック描画関数が無いので、Xlibを使うことになります。
描画用のWidgetには、MotifのXmDrawingArea、XmDrawnButton等が使われます。
「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) ;
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)に描画するとちらつくことがあります。(グラフィックのちらつき防止参照)
※イベントで描画処理を記述している場合は、手動イベントを発行する事で再描画を行うことも出来ます。