发新话题
打印

GTK和中文的问题

GTK和中文的问题

1、用GTK开发时,为什么用类时进程回调会提示出错编译通不过?而不用类则不会提示出错?5 X9 g7 |$ @3 ]4 S
2、运行时,为什么PANGO会提示不能装载中文字体?也不能显示出中文?
; x* B6 M+ Q6 g8 B* R这是编译出错提示:
5 _1 n# o% W4 d+ Ygy.cpp
& @3 w0 B$ Y& d2 R* }gy.cpp: In member function `GtkWidget* GY::csh()':
3 |: V5 i. j6 x1 W4 E" ^gy.cpp:49: error: argument of type `void (GY:(GtkWidget*, void*)' does not match `void (*)()'& P0 S1 o/ [/ M' d7 _$ q! t
1.exe - 1 error(s), 1 warning(s)
9 w! N# r! [* a0 m/ j
3 `& G+ _- j# q以下是源程序:
+ \1 [+ U, c/ k5 igy.h
* j# f( I9 C8 V( n#ifndef _GY_H
% H/ H5 g7 Q# v0 g. i# R #define _GY_H/ b$ Q% i, A$ J/ A3 x. ~
#include <gtk/gtk.h>7 p( {2 M' P9 h) M
class GY
0 q1 w& y, Q5 h1 ]1 X {
; o$ Q3 C* T7 g& x. ]* b/ m  public:
, U# X. f0 L; K5 q    GtkWidget *jm;
' [8 U1 o; H3 {: B9 K  public:
3 }3 ?. O( T$ p0 `+ {' k1 u    GY();
! t2 n5 g: s1 g( z; A8 }    ~GY();& @  Z4 Z" i$ F6 B' S; F
    GtkWidget *csh();, n' R$ k' V0 X% W; G, z- B0 E
    void xs();
( C. t+ h3 f2 ?. ?    void tc(GtkWidget *kj,gpointer sj);9 D6 s+ x6 y% s5 a# t" z* c6 \- D
};
- i. R" [/ n, B! u#endif  
/ F( i8 o- \( l$ `! A& P' M7 v2 S9 x. I$ {: b+ `( L( L
gy.cpp' P3 p) ]; c4 L" i9 k
#include "gy.h"; K3 V8 Q# m) g, z7 V! N2 S  S
#include <pango/pango.h>3 N! X( h& e( b( w5 X
#include <libintl.h># Z3 V8 T' N8 x% M3 o
#include <locale.h>
# |! Z/ X' t7 n- D& P1 r( R% s#include <gdk/gdki18n.h>
" J: i% ~: u! m4 t6 `#define PACKAGE "yyb", n( _2 ^* ]; e4 {
#define LOCALEDIR "./locale"7 H7 ?2 i. ?  N7 }
#define _(string) gettext(string)
( O( \( M. K( \+ {9 e) n#define N_(string) string
1 r8 Z7 L/ r" e- y! c$ M* c: n% u
extern GY *jm;
' v& N% B5 [5 l0 n. Y+ yGY::GY()
% E/ X; Y# k- E* \$ V0 v( C{
) r& }5 B8 t" G4 z( W! P; G}
" a3 L* X) D0 Y8 TGY::~GY()0 n1 _6 @& O2 d( |5 w! k  d
{
1 U7 ]+ m' `6 S/ P! ?}& S# E; O5 K7 S( Z# M
void GY::tc(GtkWidget *kj,gpointer sj)7 F- Z  E* N3 J8 V
{% @; Z" `) m8 ^, {- [4 V" V4 h
}$ f! W7 [- p7 [& D# m. ~
GtkWidget *GY::csh()
0 B; d! V5 _! _% s2 C2 x: s{
- M- S& N& ^9 y! \' V        GtkWidget *xjm;7 ~" b4 g  O. A$ V3 y
        GtkWidget *bg;
# Y# n$ F0 o) \4 V; A9 `, P        GtkWidget *qd;, J2 Z+ k3 V* q9 Z/ ?# U6 l/ R
        GtkWidget *ts;  {& F# w1 k1 u6 Z& V: _' V! c* Z! d5 B
        PangoFontDescription *zt;
3 o" g8 p$ A) _7 f$ ]5 M" o        GdkColor hs={0,0xffff,0,0};1 e, m( q' h3 c4 r" k+ \' C8 I, Q( P
        GdkColor ls={0,0,0xffff,0};
8 r+ i  c2 M; j5 u       
: l% `$ a4 M( P  u" _        xjm=gtk_window_new(GTK_WINDOW_TOPLEVEL);
, x) ^/ s* d- r) m& Q- W        gtk_window_set_title(GTK_WINDOW(xjm),_("gy"));) p9 d- U% _# v& }0 R. F" j
        bg=gtk_table_new(3,3,TRUE);3 d. n/ u; ]: X( I; H  \
        gtk_container_set_border_width(GTK_CONTAINER(bg),10);
  V" |: {- q2 Z5 p9 q        gtk_table_set_row_spacings(GTK_TABLE(bg),5);! U  E7 z, z. O. e; ~' \
        gtk_table_set_col_spacings(GTK_TABLE(bg),5);       
1 a% O6 }2 g1 R) }' w# p$ L        ts=gtk_label_new(_("csnr"));
/ \" v" O$ G% T0 y        gtk_table_attach_defaults(GTK_TABLE(bg),ts,0,1,0,3);7 {% z) [8 N0 Y/ x+ `
        qd=gtk_button_new_with_label(_("qd"));; ]1 N* |/ R5 J8 U$ p( r
        gtk_table_attach_defaults(GTK_TABLE(bg),qd,1,2,2,3);, H' \9 C7 f7 T* x
        gtk_container_add(GTK_CONTAINER(xjm),bg);- p3 U5 P9 ~2 j
        ) L; d* o. y' p7 Z: _& x+ m
        zt=pango_font_description_from_string("STXINGKA 20");        4 O6 |- U* ]- T6 j2 I9 y- Z  ?
        gtk_widget_modify_font(ts,zt);
1 l- c7 p* s( B& B, |" M# u, H        zt=pango_font_description_from_string("SIMLI 18");                7 i* y$ N1 E6 }" h8 r- {' T6 x  c: p2 b
        gtk_widget_modify_font(GTK_BIN(qd)->child,zt);; e; T$ e, D4 N) A, n
        gtk_widget_modify_fg(ts,GTK_STATE_NORMAL,&hs);
" }- R% ?5 e) T0 I# \1 p        gtk_widget_modify_fg(qd,GTK_STATE_NORMAL,&ls);        2 B  u( n) }/ U
        gtk_signal_connect(GTK_OBJECT(xjm),"delete_event",GTK_SIGNAL_FUNC(gtk_widget_destroy),NULL);       
& ^2 K6 q9 f( [+ ?        gtk_signal_connect(GTK_OBJECT(qd),"clicked",GTK_SIGNAL_FUNC(tc),NULL);//就是这句提示出错               
& Q$ M/ V' s* t" ^        this->jm=xjm;
* v( y' |$ v, l/ W% B2 T        return xjm;        & q5 h4 A4 Z. ~
}
# l6 s7 R2 J  Nvoid GY::xs()
2 M; M6 j! |; H{7 U+ m- |* [& W4 c) k; b; n3 i
jm=csh();          R7 F; t6 I' }; Y5 {1 g
gtk_widget_show_all(jm);        ) N- R+ k  q% ?6 o
}7 a  `$ E$ ~3 O1 _% c1 {0 k

/ `+ ~4 }" E7 F  a, q' R3 V这是主程序:- }* I8 ?+ E* K7 s
zcx.cpp
* t5 c( B8 [. `! T  r#include <gtk/gtk.h>) D" q& p6 |5 Q/ M3 b; [9 E
#include <pango/pango.h>
. B8 e* p! ^9 q+ _2 ]/ P& C. |: C#include <libintl.h>
! g- d  T7 E7 Q" v8 y% s1 ~#include <locale.h>
( E! l8 d5 S6 V4 s  A# w4 V9 z#include "dljm.h"
/ b: J, e0 @6 Y/ l/ }1 _#include "gy.h"+ H9 ]5 e& G& L/ N5 I- `: _* j
#include "zjm.h"4 u- j  G7 l* o: J" H
#include <gdk/gdki18n.h>% r- b" e: ?) F/ _
#define PACKAGE "yyb"
$ j+ G# X% L, {2 I: x( |5 m) U. R#define LOCALEDIR "./locale"& o) r( F1 Y4 b' G) |7 g6 G
#define _(string) gettext(string)5 `* p/ U6 e( D( s5 T5 A0 s. p
#define N_(string) string) y1 H0 C  y) q  f+ f' T! m* _3 Z
int main(int cssm,char *cslb[])
: ~+ V" t) i5 P7 i( B$ b{# Y  J9 s+ b9 t3 y) Z& i* C
        GY *gy;  . S1 r) J% i- C2 `( w- ~
        gtk_set_locale();- ?$ a4 L$ v/ k: ~  _+ L8 u! g
        bindtextdomain(PACKAGE,LOCALEDIR);
- X9 e* ~. l) @0 l' l        textdomain(PACKAGE);
' n" z) ?( A; D8 I! ]        gtk_init(&cssm,&cslb);8 M2 t: ]$ b% M. x# J
        gy=new GY();- E, {7 m4 [3 P1 k
        gy->xs();*/% q. B6 b2 Z& X: a
        gtk_main();  z6 Z( B( w- l, L
        return FALSE;        ; z$ x5 O% t8 @% H0 |) K+ Z
}      

TOP

GTK不是C的吗?有C++的吗?      

TOP

不是有GTK版吗?为什么要到C/C++来,建议转移到RAD版,说明理由
* [4 `* Z4 `, Z' p4 |关于问题:) Y+ Z: p' V9 i2 G7 e& R& t
1.关于中文,GTK是采用UTF-8编码,先把中文编码(如GB2312...)转换为UTF-8编码,g_locale_to_utf8,再显示应该没有什么问题0 I9 u! o; X$ |: `9 S, l3 e% q
2.建议用g_signal_connect,且你的回调函数是个成员函数(c++我不懂),不要把tc写在类里面,单独写一个tc的函数,应该可以编过的,毕竟GTK是基于C而不是C++的      
若不是因为风,雨不会美丽!

TOP

发新话题