Форум программистов, компьютерный форум, киберфорум
Наши страницы

Печать файла на принтере - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка 2019 с линковщиком в многофайловом приложении http://www.cyberforum.ru/cpp-beginners/thread1507137.html
не могу понять в чем тут проблема. выдает ошибки: 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl show<struct record>(struct record * const,int,int)"...
C++ Внедряемые компоненты и контейнеры OLE Здорова! Читаю тему внедряемые компоненты и контейнеры OLE. От неясно чем отличается embedding от linking и активация по месту? Добавлено через 2 минуты активация по месту это когда мы кликаем... http://www.cyberforum.ru/cpp-beginners/thread1507042.html
Медленное дерево отрезков C++
Приветствую. Пишу дерево отрезков для задачи нахождения сумм на отрезках. Оно работает, даже вроде правильно, но при массиве 105 и количестве запросов 105 не укладывается в 1 секунду. Подскажите...
C++ Посчитать приблизительное значение функции sin по заданной формуле
Дальше решаю задачник Абрамяна через c++ Пришел на 23. Вот мое решение: #include <iostream> #include <conio.h> #include <math.h> using namespace std; double fact(int n) { int i,b=1; for...
C++ Чтение CSV-файла в двумерный массив http://www.cyberforum.ru/cpp-beginners/thread1506970.html
Есть файл вида:"TEXT,1,20140729,150700,73.3500000,73.5800000,73.3500000,73.4800000,2301260"Нужно собрать числа в двумерный массив. Количество строк в файле неизвестно. Попробовал использовать...
C++ Не понимаю, какие в моем коде ошибки #include <iostream> char board = {'-','-','-','-','-','-','-','-','-',}; int get_move(){ std::cout <<"Move options:" << std::endl; std::cout <<"-7-|-8-|-9-" << std::endl; std::cout... подробнее

Показать сообщение отдельно
Геомеханик
703 / 509 / 361
Регистрация: 26.06.2015
Сообщений: 1,210
31.07.2015, 19:17
Вот набросал печать текущим принтером при помощи GDI.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include <windows.h>
#include <string>
#include <stdio.h>
#ifdef _MSC_VER
#pragma comment(lib, "winspool.lib")
#endif
static DWORD readfile(const TCHAR* filename, std::string& str);
static TCHAR* get_filename(TCHAR* d, const TCHAR* f);
 
//печать текстового файла текущим принтером
BOOL file_print(const TCHAR* filename, const TCHAR* fontname = TEXT("Lucida Console"), 
                int fsize = 9, DWORD charset = RUSSIAN_CHARSET){
    DWORD       err;
    std::string str;
    if((err = readfile(filename, str)) != ERROR_SUCCESS){
        SetLastError(err);
        return FALSE;
    }
 
    TCHAR pname[128];
//вдруг используется раритет
#if defined(_MSC_VER) && (_MSC_VER <= 1200)
    DWORD flags = PRINTER_ENUM_DEFAULT | PRINTER_ENUM_NAME;
    DWORD  size = 0, num = 0;
 
    EnumPrinters(flags, NULL, 2, NULL, 0, &size, &num);
    if(! size)
        return FALSE;
 
    BYTE* pbuf = (BYTE*)HeapAlloc(GetProcessHeap(), 0, size);
    if(pbuf == NULL)
        return FALSE;
 
    if(! EnumPrinters(flags, NULL, 2, pbuf, size, &size, &num) || (! num)){
        err = GetLastError();
        HeapFree(GetProcessHeap(), 0, pbuf);
        SetLastError(err);
        return FALSE;
    }
    lstrcpy(pname, ((LPPRINTER_INFO_2)pbuf)->pPrinterName);
    HeapFree(GetProcessHeap(), 0, pbuf);
#else
    DWORD size = sizeof(pname) / sizeof(pname[0]);
    if(! GetDefaultPrinter(pname, &size))             
        return FALSE;
#endif
 
    HDC pdc = CreateDC(NULL, pname, NULL, NULL);
    if(pdc == NULL)                 
        return FALSE;
 
    int   fch  = -MulDiv(fsize, GetDeviceCaps(pdc, LOGPIXELSY), 72);      
    HFONT font = CreateFont(fch, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, charset, 
                            OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, 
                            DEFAULT_PITCH, fontname); 
    if(font != NULL)
        SelectObject(pdc, font);
 
    INT arr[256];
    if(! GetCharWidth32A(pdc, 0, sizeof(arr)/sizeof(arr[0]) - 1, arr)){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font);
        SetLastError(err);
        return FALSE;
    }
 
    TEXTMETRICA ftm = {0};
    if(! GetTextMetricsA(pdc, &ftm)){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font);
        SetLastError(err);
        return FALSE;
    }
        
    INT left   = GetDeviceCaps(pdc, PHYSICALOFFSETX);
    INT top    = GetDeviceCaps(pdc, PHYSICALOFFSETY);        
    INT width  = GetDeviceCaps(pdc, HORZRES);  
    INT height = GetDeviceCaps(pdc, VERTRES);
    INT  marx  = width  * 5 / 100;
    INT  mary  = height * 3 / 100;
 
    left   += marx;
    top    += mary;
    width  -= marx;
    height -= mary;
        
    const UCHAR* t, *pa, *pb, *p = (const UCHAR*)str.c_str();
    INT px, py;
 
    DOCINFO doc = {0};
    doc.cbSize       = sizeof(doc);
    doc.lpszDocName  = get_filename(pname, filename);
    doc.lpszDatatype = TEXT("EMF");
 
    if(StartDoc(pdc, &doc) < 0){
        err = GetLastError();
        DeleteDC(pdc);
        DeleteObject(font); 
        SetLastError(err);              
        return FALSE;
    }
 
    py = height;
    while(*p){
        if(py >= height){
            if(StartPage(pdc) < 0)
                goto error;
            py = top;
        }
 
        pa = p;
        px = left;
        while(*p && (*p != '\n') && (px < width))
            px += arr[*p++];
        pb = p;
 
        if(px >= width){
            for(t = --pb; pb > pa; --pb){
                px -= arr[*pb];
                if((px < width) && (*pb == ' '))
                    break;
            }
            if(pb <= pa)
                pb = t;
        }
 
        if(pa < pb)
            TextOutA(pdc, left, py, (LPCSTR)pa, (int)(INT_PTR)(pb - pa));
 
        py += ftm.tmHeight;
        p   = (*pb == '\n') ? pb + 1 : pb;
        p   = (*p == ' ' && *(p + 1) != ' ') ? p + 1 : p;
                
        if((py >= height) || (! *p)){                  
            if(EndPage(pdc) < 0)
                goto error;        
        }
    }
    EndDoc(pdc);
    DeleteDC(pdc);
    if(font != NULL)
        DeleteObject(font);        
    return TRUE;
error:
    err = GetLastError();
    AbortDoc(pdc);
    DeleteDC(pdc);
    if(font != NULL)
        DeleteObject(font); 
    SetLastError(err);
    return FALSE;
}
 
 
int main(void) {
    TCHAR fn[] = TEXT("file.txt");
    if(file_print(fn))
        puts("print textfile.");
    else
        fprintf(stderr, "code error: %lu\n", GetLastError());
    getchar();
    return 0;
}
 
 
//чтение текстового файла в строку
static DWORD readfile(const TCHAR* filename, std::string& str){
    HANDLE fp = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, 
                           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(fp == INVALID_HANDLE_VALUE)
        return GetLastError();
 
    char  buf[512];
    DWORD num;
    BOOL  ret;
    for(str = ""; ; ){
        num = 0;
        ret = ReadFile(fp, buf, sizeof(buf)-1, &num, NULL);
        if(ret && (num == 0))
            break;
        else if(! ret)
            goto error;
 
        buf[num] = '\0';
        for(char* p = &buf[0]; *p; ++p){
            if(*p == '\t')
                str.append("        ");
            else if(*p == '\r')
                continue;
            else
                str += *p;
        }
    }
    CloseHandle(fp);
    return ERROR_SUCCESS;
error:
    DWORD err = GetLastError();
    CloseHandle(fp);
    return err;
}
 
//получение имени файла из пути
static TCHAR* get_filename(TCHAR* d, const TCHAR* f){
    const TCHAR* p;
    TCHAR* t = d;
    for(p = NULL; *f; ++f){
        if(*f == TEXT('\\'))
            p = f;
    }
    if(p != NULL){
        while(*p && (*p != TEXT('.')))
            *d++ = *p++;
        *d = TEXT('\0');
    } else
        lstrcpy(d, TEXT("textfile"));
    return t;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.