كيفية تعديل إعدادات الطابعة باستخدام دالة DocumentProperties()


ملخص


استخدام بنية DEVMODE لتعديل إعدادات الطابعة أكثر صعوبة من مجرد تغيير حقول البنية. وبوجه خاص، بنية DEVMODE صحيح لجهاز يحتوي على البيانات الخاصة التي يمكن تعديلها فقط بواسطة الدالة DocumentProperties() .

توضح هذه المقالة كيفية تعديل محتويات بنية DEVMODE مع الدالة DocumentProperties() .

مزيد من المعلومات


يحتوي على بنية DEVMODE كما هو موثق ب SDK Win32، عام أو "الجهاز بيانات مستقلة" وخاصة أو "الجهاز البيانات التابعة". يوجد جزء خاص من DEVMODE فور الجزء العام، التي تعرف بنية DEVMODE ، في مخزن مؤقت من الذاكرة قريبة.

برنامج يمكن التنبؤ حجم المخزن المؤقت هذا لأنها تختلف عن الطابعة للطابعة ومن إصدار لبرنامج تشغيل الطابعة. بالإضافة إلى ذلك، لا يتضمن بنية DEVMODE التي تم تعريفها فقط عن طريق برنامج مساحة كافية للبيانات على الجهاز الخاص. إذا كان يتم تمرير المخزن مؤقت DEVMODE التي تفتقر إلى البيانات الخاصة بالوظائف مثل DocumentProperties()و ResetDC()و createdc ()، قد تفشل الوظيفة.

لاستخدام DEVMODE أمانة مع برنامج تشغيل جهاز، إنشاء وتعديل باتباع الخطوات التالية:

  1. تحديد حجم المخزن المؤقت من الجهاز المطلوبة ومن ثم تخصيص ذاكرة كافية لذلك.

    DocumentProperties() إرجاع عدد وحدات البايت التي تكون مطلوبة للمخزن مؤقت DEVMODE عند تعيين المعلمة الأخيرة إلى 0. يستخدم نموذج التعليمة البرمجية في هذه المقالة هذا الأسلوب لتحديد حجم المخزن المؤقت الصحيح. يستخدم نموذج التعليمة البرمجية ثم وظيفة تخصيص الذاكرة وقت التشغيل C malloc () لتخصيص المخزن مؤقت كبيرا بشكل كاف. لأن DocumentProperties() ووظائف مثل ResetDC() و createdc () تأخذ المؤشرات DEVMODE كمعلمة، يمكن تخصيص معظم تطبيقات الذاكرة التي تم تناولها بواسطة مؤشر.

    إلا أن وظائف مثل المشتركة PrintDlg() يأخذ المعلمات المطلوبة لتكون مقابض للذاكرة العمومية. إذا كان برنامج يستخدم المخزن المؤقت DEVMODE النهائية كمعلمة لواحدة من هذه المهام، ينبغي تخصيص ذاكرة باستخدام globalalloc () والحصول على مؤشر إلى المخزن المؤقت باستخدام globallock ().
  2. طلب برنامج تشغيل الجهاز لتهيئة المخزن المؤقت DEVMODE مع الإعدادات الافتراضية.

    نموذج التعليمات البرمجية باستدعاء DocumentProperties() مرة ثانية تهيئة المخزن المؤقت المحدد باستخدام الإعدادات الافتراضية الحالية. DocumentProperties() تعبئة المخزن المؤقت المشار إليها كمعلمة بديفموديوتبوت باستخدام إعدادات الطابعة الحالية عندما يتم تمرير الأوامر DM_OUT_BUFFER في المعلمة fMode.
  3. إجراء تغييرات على الجزء العام من DEVMODE وطلب برنامج تشغيل الجهاز لدمج التغييرات في الجزء الخاص DEVMODE عن طريق استدعاء DocumentProperties().

    بعد تهيئة المخزن المؤقت باستخدام الإعدادات الحالية في الخطوة 2، نموذج التعليمة البرمجية بإجراء تغييرات على الجزء العلني من DEVMODE. راجع وثائق Win32 SDK للحصول على وصف أعضاء DEVMODE . نموذج التعليمات البرمجية هذا يحدد ما إذا كانت الطابعة استخدام إعدادات الطباعة المزدوجة (الجانبين) والاتجاه ويتغير على نحو ملائم.

    ملاحظة: علامة في عضو dmFields DEVMODE إشارة إلى أن طابعة تستخدم عضو بنية مقترنة. طابعات العديد من الخصائص الفيزيائية مختلفة وقد تدعم ذلك، مجموعة فرعية إمكانيات توثيق DEVMODE فقط. لتحديد إعدادات الحقل ل DEVMODE المعتمدة، يجب أن تستخدم التطبيقات DeviceCapabilities().



    نموذج التعليمة البرمجية ثم إجراء مكالمة أخرى ل DocumentProperties() وتمرير المخزن المؤقت DEVMODE في محددات بديفمودينبوت وبديفموديوتبوت. أيضا تمرير الأوامر المركبة DM_IN_BUFFER و DM_OUT_BUFFER في المعلمة fMode باستخدام عامل OR("|"). هذه الأوامر بتعريف الدالة على اتخاذ أي الإعدادات مضمنة في المخزن المؤقت للإدخال ودمجها مع الإعدادات الحالية للجهاز. ثم يكتب النتيجة إلى المخزن المؤقت المحدد في معلمة الإخراج.
ملاحظة: يشير DocumentProperties() إلى طابعة معينة بواسطة مؤشر إلى طابعة: هبرينتير. يتم الحصول على هذا المؤشر من OpenPrinter()، الذي يوضح أيضا نموذج التعليمات البرمجية. يتطلب OpenPrinter() اسم الطابعة، يتم عادة الاسم المألوف للطابعة كما يظهر في shell الخاص بنظام التشغيل. يمكن الحصول على هذا الاسم من EnumPrinters()من بنية DEVNAMES يتم إرجاعها بواسطة PrintDlg()أو من "الطابعة الافتراضية".

للحصول على معلومات إضافية حول الطابعة الافتراضية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

246772 كيفية استرداد وتعيين الطابعة الافتراضية في Windows
ملاحظة: في هذه المقالة، يتم تنفيذ الخطوتين الأولى والثانية لتخصيص حجم المخزن المؤقت الصحيح وتهيئة هذا المخزن المؤقت مع DocumentProperties(). يمكنك أيضا اتباع الخطوات باستخدام GetPrinter(). للحصول على معلومات إضافية ومثال ذلك، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

كيفية تعديل إعدادات الطابعة باستخدام SetPrinter 140285

نموذج لتعليمة برمجية

نموذج التعليمات البرمجية التالي الخطوات الثلاث للحصول على وتغيير المخزن المؤقت DEVMODE. الدالة يأخذ طابعة مسماة وتكوين DEVMODE الطباعة على الوجهين وفي اتجاه أفقي إذا كان يدعم هذه الميزات. DEVMODE الناتجة التي يتم إرجاعها إلى المستدعي مناسبة لاستدعاءات API الأخرى تستخدم مخازن DEVMODE، مثل createdc () SetPrinter()، PrintDlg()أو ResetDC(). عند اكتمال المتصل باستخدام المخزن المؤقت DEVMODE، الطالب المسؤول عن تحرير الذاكرة.

   LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
{

HANDLE hPrinter;
LPDEVMODE pDevMode;
DWORD dwNeeded, dwRet;

/* Start by opening the printer */
if (!OpenPrinter(pDevice, &hPrinter, NULL))
return NULL;

/*
* Step 1:
* Allocate a buffer of the correct size.
*/
dwNeeded = DocumentProperties(hWnd,
hPrinter, /* Handle to our printer. */
pDevice, /* Name of the printer. */
NULL, /* Asking for size, so */
NULL, /* these are not used. */
0); /* Zero returns buffer size. */
pDevMode = (LPDEVMODE)malloc(dwNeeded);

/*
* Step 2:
* Get the default DevMode for the printer and
* modify it for your needs.
*/
dwRet = DocumentProperties(hWnd,
hPrinter,
pDevice,
pDevMode, /* The address of the buffer to fill. */
NULL, /* Not using the input buffer. */
DM_OUT_BUFFER); /* Have the output buffer filled. */
if (dwRet != IDOK)
{
/* If failure, cleanup and return failure. */
free(pDevMode);
ClosePrinter(hPrinter);
return NULL;
}

/*
* Make changes to the DevMode which are supported.
*/
if (pDevMode->dmFields & DM_ORIENTATION)
{
/* If the printer supports paper orientation, set it.*/
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
}

if (pDevMode->dmFields & DM_DUPLEX)
{
/* If it supports duplex printing, use it. */
pDevMode->dmDuplex = DMDUP_HORIZONTAL;
}

/*
* Step 3:
* Merge the new settings with the old.
* This gives the driver an opportunity to update any private
* portions of the DevMode structure.
*/
dwRet = DocumentProperties(hWnd,
hPrinter,
pDevice,
pDevMode, /* Reuse our buffer for output. */
pDevMode, /* Pass the driver our changes. */
DM_IN_BUFFER | /* Commands to Merge our changes and */
DM_OUT_BUFFER); /* write the result. */

/* Finished with the printer */
ClosePrinter(hPrinter);

if (dwRet != IDOK)
{
/* If failure, cleanup and return failure. */
free(pDevMode);
return NULL;
}

/* Return the modified DevMode structure. */
return pDevMode;

}