Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/23: Рейтинг темы: голосов - 23, средняя оценка - 4.78
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73

Работа с функциями печати(win 32 API PrintDlg)

22.04.2011, 23:35. Показов 4720. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Необходимо вызвать диалог установки печати через функцию PrintDlg. В коде обработки события кнопки пишу следующий код (но диалог не вызывается, помогите найти ошибку):

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
void __fastcall TForm1::Button2Click(TObject *Sender)
{ 
PRINTDLG lppd;
 lppd.lStructSize = sizeof(PRINTDLG);
 lppd.hDevMode =  NULL;
 lppd.hDevNames =  NULL;
 lppd.Flags = PD_RETURNDC;
 lppd.hwndOwner = GetActiveWindow();
 lppd.hDC = (HDC) NULL;
 lppd.nFromPage = 1;
 lppd.nToPage = 1;
 lppd.nMinPage = 0;
 lppd.nMaxPage = 0;
 lppd.nCopies = 1;
 lppd.hInstance = (HANDLE) NULL;
 lppd.lCustData = 0;
 lppd.lpfnPrintHook = (LPPRINTHOOKPROC) NULL;
 lppd.lpfnSetupHook = (LPSETUPHOOKPROC) NULL;
 lppd.lpPrintTemplateName = (LPSTR) NULL;
 lppd.lpSetupTemplateName = (LPSTR)  NULL;
 lppd.hPrintTemplate = (HANDLE) NULL;
 lppd.hSetupTemplate = (HANDLE) NULL;
 PrintDlg(&lppd);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2011, 23:35
Ответы с готовыми решениями:

WIN API Работа с функциями
И снова я, тут решил попробывать попрограммировать на WINAPI но столкнулся с проблемой в VS2005 Как использовать функции ? допустим ...

Работа с Win API функциями в Visual Basic.NET
Подскажите книги или киньте ссылки на сайты в которых описаны Win API функции .

Работа с API функциями из C#
Здравствуйте друзья!!! 1) Как мне сделать чтоб моя программа (язык C#) не "реагировала" на Alt+F4 и небыло ее видно в диспетчере...

19
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.04.2011, 23:50
ошибки-предупреждения есть ? попробуйте просто
C++
1
2
lppd.lpPrintTemplateName = NULL;
lppd.lpSetupTemplateName = NULL;
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.04.2011, 23:54
ваш код, ваш диалог:
Миниатюры
Работа с функциями печати(win 32 API PrintDlg)  
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
23.04.2011, 00:30  [ТС]
Я пишу в C++ Builder 6 и этот код не открывает диалог! Возможно ли это быть из-за каких-то настроек?Предупреждений никаких нет.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.04.2011, 00:37
код где брал?
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
23.04.2011, 00:41  [ТС]
Преподаватель писал! Мы ему сказали, что не работает! он сказал, чтобы сами разбирались. Главное в книгах про эту функцию ничего найти не могу!Если подскажите какую нибудь хорошую книжку буду очень благодарен.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.04.2011, 00:55
http://www.vsokovikov.narod.ru... intdlg.htm
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
23.04.2011, 00:59  [ТС]
Спасибо! Но с этим я уже разбирался функция все равно не заработала. А вы на чем пробовали этот код? У вас он нормально запустился?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.04.2011, 01:09
Структура PRINTDLG

Добавлено через 1 минуту
да, прикрепленная ранее картинка свежая, RАD XE, Windows7
http://www.vsokovikov.narod.ru... nt_dlg.htm еще код

Добавлено через 6 минут
вы хотели почитать
http://www.firststeps.ru/mfc/w... a/r.php?73
http://www.firststeps.ru/mfc/w... a/r.php?55
http://www.firststeps.ru/mfc/w... a/r.php?28
http://www.firststeps.ru/mfc/w... a/r.php?42
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
23.04.2011, 01:09  [ТС]
Код тоже не работает. А вот теорию перечитаю еще разок, может что и найдется! Огромное спасибо, что помогаете!
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.04.2011, 01:14
убрать перед нулями пробовал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PRINTDLG lppd;
lppd.lStructSize = sizeof(PRINTDLG);
lppd.hDevMode = NULL;
lppd.hDevNames = NULL;
lppd.Flags = PD_RETURNDC;
lppd.hwndOwner = GetActiveWindow();
lppd.hDC = (HDC) NULL;
lppd.nFromPage = 1;
lppd.nToPage = 1;
lppd.nMinPage = 0;
lppd.nMaxPage = 0;
lppd.nCopies = 1;
lppd.hInstance = NULL;
lppd.lCustData = 0;
lppd.lpfnPrintHook = NULL;
lppd.lpfnSetupHook = NULL;
lppd.lpPrintTemplateName = NULL;
lppd.lpSetupTemplateName = NULL;
lppd.hPrintTemplate = NULL;
lppd.hSetupTemplate = NULL;
PrintDlg(&lppd);
?
1
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
24.04.2011, 14:53  [ТС]
Не заметил это сообщение)) пробовал все равно не работает( у меня почему-то функция выполняется с ошибкой(,те 0 возвращает
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
24.04.2011, 15:45
C++
1
pd.lStructSize = 66;
2
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
24.04.2011, 16:03  [ТС]
Всем огромное спасибо!Все заработало! а почему размер должен быть 66???
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
24.04.2011, 16:07
на другом форуме такая же проблема. почему sizeof возвращает 68, а надо 66 - не выяснили
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
24.04.2011, 16:23  [ТС]
а сколько занимают вот следющие форматы?DWORD =4байта? , HWND ,HANDLE ,HDC, LPPRINTHOOKPROC=4 байта?, LPCTSTR, HINSTANCE? Они кокраз в структуре присутвуют.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
24.04.2011, 16:29
необязательно это знать, просто запомни число 66

чтобы узнать, сколько занимает места какой-нибудь тип
C++
1
ShowMessage(sizeof(DWORD));
0
7 / 7 / 6
Регистрация: 22.04.2011
Сообщений: 73
24.04.2011, 16:45  [ТС]
а тут он точно все правильно вернет?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
24.04.2011, 18:19
Цитата Сообщение от Lucifer91 Посмотреть сообщение
на чем пробовали этот код?
пробовал на RAD XE - диалог выводит, размер определяет без лишних телодвижений:
Миниатюры
Работа с функциями печати(win 32 API PrintDlg)   Работа с функциями печати(win 32 API PrintDlg)  
0
Al_1
30.05.2013, 09:30
Цитата Сообщение от kzru_hunter Посмотреть сообщение
необязательно это знать, просто запомни число 66
Лучше знать, чем не знать

Если в опциях проекта стоит выравнивание 4 байта, а 4-байтовое поле начинается со смещения некратного 4, то перед этим полем автоматически выполняется выравнивание (вставляются дополнительные байты выравнивания).

Привожу описание структуры с размерами полей:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef struct tagPD 
{
    DWORD     lStructSize;           // 4
    HWND      hwndOwner;             // + 4 = 8
    HANDLE    hDevMode;              // + 4 = 12
    HANDLE    hDevNames;             // + 4 = 16
    HDC       hDC;                   // + 4 = 20
    DWORD     Flags;                 // + 4 = 24
    WORD      nFromPage;             // + 2 = 26 
    WORD      nToPage;               // + 2 = 28
    WORD      nMinPage;              // + 2 = 30
    WORD      nMaxPage;              // + 2 = 32
    WORD      nCopies;               // + 2 = 34
                                     // + 2 = 36  2 байта добавляются для выравнивания структуры до 4 байт (см. опции проекта)
    HINSTANCE hInstance;             // + 4 = 40
    DWORD     lCustData;             // + 4 = 44
    LPPRINTHOOKPROC lpfnPrintHook;   // + 4 = 48
    LPSETUPHOOKPROC lpfnSetupHook;   // + 4 = 52
    LPCTSTR    lpPrintTemplateName;  // + 4 = 56
    LPCTSTR    lpSetupTemplateName;  // + 4 = 60
    HANDLE    hPrintTemplate;        // + 4 = 64
    HANDLE    hSetupTemplate;        // + 4 = 68
} PRINTDLG;
Если установить lStructSize = 66, то это не решает проблему, а маскирует ее. Полям hInstance, lCustData и ниже доверия нет (все они оказываются смещены на 2 байта).

Если в опциях проекта поставить выравнивание 1 байт или 2 байта то sizeof(PRINTDLG) будет равен 66.

P.S. Аналогичная проблема возникает при создании файлов BMP (заголовчная структура BMP-файла тоже не выровнена).

Добавлено через 1 час 2 минуты
Форум отредактировать не дает. Поэтому напишу дополнение:

Сообщение выше написано исходя из теории. Практика показала, что никакие выравнивания при сборке в С++Builder 6 не помогли.

Добавлено через 15 часов 8 минут
В файле c:\CBuilder6\Include\commdlg.h структуры PRINTDLGA и PRINTDLGW поместил между директивами выравнивания:

#pragma pack(push, 2)
...
#pragma pack(pop)

Структура стала выдавать верный размер и диалог печати запустился.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2013, 09:30
Помогаю со студенческими работами здесь

Работа с win API
Подскажите пожалуйста где и что можно почитать, что бы разобраться что такое API и с чем его едят. Я раньше с API не как не работал.

WIN API C++ Работа с FAT
Доброго времени суток. У меня задание: Программа просматривает все каталоги в поисках файлов с одинаковым именем, после чего...

Работа с клавиатурой win api
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rect); InvalidateRect(hWnd, NULL, TRUE); hdc =...

Работа с устройством через Win API
Переделываю статичный lib написанный в Builder на си шарп. Код открывает устройство и работает с ним через драйвер. Первую функцию...

Работа с файлами средствами Win API.
Написать программу , которая отображает информацию об используемых файлах и режимах работы с ними в текстовом виде. Добавлено через 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru