PDA

View Full Version : چاپ آيتمهاي مورد در listbox



m_zi
شنبه 22 فروردین 1388, 09:31 صبح
سلام
خسته نباشيد
من اطلاعاتي را در listbox نمايش مي دهم مي خواهم تمام آنها را بر روي پرينتر چاپ نمايم لطفاً مرا راهنمايي كنيد.
متشكر

m_zi
شنبه 22 فروردین 1388, 14:18 عصر
كار توي VB6 خيلي راحته ولي چون VC6 را تازه شروع كردم نمي دونم بالاخره كسي بايد باشه كه اين كار رو توي VC6 انجام داده باشه لطفاً كمكم كنيد .
ممنون

Nima_NF
شنبه 22 فروردین 1388, 22:51 عصر
یک راه این است که ابتدا با GetPrinterDC هندل پرینت پیش فرض را بگیرید. سپس StartDoc را فراخوانی کنید و بعد از آن StartPage تا تمامی صفحات (در صورتی که بیش از یک صفحه است) پرینت شود. بعد از آن هر چیزی که در DC پرینت بنویسید به جای اینکه در صفحه نمایش داده شود آماده برای پرینت می شود (توابعی مانند TextOut و ... )، در پایان نیز EndPage و EndDoc را فراخوانی کنید.
مثال:
http://msdn.microsoft.com/en-us/library/hx1625y5(VS.80).aspx (http://msdn.microsoft.com/en-us/library/hx1625y5%28VS.80%29.aspx)

روش دیگری هم وجود دارد که می توانید اطلاعات را در یک پنجره خالی با اندازه ها و در مکان مناسب ابتدا بنویسید، سپس متدهای این کار مانند OnPreparePrinting ، OnBeginPrinting و OnPrint و غیره را override کنیم (توابع مجازی در کلاس پنجره هستند)، سپس هر چیزی که در OnPrint می نویسید (مثلا همان OnDraw را کپی یا فراخوانی کنید) توسط پرینتر چاپ می شود.
مثال:
http://www.codersource.net/mfc_print_tutorial_1.html
http://www.ucancode.net/faq/MFC%20Tutorial-MFC_Print.htm

m_zi
شنبه 12 اردیبهشت 1388, 11:03 صبح
ممنون از راهنمايي خوبتون.
من مي خوام يك رشته را پرينت بگيرم و داخل رشته از n\ استفاده كردم تا يك قسمتي از رشته را در خط بعدي چاپ كند اما اين دستور را ناديده مي گيرد و همه رشته را پشت سر هم پرينت مي گيرد چه كار كنم تا بتوانم خط جديد را به پرينتر بفهمانم.

ممنون از راهنمايي شما

Nima_NF
شنبه 12 اردیبهشت 1388, 14:13 عصر
در هنگام پرینت این شما هستید که باید تعیین کنید در یک صفحه که می خواهید پرینت کنید در هر خط چند حرف از رشته قرار می گیرد. (با توجه به اندازه کاغذ پرینت)

یعنی خودتان باید رشته را به اندازه تعداد کارکتر مجاز در هر خط بشکنید و در یک حلقه for تنها یک خط را چاپ کنید. (در TextOut مقدار Y در پارامتر دوم را در هر مرحله برای هر خط تنظیم می کنید)

مثلا در مثال زیر با استفاده از EM_GETLINE یک خط را از یک EditBox چند خطه می گیرد.




for (iLine = 0 ; iLine < iLinesPerPage ; iLine++)
{
iLineNum = iLinesPerPage * iPage + iLine ;
if (iLineNum > iTotalLines)
break ;

*(int *) pstrBuffer = iCharsPerLine ;

TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer,
(int) SendMessage (hwndEdit, EM_GETLINE, (WPARAM) iLineNum,
(LPARAM) pstrBuffer));
}


کد فوق روشی هست که در کتاب windows programming استفاده می شود.

m_zi
شنبه 12 اردیبهشت 1388, 16:48 عصر
ممنون از راهنمايي شما ولي يك كم گيج شدم
من از روش http://www.codersource.net/mfc_print_tutorial_1.html كه شما گفتيد استفاده كردم و علاوه بر مشكل فوق الان ديدم كه اگر رشته ام فارسي باشد فونتهاي ناخوانا چاپ مي كند ولي با انگليسي مشكل ندارد
لطفاً راهنماييم كنيد.
متشكرم

Nima_NF
شنبه 12 اردیبهشت 1388, 18:49 عصر
- حتما پروژه را در حالت یونیکد کامپایل کنید و رشته ها هم یونیکد تعریف شوند. (مثلا اگر از CString استفاده نمی کنید به جای char از TCHAR و رشته ها را نیز با L یا _T همراه کنید.)

- برای پرینت در حالت فارسی حتما قبل از انجام پرینت فونت فارسی را در DC انتخاب کنید (SetFont) که قابلیت پرینت شدن داشته باشد.

-مهم تر از همه، فارسی راست به چپ هست، پس برای این کار به جای TextOut از DrawText استفاده کنید با تنظیم فلگ برای این کار.

m_zi
چهارشنبه 16 اردیبهشت 1388, 11:02 صبح
با سلام
خسته نباشيد
پرينت فارسي شد اما اندازه فونت خيلي كوچك است من چه جوري مي تونم سايز فونت را تغيير بدم .




if (prt.Dialog() == -1)
return;
CString str, str2;
int n,line=10;
CDC *hhj=prt.GetPrivateDC();
CGdiObject* pOldFont = (*hhj).SelectStockObject(SYSTEM_FONT);
prt.StartPrint();
prt.StartPage();
prt.Line(0);
line+=10;
(*hhj).TextOut(10, line,StrMsg1,strlen(StrMsg1));



يك قسمتي از كد من بصورت بالاست SYSTEM_FONT چيست و چگونه مي توانم سايز آن را تغيير بدم
با تشكر

Nima_NF
چهارشنبه 16 اردیبهشت 1388, 15:25 عصر
از SYSTEM_FONT برای پرینت استفاده نکنید، این فونت استاندارد ویندوز برای نمایش در دیالوگ ها و ... است. تغییر سایز آن هم کار درستی نیست.

از سایر فونت ها استفاده کنید، مثلا با CFont :



CFont opfont;
VERIFY(opfont.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial")); // lpszFacename


CClientDC dc(this);

CFont* myfont = dc.SelectObject(&opfont);

// use dc.TextOur or DrawText here

dc.SelectObject(myfont);
opfont.DeleteObject();


اندازه فونت را نیز در همان پارامترهای اول وارد کنید. نوع فونت نیز در پارامتر آخر.