hid*_*kgb 6 gtk label text-alignment
我有一个GtkLabel文本是保持居中,无论它是否比标签更短或更长.
例如,具有SS_CENTER样式标志集的Win32静态控件的行为类似于:
Run Code Online (Sandbox Code Playgroud)?===========================? ? Lorem ipsum dolor ? ?===========================?- 当文本短于对照时;
Run Code Online (Sandbox Code Playgroud)?===========================? Lorem ipsum?dolor sit amet, consectetur?adipiscing ?===========================?- 当文本比控件长时.
注意:用户看到的文本的唯一部分是在框架内.
我期望GtkLabel-s做同样的事情,但实际上它们以不同方式呈现居中文本:
Run Code Online (Sandbox Code Playgroud)?===========================? ? Lorem ipsum dolor ? ?===========================?- 当文本短于对照时;
Run Code Online (Sandbox Code Playgroud)?===========================? ?Lorem ipsum dolor sit amet,?consectetur adipiscing ?===========================?- 当文本比控件长时.
GtkLabel即使长时间内,如何使居中文本保持居中?
以防万一:用户看到的实际文本在~4 FPS时更新,在运行时之前是未知的.
最后解决方案准备好了。
#include <gtk/gtk.h>
struct SCTX {
GtkWidget *text;
GdkRectangle rect;
};
void Resize(GtkWidget *view, GdkRectangle *rect, gpointer user) {
struct SCTX *sctx = user;
GtkRequisition requ;
if ((sctx->rect.width != rect->width )
|| (sctx->rect.height != rect->height)) {
sctx->rect = *rect;
gtk_widget_size_request(sctx->text, &requ);
gtk_layout_move(view, sctx->text, (rect->width - requ.width ) / 2,
(rect->height - requ.height) / 2);
}
}
int main(int argc, char *argv[]) {
GtkWidget *hwnd, *view;
struct SCTX sctx = {0};
gtk_init(&argc, &argv);
hwnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(hwnd, "destroy", gtk_main_quit, 0);
view = gtk_layout_new(0, 0);
g_signal_connect(view, "size-allocate", G_CALLBACK(Resize), &sctx);
gtk_widget_set_size_request(view, 320, 200);
sctx.text = gtk_label_new("Lorem ipsum dolor sit amet, consectetur "
"adipiscing elit, sed do eiusmod tempor "
"incididunt ut labore et dolore magna aliqua");
gtk_container_add(view, sctx.text);
gtk_container_add(hwnd, view);
gtk_container_set_border_width(GTK_CONTAINER(hwnd), 32);
gtk_window_set_position(GTK_WINDOW(hwnd), GTK_WIN_POS_CENTER);
gtk_widget_show_all(hwnd);
gtk_main();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的关键部分是将 a 包裹GtkLayout在我们的周围GtkLabel,这样前者可以在其范围内移动后者。
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |