PDA

View Full Version : به دست آوردن ارتفاع فونت



emad_67
شنبه 20 مرداد 1386, 23:16 عصر
با سلام
فرض کنید یه همچین تابعی داریم


private void prtpage(object sender,PrintPageEventArgs e)
{
Font obj = new Font("Arial", 10);
float height=obj.GetHeight(e.Graphics)
}

سوال من اینه که e.Graphics چی هست و چرا باید به تابع Getheight ارسال بشه؟
آیا اصلا تابع Getheight ارتفاع فونت رو مشخص میکنه ؟ چون من تو msdn دیدم که نوشته بود این تابع ارتفاع line spacing رو بر میگردونه

PC2st
شنبه 20 مرداد 1386, 23:53 عصر
سوال من اینه که e.Graphics چی هست و چرا باید به تابع Getheight ارسال بشه؟
e.Graphics شیئی است که برای دسترسی به نمای ظاهری یک کنترل به کار گرفته میشه و اگر این شیئ رو به متد GetHeight بفرستیم، متد GetHeight ارتفاع فونت رو بر اساس واحد موجود در شیئ e.Graphics مشخص میکنه.


آیا اصلا تابع Getheight ارتفاع فونت رو مشخص میکنه ؟
بله، چون ارتفاع یک خط رو از روی ارتفاع فونت تشخیص میدهند...

hdv212
شنبه 20 مرداد 1386, 23:57 عصر
برای به دست آوردن ارتفاع فونت از تابع MeasureString استفاده کن که یه آبجکت SizeF برمیگردونه(یه جستجو توی msdn بکن، دقیقا یادم نیست)

mehdi.mousavi
یک شنبه 21 مرداد 1386, 00:02 صبح
با سلام
فرض کنید یه همچین تابعی داریم


private void prtpage(object sender,PrintPageEventArgs e)
{
Font obj = new Font("Arial", 10);
float height=obj.GetHeight(e.Graphics)
}
سوال من اینه که e.Graphics چی هست و چرا باید به تابع Getheight ارسال بشه؟
آیا اصلا تابع Getheight ارتفاع فونت رو مشخص میکنه ؟ چون من تو msdn دیدم که نوشته بود این تابع ارتفاع line spacing رو بر میگردونه


سلام.
Graphics در واقع Object ای هستش که از روی Device Context ساخته شده و امکان انجام عملیات گرافیکی رو در .NET مهیا میکنه. اما اینکه چرا باید به تابع GetHeight ارسال بشه... برای اینکه Line Spacing یه فونت رو بشه محاسبه کرد، باید اول فهمید که تو چه DPI اون فونت قراره استفاده بشه. اگر دقت کرده باشید، Graphics دو Property داره به اسم DpiX و DpiY. با استفاده از DpiY که از طریق Graphics بدست میاد، تابع GetHeight ارتفاع فونت رو محاسبه و بر میگردونه.

اما ممکنه این سوال پیش بیاد که اگر به DpiY برای محاسبه Height نیاز باشه، پس چرا یکی از Overload های تابع GetHeight هیچ پارامتری نمیگیره. تو این شرایط DpiY از کجا میاد؟ در جواب به این سوال باید خدمتتون عرض کنم که این Overload از متود GetHeight در حقیقت از Internal Property ای به نام DefaultGraphics که روی Graphics تعریف شده، استفاده میکنه. چون Internal تعریف شده، ما از بیرون بهش دسترسی نداریم.

emad_67
یک شنبه 21 مرداد 1386, 00:21 صبح
با تشکر از دوستان


اما اینکه چرا باید به تابع GetHeight ارسال بشه... برای اینکه Line Spacing یه فونت رو بشه محاسبه کرد،

منظور از line spacing یه فونت فضای خالی بین دو خطه یا نه؟ چون در آخر گفتین که ارتفاع فونت رو بر میگردونه اگه اینجوری باشه با نوشتن این خط


linePerPage=e.MarginBounds.Height/objfont.GetHeight(e.Graphics);

اگه بخوایم تعداد خطوط برای چاپ توی صفحه رو به دست بیاریم دیگه نباید فاصله ای بین خطوط باشه , یعنی تمام خط ها به هم می چسبند

PC2st
یک شنبه 21 مرداد 1386, 00:27 صبح
شاید اشتباه میکنم ولی هر فونت دارای مقداری فضای خالی در اطرافش خواهد بود، پس خطها با هم قاطی نمیشه.

mehdi.mousavi
یک شنبه 21 مرداد 1386, 01:02 صبح
با تشکر از دوستان

منظور از line spacing یه فونت فضای خالی بین دو خطه یا نه؟ چون در آخر گفتین که ارتفاع فونت رو بر میگردونه اگه اینجوری باشه با نوشتن این خط


linePerPage=e.MarginBounds.Height/objfont.GetHeight(e.Graphics);
اگه بخوایم تعداد خطوط برای چاپ توی صفحه رو به دست بیاریم دیگه نباید فاصله ای بین خطوط باشه , یعنی تمام خط ها به هم می چسبند


سلام.
منظورم از ارتفاع فونت، ارتفاع نوشته نبود. اگر به MSDN دقت کنید، Line Spacing رو به اینصورت تعریف کرده:

"Line Spacing یک فونت فاصله عمودی بین خطوط پایه دو خط متوالی از متن است. بنابراین، Line Spacing عبارت است از فضاهای خالی بین خطوط + ارتفاع خود کاراکتر."

اگر ارتفاع فونت (یعنی ارتفاع کاراکتر) رو بخواهیم، میتونیم از TextRenderer.MeasureString یا Graphics.MeasureString استفاده کنیم.