2017-09-01 30 views
0

Ich arbeite an einem einfachen Programm, das den Text in einer Textansicht mit dem Druckdialog mit GTK +/Glade/C-Programmiersprache gedruckt. HierDrucken eines TextView mit GTK +/C

ist die Quelle:

Die ui.glade Datei:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkTextBuffer" id="textbuffer1"/> 
    <object class="GtkWindow" id="window1"> 
    <property name="width_request">440</property> 
    <property name="height_request">250</property> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkFixed" id="fixed1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkTextView" id="textview1"> 
      <property name="width_request">416</property> 
      <property name="height_request">186</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="buffer">textbuffer1</property> 
      </object> 
      <packing> 
      <property name="x">13</property> 
      <property name="y">13</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">Print</property> 
      <property name="width_request">145</property> 
      <property name="height_request">30</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="x">284</property> 
      <property name="y">210</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Main.c Quellcode:

#include <gtk/gtk.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

/************************ widgets variables **************************/ 
GtkBuilder  *builder; 
GtkWidget  *window; 
GtkButton  *button1; 
GtkTextView  *textview1; 
GtkTextBuffer *textbuffer1; 

/************************ Printing button ***************************/ 
void on_button1_clicked() 
{ 
//I'm blocked here 
} 

int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder,"ui.glade",NULL); 

    /************************** Getting widgets from UI file *****************************/ 
    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 
    textview1 = GTK_WIDGET(gtk_builder_get_object(builder, "textview1")); 
    textbuffer1 = GTK_WIDGET(gtk_builder_get_object(builder, "textbuffer1")); 
    button1 = GTK_WIDGET(gtk_builder_get_object(builder, "button1")); 

    /************************** Connecting button signal **************************************/ 
    g_signal_connect (G_OBJECT (button1), "clicked", (GCallback)on_button1_clicked, NULL); 


    gtk_builder_connect_signals(builder, NULL); 
    g_object_unref(builder); 

    gtk_widget_show(window); 
    gtk_main(); 
    return 0; 
} 

So i‘ m beim Codieren blockiert die Druckfunktion, die in diesem Fall on_button1_clicked ist.

Ich habe versucht, GTK Dokumentation über GtkPrintOperation zu lesen, aber das war nicht sehr hilfreich und nicht klar für mich als Anfänger + Tutorials zu diesem speziellen Thema mit C und GTK sind selten!

Antwort

0

Es gibt keine super einfache Möglichkeit, einfach einen Text zu drucken (vielleicht gibt es dafür eine Bibliothek, aber keine, die ich kenne). Stattdessen wird von Ihnen erwartet, dass Sie das grafische Layout selbst handhaben. Dies geschieht unter Verwendung von GtkPrintOperation durch Verbinden der Signale begin_page und draw_page. Sie erhalten einen Rückruf für jede Seite, so dass Sie die Seite mit Cairo zeichnen können. Um Ihnen bei allen komplizierten Details des Textlayouts zu helfen, sollten Sie Pango verwenden. Dann liegt es an Ihnen, die Schriftgrößen und alles basierend auf der Papiergröße zu wählen, die Ihnen der Drucker sagt. Wie kompliziert das sein muss, hängt von Ihren Bedürfnissen ab.