summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2005-03-26 05:58:20 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2005-03-26 05:58:20 +0000
commit3b6c4b788ed6d2d32c9ad9438e891aa95067281b (patch)
treee5efd5d2ae4fc49299b721c29627ab13ca67b7be
parentf6a137b998d663a98390138f1a11c467c3001658 (diff)
FLUID printing support for Windows (still working on some
issues with printing the simulated window borders, and the page range/selection/all stuff doesn't seem to work...) git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4194 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--fluid/fluid.cxx236
1 files changed, 234 insertions, 2 deletions
diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index 0f41104aa..7e4494766 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -54,6 +54,8 @@
# include <direct.h>
# include <windows.h>
# include <io.h>
+# include <commdlg.h>
+# include <FL/x.H>
#else
# include <unistd.h>
#endif
@@ -850,12 +852,242 @@ void manual_cb(Fl_Widget *, void *) {
////////////////////////////////////////////////////////////////
+#if defined(WIN32) && !defined(__CYGWIN__)
+// Draw a shaded box...
+static void win_box(int x, int y, int w, int h, Fl_Color c) {
+ fl_color(c);
+ fl_rectf(x, y, w, h);
+ fl_color(FL_BLACK);
+ fl_rect(x, y, w, h);
+ fl_color(FL_LIGHT2);
+ fl_rectf(x + 1, y + 1, 4, h - 2);
+ fl_rectf(x + 1, y + 1, w - 2, 4);
+ fl_color(FL_DARK2);
+ fl_rectf(x + w - 5, y + 1, 4, h - 2);
+ fl_rectf(x + 1, y + h - 5, w - 2, 4);
+}
+
// Load and show the print dialog...
void print_menu_cb(Fl_Widget *, void *) {
-#if defined(WIN32) && !defined(__CYGWIN__)
- fl_message("Sorry, printing is not yet implemented on Windows...");
+ PRINTDLG dialog; // Print dialog
+ DOCINFO docinfo; // Document info
+ int first, last; // First and last page
+ int page; // Current page
+ int winpage; // Current window page
+ int num_pages; // Number of pages
+ Fl_Type *t; // Current widget
+ int num_windows; // Number of windows
+ Fl_Window_Type *windows[1000]; // Windows to print
+
+
+ // Show print dialog...
+ for (t = Fl_Type::first, num_pages = 0; t; t = t->next) {
+ if (t->is_window()) num_pages ++;
+ }
+
+ memset(&dialog, 0, sizeof(dialog));
+ dialog.lStructSize = sizeof(dialog);
+ dialog.hwndOwner = fl_xid(main_window);
+ dialog.Flags = PD_ALLPAGES |
+ PD_RETURNDC;
+ dialog.nFromPage = 1;
+ dialog.nToPage = num_pages;
+ dialog.nMinPage = 1;
+ dialog.nMaxPage = num_pages;
+ dialog.nCopies = 1;
+
+ if (!PrintDlg(&dialog)) return;
+
+ // Get the base filename...
+ const char *basename = strrchr(filename, '/');
+ if (basename) basename ++;
+ else basename = filename;
+
+ // Do the print job...
+ memset(&docinfo, 0, sizeof(docinfo));
+ docinfo.cbSize = sizeof(docinfo);
+ docinfo.lpszDocName = basename;
+
+ StartDoc(dialog.hDC, &docinfo);
+
+ // Figure out how many pages we'll have to print...
+ if (dialog.Flags & PD_PAGENUMS) {
+ // Get from and to page numbers...
+ first = dialog.nFromPage;
+ last = dialog.nToPage;
+
+ if (first > last) {
+ // Swap first/last page
+ page = first;
+ first = last;
+ last = page;
+ }
+ } else {
+ // Print everything...
+ first = 1;
+ last = dialog.nMaxPage;
+ }
+
+ for (t = Fl_Type::first, num_windows = 0, winpage = 0; t; t = t->next) {
+ if (t->is_window()) {
+ winpage ++;
+ windows[num_windows] = (Fl_Window_Type *)t;
+ num_windows ++;
+#if 0
+ if (dialog.Flags & PD_ALLPAGES) num_windows ++;
+ else if ((dialog.Flags & PD_PAGENUMS) && winpage >= first &&
+ winpage <= last) num_windows ++;
+ else if ((dialog.Flags & PD_SELECTION) && t->selected) num_windows ++;
+#endif // 0
+ }
+ }
+
+ num_pages = num_windows;
+
+ // Figure out the page size and margins...
+ int width, length; // Size of page
+ int xdpi, ydpi; // Output resolution
+ char buffer[1024];
+
+ width = GetDeviceCaps(dialog.hDC, HORZRES);
+ length = GetDeviceCaps(dialog.hDC, VERTRES);
+ xdpi = GetDeviceCaps(dialog.hDC, LOGPIXELSX);
+ ydpi = GetDeviceCaps(dialog.hDC, LOGPIXELSY);
+
+// fl_message("width=%d, length=%d, xdpi=%d, ydpi=%d, num_windows=%d\n",
+// width, length, xdpi, ydpi, num_windows);
+
+ HDC save_dc = fl_gc;
+ int fontsize = 14 * ydpi / 72;
+
+ fl_gc = dialog.hDC;
+ fl_push_no_clip();
+
+ // Get the time and date...
+ time_t curtime = time(NULL);
+ struct tm *curdate = localtime(&curtime);
+ char date[1024];
+
+ strftime(date, sizeof(date), "%c", curdate);
+
+ // Print each of the windows...
+ for (winpage = 0; winpage < num_windows; winpage ++) {
+ // Draw header...
+ StartPage(dialog.hDC);
+
+ fl_font(FL_HELVETICA_BOLD, fontsize);
+ fl_color(FL_BLACK);
+
+ fl_draw(basename, 0, fontsize);
+
+ fl_draw(date, 0.5 * (width - fl_width(date)), fontsize);
+
+ sprintf(buffer, "%d/%d", winpage + 1, num_windows);
+ fl_draw(buffer, width - fl_width(buffer), fontsize);
+
+ // Get window image...
+ uchar *pixels; // Window image data
+ int w, h; // Window image dimensions
+ int ww, hh; // Scaled size
+ int ulx, uly; // Upper-lefthand corner
+ Fl_Window *win; // Window widget
+ BITMAPINFO info; // Bitmap information
+
+ win = (Fl_Window *)(windows[winpage]->o);
+ pixels = windows[winpage]->read_image(w, h);
+
+ // Figure out the window size, first at 100 PPI and then scaled
+ // down if that is too big...
+ ww = w * xdpi / 100.0;
+ hh = h * ydpi / 100.0;
+
+ if (ww > width) {
+ ww = width;
+ hh = h * ww * ydpi / xdpi / w;
+ }
+
+ if (hh > (length - ydpi / 2)) {
+ hh = length - ydpi / 2;
+ ww = w * hh / h;
+ }
+
+ // Position the window in the center...
+ ulx = (width - ww) / 2;
+ uly = (length - hh) / 2;
+
+// fl_message("winpage=%d, ulx=%d, uly=%d, ww=%d, hh=%d",
+// winpage, ulx, uly, ww, hh);
+
+ // Draw a simulated window border...
+ int xborder = 4 * ww / w;
+ int yborder = 4 * hh / h;
+
+ win_box(ulx - xborder, uly - 5 * yborder,
+ ww + 2 * xborder, hh + 6 * yborder,
+ FL_GRAY);
+
+ fl_color(FL_BLUE);
+ fl_rectf(ulx, uly - 4 * yborder, ww, 4 * yborder);
+
+ fl_font(FL_HELVETICA_BOLD, 3 * yborder);
+ fl_color(FL_WHITE);
+ fl_draw(win->label() ? win->label() : "Window",
+ ulx + xborder, uly + yborder);
+
+ int x = ulx + ww - 4 * xborder;
+
+ win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder, FL_GRAY);
+ fl_color(FL_BLACK);
+ fl_line(x + xborder, uly + yborder,
+ x + 3 * xborder, uly + 3 * yborder);
+ fl_line(x + xborder, uly + 3 * yborder,
+ x + 3 * xborder, uly + yborder);
+ x -= 4 * xborder;
+
+ if (win->resizable()) {
+ win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder, FL_GRAY);
+ fl_color(FL_BLACK);
+ fl_rect(x + xborder, uly + yborder, 2 * xborder, 2 * yborder);
+ x -= 4 * xborder;
+ }
+
+ if (!win->modal()) {
+ win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder, FL_GRAY);
+ fl_color(FL_BLACK);
+ fl_line(x + xborder, uly + yborder, x + 3 * xborder, uly + yborder);
+ x -= 4 * xborder;
+ }
+
+ // Color image...
+ memset(&info, 0, sizeof(info));
+ info.bmiHeader.biSize = sizeof(info);
+ info.bmiHeader.biWidth = w;
+ info.bmiHeader.biHeight = -h;
+ info.bmiHeader.biPlanes = 1;
+ info.bmiHeader.biBitCount = 24;
+ info.bmiHeader.biCompression = BI_RGB;
+
+ StretchDIBits(dialog.hDC, ulx, uly, ww, hh, 0, 0, w, h, pixels,
+ &info, DIB_RGB_COLORS, SRCCOPY);
+
+ delete[] pixels;
+
+ // Show the page...
+ EndPage(dialog.hDC);
+ }
+
+ // Finish up...
+ EndDoc(dialog.hDC);
+
+ fl_gc = save_dc;
+ fl_pop_clip();
+
+ // Free the print DC and return...
+ DeleteDC(dialog.hDC);
}
#else
+// Load and show the print dialog...
+void print_menu_cb(Fl_Widget *, void *) {
if (!print_panel) make_print_panel();
print_load();