CDialog 设置字体问题?

Forrest 2011-04-16 02:07:24
请问一下大家,我做的对话框上改变字体怎么比实际的小!

例如设置12号字体 ,显示的基本上看不见?

上面的字体示例 是100号字体?怎么才那么小?

我想达到的目的,就是在对话框上设置字体,并示例框预览效果,再把字体设置到 View类中,显示;

怎么我设置的字体不想Word中的设置字体一样,设置初号字体的大小几乎看不见;

我的代码如下;

HBRUSH CSet1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if(CTLCOLOR_STATIC==nCtlColor)
{
if(pWnd->GetDlgCtrlID()==IDC_FONTEXA)
{
CRect sRc;
pWnd->GetClientRect(&sRc);
if(m_bFirst==TRUE)
{
CFont font;
CBrush brush;
brush.CreateSolidBrush(m_BColor);
CBrush *pOldb=pDC->SelectObject(&brush);
pDC->SetBkColor(m_BColor);
pDC->SetTextColor(m_FColor);
font.CreatePointFontIndirect(&m_LF);
CFont *pOldFont=pDC->SelectObject(&font);
pDC->DrawText(m_sExam,&sRc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);

pDC->SelectObject(pOldFont);
//return (HBRUSH)brush;
}
//pDC->DrawText(m_sExam,&sRc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);

}
}
}

我跟踪调试了一下,数据是设置到目的字体变量里了,怎么就是View 显示文本 的时候比设置的小很多?
...全文
503 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-05-17
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
Forrest 2011-04-29
  • 打赏
  • 举报
回复
HDC hdc = ::GetDC(NULL);
int iLogPixelsY = ::GetDeviceCaps( hdc, LOGPIXELSY );// iLogPixelsY 这个变量会根据字体 大小获得不同的值;
logFont.lfHeight = ::MulDiv( 12, iLogPixelsY, 72 );

Forrest 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bokutake 的回复:]
因为为了保证DPI设置不同时能正常显示。72是常数,12是字体的磅值。
一磅等于1/72英寸。
[/Quote]

哦,您能不能帮我普及一下 ,仕么事 DPI ? 1/72 英寸是一个仕么概念的度量单位?
Forrest 2011-04-24
  • 打赏
  • 举报
回复
哦,非常感谢楼上的解答!
辰岡墨竹 2011-04-24
  • 打赏
  • 举报
回复
DPI是像素每英寸,Windows里默认的字体设置是96DPI,在17存普屏液晶上正好能达到一英寸的精确显示。常见的其它设置有120DPI等等。如果你的显示器点距太小,就需要增大DPI设置,让系统绘制更大的字体。
Windows并不知道显示器到底显示成多大尺寸。它只能根据你给出的DPI确定一个虚拟的度量单位,然后按点去绘制。
磅是字体印刷时的字号大小单位,它是1⁄72.27英寸。Windows里把它取整到1/72英寸,这个是常量。
比如9磅的字体,乘以96再除以72,得到12像素,这个是应该绘制在屏幕的绝对大小。如果你改成DPI为120的话,就是15像素。
同样打印机也有自己的每英寸点数PPI,比如300PPI,这个和DPI类似,只有这样才能确保同样的字号在不同设备输出时大小是一样的。
辰岡墨竹 2011-04-23
  • 打赏
  • 举报
回复
因为为了保证DPI设置不同时能正常显示。72是常数,12是字体的磅值。
一磅等于1/72英寸。
Forrest 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]
不是有现成的字体对话框么
[/Quote]

我知道啊,你可能误解我的意思了,我是说保存字体,在把保存的字体设置到对话框中,就和原来设置的不一样大小? 不知仕么原因?

后来我用 2楼 的方法 总算 搞的可以调整大小了,但是还是有误差,很难掌握哪个公式
logFont.lfHeight = ::MulDiv( 12, iLogPixelsY, 72 );
的常数大小?

向立天 2011-04-21
  • 打赏
  • 举报
回复
不是有现成的字体对话框么
wj709830140 2011-04-21
  • 打赏
  • 举报
回复
压力很大~
Forrest 2011-04-21
  • 打赏
  • 举报
回复
这个帖子千万被沉了啊, 我的问题还没解决??
HBRUSH CSet1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if(CTLCOLOR_STATIC==nCtlColor)
{
if(pWnd->GetDlgCtrlID()==IDC_FONTEXA)
{
//pDC->SetBkColor(m_BColor);
//pDC->SetTextColor(m_FColor);
CRect sRc;
pWnd->GetClientRect(&sRc);
//sRc.InflateRect(4,4,4,4);
//ClientToScreen(&sRc)
if(m_bFirst==TRUE)
{
CFont font;
CBrush brush;
brush.CreateSolidBrush(m_BColor);
pDC->SetMapMode(MM_TEXT);
CBrush *pOldb=pDC->SelectObject(&brush);
pDC->SetBkColor(m_BColor);
pDC->SetTextColor(m_FColor);
//int i=pDC->SetBkMode(TRANSPARENT);
font.CreatePointFontIndirect(&m_LF);
//font.Create
CFont *pOldFont=pDC->SelectObject(&font);
pWnd->SetFont(&font);
//pWnd->SetWindowTextW(m_sExam);
//pDC->TextOutW(20,12,m_sExam);
pDC->DrawText(m_sExam,&sRc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);

pDC->SelectObject(pOldFont);
//return (HBRUSH)brush;
//pDC->SelectObject(pOldb);
//pDC->SetBkMode(i);
}
//pDC->DrawText(m_sExam,&sRc,DT_CENTER|DT_SINGLELINE|DT_VCENTER);

}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

void CSet1::OnBnClickedWatchfont()
{
// TODO: Add your control notification handler code here

if(IDOK==m_FontDlg.DoModal())
{
memcpy(&m_LF,m_FontDlg.m_cf.lpLogFont,sizeof(LOGFONT));
m_bFirst=TRUE;
///******************************************************
HDC hdc = ::GetDC(NULL);
int iLogPixelsY = ::GetDeviceCaps( hdc, LOGPIXELSY );
m_LF.lfHeight = ::MulDiv( 12, iLogPixelsY, 72 );
m_LF.lfWeight = FW_BOLD;
//cf.yHeight = pFont->lfHeight;//文字高度
///******************************************************
Invalidate();
}
}

我这样设置字体还是不行啊?
Forrest 2011-04-16
  • 打赏
  • 举报
回复
2楼的方法我试试,那个公式我看了MSDN ,但不理解为仕么有常数! 3楼的方法我以前就那么写的,不行的!
疯狂-的-蜗牛 2011-04-16
  • 打赏
  • 举报
回复
windows标准字体对话框:CFontDialog
CFontDialog dlg;
if(IDOK==dlg.DoModal())
{
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask|=CFM_BOLD;
if(dlg.IsBold())
cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
else
cf.dwEffects&=~CFE_BOLD;
cf.dwMask|=CFM_ITALIC;
if(dlg.IsItalic())
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
else
cf.dwEffects&=~CFE_ITALIC;
cf.dwMask|=CFM_UNDERLINE;
if(dlg.IsUnderline())
cf.dwEffects|=CFE_UNDERLINE;//设置下划线,取消用cf.dwEffects&=~CFE_UNDERLINE;
else
cf.dwEffects&=~CFE_UNDERLINE;
cf.dwMask|=CFM_COLOR;
cf.crTextColor =dlg.GetColor();;//设置颜色
cf.dwMask|=CFM_SIZE;
cf.yHeight =dlg.GetWeight();//设置高度
cf.dwMask|=CFM_FACE;
CString str=dlg.GetFaceName();
//char *p;
//p=str.GetBuffer(sizeof(str));
strcpy(cf.szFaceName,(LPCTSTR)str);
……………………
hello_stranger 2011-04-16
  • 打赏
  • 举报
回复
LOGFONT logFont = {0};

// set the font to default
//HFONT hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
//GetObject( hFont, sizeof(logFont), &logFont );

// set the font size
HDC hdc = ::GetDC(NULL);
int iLogPixelsY = ::GetDeviceCaps( hdc, LOGPIXELSY );
logFont.lfHeight = ::MulDiv( 12, iLogPixelsY, 72 );

// set font bold
logFont.lfWeight = FW_BOLD;

// set font style
MStrCopy( logFont.lfFaceName, _T("Calibri") );

g_font.CreateFontIndirect(&logFont); // create font

在需要设置字体的Dialog中 SetFont( &g_font )
Dreadnought 2011-04-16
  • 打赏
  • 举报
回复
CreateFont...

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧