Форум программистов, компьютерный форум CyberForum.ru

Печать файла на принтере - 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)" (??$show@Urecord@@@@YAXQAUrecord@@HH@Z) в функции _main 1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl sort<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 секунду. Подскажите пожалуйста, как его можно ускорить, переписать, дописать. Код может вызвать шок! #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<long long> a; vector<long...
C++ Посчитать приблизительное значение функции sin по заданной формуле
Дальше решаю задачник Абрамяна через c++ Пришел на 23. Вот мое решение: #include <iostream> #include <conio.h> #include <math.h> using namespace std; double fact(int n) { int i,b=1; for (i=1; i<=n; i++)
C++ Чтение CSV-файла в двумерный массив http://www.cyberforum.ru/cpp-beginners/thread1506970.html
Есть файл вида:"TEXT,1,20140729,150700,73.3500000,73.5800000,73.3500000,73.4800000,2301260"Нужно собрать числа в двумерный массив. Количество строк в файле неизвестно. Попробовал использовать регулярные выражения. Но это очень долго. Есть способ побыстрее?#include "stdafx.h" #include <iostream> #include <regex> using namespace std; int main(int argc, char** argv) { const char...
C++ Не понимаю, какие в моем коде ошибки #include <iostream> char board = {'-','-','-','-','-','-','-','-','-',}; int get_move(){ std::cout <<"Move options:" << std::endl; std::cout <<"-7-|-8-|-9-" << std::endl; std::cout <<"-4-|-5-|-6-" << std::endl; std::cout <<"-1-|-2-|-3-" << std::endl; std::cout<<"\n"; подробнее

Показать сообщение отдельно
Геомеханик
 Аватар для Геомеханик
517 / 324 / 253
Регистрация: 26.06.2015
Сообщений: 738
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;
}
 
Текущее время: 02:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru