|
Xlibでの質問です。 日本語文字列をウィンドウの左上(x:0,y:0)に表示するのを書いています。 ソースコードはこれです。 http://homepage1.nifty.com/tyuuki/tmp/Makefile http://homepage1.nifty.com/tyuuki/tmp/drawstr.c 実行結果は(うちのtwmだと)このようになります。 http://homepage1.nifty.com/tyuuki/tmp/drawstr.jpeg なぜか上の方に隠れてしまいます。 本当は、 http://homepage1.nifty.com/tyuuki/tmp/drawstr2.jpeg のようになってほしいんです。 # これは、多分タイトルバー(?)の長さを求めてやればいいんでしょうけど…。 XCopyAreaで0, 0を指定してるのにこうなってしまうのは、どうしてなんでしょうか? 教えてください。 |
|
>>1807 ひろし。 > ツリー式だと、レスのレスのレスの・・・ってやってくとどんどん > 右端によってって、めちゃ見にくいと思う。 それは同感ですね。あと、現 SEGA BBS のような、ツリーを一括して 表示するのは最悪だと思います。とにかく見にくい。 >>1808 やまま > こんな感じにしてみた。 どうもです。参考になります。 >>1809 Yuuki > なぜか上の方に隠れてしまいます。 XDrawString/XmbDrawString に与える原点 x,y は、文字列の左下の 座標を与えます。本当はもうちょっと複雑で、原点に 10,10 を与えた としても、フォントの lbearing, descent の値によっては、9,10 や 10,11 にドットが描画される可能性はあります。そこらへんの情報は XmbTextExtents で取得できます。 |
|
このサイトのUNIXシステムコールのopendirの説明にあったサンプルコードを打ち込んでみたのですが、 ファイル名の頭2文字が欠けてしまいます。dir->d_nameに-2すればファイル名の頭を指してくれるのですが 何故なんでしょう。OSは SunOS 5.5.1です。sys/dir.hを見てもちゃんとファイル名エントリがd_nameで定義されているのに。何か障害になるものがあるのでしたらお教え下さい。 |
|
>>1811 Donchan SunOS上でファイル名2文字切り落としが発生するということであれば、 おそらく使用されているコンパイラに問題があるものと思われます。 以下のアナウンスが参考になるのではないでしょうか。 http://www.sun.co.jp/tech/faq/solaris2_ja/Q6.19.html 以上、通りすがりの者でした。 |
|
>>1810 68user > XDrawString/XmbDrawString に与える原点 x,y は、文字列の左下の > 座標を与えます。 今まで左上にだと思いこんでました…。 > そこらへんの情報はXmbTextExtents で取得できます。 これで解決しました。 http://homepage1.nifty.com/tyuuki/tmp/drawstr.c このようになりました。 ありがとうございます。 |
|
>>1813 Yuuki > これで解決しました。 > http://homepage1.nifty.com/tyuuki/tmp/drawstr.c http://homepage1.nifty.com/tyuuki/tmp/drawstr2.c ですよね。 誠に勝手ながら、後から見た人のために drawstr2.c を貼っておきます。 行数短縮のため、少々コードスタイルをいじらせていただきました。 もしまずければ削除いたします。 ---- #include <stdio.h> #include <locale.h> #include <X11/Xlib.h> #include <X11/Xutil.h> static XFontSet load_font( Display *display, const char *font_names ){ char **miss_str; int miss_cnt; char *def_str; return XCreateFontSet( display, font_names, &miss_str, &miss_cnt, &def_str ); } static int ask_text_height( XFontSet font, const char *str ){ XRectangle rect; XmbTextExtents( font, str, strlen( str ), &rect, NULL ); return rect.height; } int main( int argc, char **argv ){ Display *display; Window window; GC gc, gc_clr; unsigned long background, foreground; XFontSet font; Pixmap pixmap; const int width = 640; const int height = 480; const char *message = "こんにちは。"; if ( setlocale( LC_CTYPE, "" ) == NULL ){ printf( "setlocale error\n" ); exit( 0 ); } display = XOpenDisplay( NULL ); font = load_font( display, "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*,*" ); background = WhitePixel( display, 0 ); foreground = BlackPixel( display, 0 ); window = XCreateSimpleWindow( display, DefaultRootWindow( display ), 0, 0, width, height, 0, 0, background ); pixmap = XCreatePixmap( display, window, width, height, DefaultDepth( display, 0 ) ); gc = XCreateGC( display, window, 0, 0 ); XSetBackground( display, gc, background ); XSetForeground( display, gc, foreground ); gc_clr = XCreateGC( display, window, 0, 0 ); XSetBackground( display, gc_clr, background ); XSetForeground( display, gc_clr, background ); XMapRaised( display, window ); XSelectInput( display, window, ExposureMask ); while ( 1 ){ XEvent event; XNextEvent( display, &event ); switch ( event.type ){ case Expose : XFillRectangle( display, pixmap, gc_clr, 0, 0, width, height ); XmbDrawString( display, pixmap, font, gc, 0, ask_text_height( font, message ), message, strlen( message ) ); XCopyArea( display, pixmap, window, gc, 0, 0, width, height, 0, 0 ); break; } } } |