Как уже говорили другие, это потому, что, как правило, разрешение дисплея принтеров намного выше, чем у дисплеев. Дисплеи обычно имеют разрешение от 96 до 120 точек на дюйм: при значении 96 точек на дюйм это означает, что изображение размером 96 пикселей (точек) на 96 пикселей занимает приблизительно 1 квадратный дюйм на дисплее. Однако если вы просто возьмете это изображение и распечатаете его на принтере с разрешением 600 точек на дюйм, размер изображения будет примерно 1/6 "на 1/6" - намного меньше. Это проклятие издательского мира - изображения, которые хорошо выглядят на экранах, при печати часто выглядят крошечными или ужасными.
Вы можете, как уже было предложено, использовать StretchBlt вместо BitBlt для увеличения изображения. В зависимости от разницы между вашим дисплеем и принтером, это может выглядеть либо блочно, либо совершенно ужасно блочно.
Гораздо лучший вариант - переписать ваш код, который рисует элемент управления, чтобы у вас был метод, который берет контекст устройства (и некоторые координаты) и рисует в нем. Ваш обычный код рисования окна может передать DC памяти в эту процедуру, а затем BitBlt результат в окно, и ваш код рисования может вызвать этот метод с DC принтера и некоторыми подходящими координатами.
При написании этой подпрограммы вам придется беспокоиться о масштабировании: например, вам нужно будет создать шрифты для данного контекста устройства и с размером, не зависящим от масштабирования (то есть указать размер шрифта в точках, не пикселей), а не полагаться на предварительно созданный шрифт.