请问如何设置CCecklistbox内显示字体的大小?

html007 2000-08-09 02:57:00
...全文
207 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
html007 2000-08-10
  • 打赏
  • 举报
回复
不好使,int ret = pFont->GetLogFont(&logFont);句程序报错,logFont应如何设置?
hand 2000-08-10
  • 打赏
  • 举报
回复
CFont* pFont = pbb->GetFont();
LOGFONT logFont;
int ret = pFont->GetLogFont(&logFont);
if(ret)
{
LOGFONT newLogFont = logFont;
//修改 newLogFont
CFont newFont;
newFont.CreateFontIndirect(&newLogFont);
pbb->SetFont(&newFont,FALSE);
}
html007 2000-08-10
  • 打赏
  • 举报
回复
顺便告诉我,如何设置多行时出现滚动条,谢谢!告诉我给你加50分。谢谢!急
html007 2000-08-10
  • 打赏
  • 举报
回复
给你50分,告诉我吧!
html007 2000-08-10
  • 打赏
  • 举报
回复
我的代码如下,请问为什么,字体没有改变。
CCheckListBox *pbb;
pbb=new CCheckListBox;//
pbb->Create( LBS_OWNERDRAWFIXED |LBS_HASSTRINGS | LBS_MULTIPLESEL | LBS_EXTENDEDSEL,CRect(100,50,200,200),this,989);
pbb->SetCheckStyle(BS_AUTOCHECKBOX);
pbb->SetHorizontalExtent(2);

LOGFONT LogFont;
HDC hDC=::GetDC(NULL);
memset(&LogFont, 0x00, sizeof(LogFont));
LogFont.lfHeight =-MulDiv(14/*字体的号,默认为10号字*/, GetDeviceCaps(hDC, LOGPIXELSY), 72);
long FontHeight=-LogFont.lfHeight;//LogFont.lfHeight
LogFont.lfWeight = 400;
LogFont.lfOutPrecision = 3;
LogFont.lfClipPrecision = 2;
LogFont.lfQuality = 1;
LogFont.lfPitchAndFamily = VARIABLE_PITCH|FF_DONTCARE; // 0x02
LogFont.lfCharSet = GB2312_CHARSET; // 134
strcpy(LogFont.lfFaceName, "宋体");
HFONT m_hFont = ::CreateFontIndirect(&LogFont);
CDC *pDC=GetDC();
CFont *j=pbb->GetFont();
j=pDC->SelectObject(CFont::FromHandle(m_hFont));
pbb->SetFont(j);
pbb->InitStorage(256,10);
pbb->AddString("你好");
pbb->ShowWindow(SW_SHOW);
hand 2000-08-10
  • 打赏
  • 举报
回复
抱歉,我上午给的代码有误,现更正,并给出所有解答如下:

1.可以静态生成checklistbox
先在相应的dialog里放一个普通的listbox,用classwizard
生成一个变量,假设是m_list
2.自己从CCheckListBox派生一个类,假设是CMyCheckListBox
3.将相应的m_list的类型改成CMyCheckListBox
4.在对话框编辑器里将该listbox的属性社为owner draw:variable,选中has strings
5.重载CCheckListBox的DrawItem和MeasureItem
其中MeasureItem是用来计算每个item的大小的,你只要修改lpMeasureItemStruct->itemHeight就可以了
6.在DrawItem中自己输出相应的文字,当然可以设置大小
修改字体的代码可以在外边执行,入夏:
CFont* pFont = m_list1.GetFont();
LOGFONT logFont;
int ret = pFont->GetLogFont(&logFont);
if(ret)
{
LOGFONT* newLogFont = new LOGFONT;
*newLogFont = logFont;
newLogFont->lfHeight = 35;//sample
newLogFont->lfWidth = 35;//sample
CFont* newFont = new CFont;
newFont->CreateFontIndirect(newLogFont);
m_list1.SetFont(newFont,TRUE);
}
7.最后,为了完美起见:)还得让MFC为我们把check,check上,
重载 WM_LBUTTONDOWN,注意,vc在省城的函数替中调用了CListBox的
OnLButtonDown,需要我们自力更生把它改称CCheckListBox::...

一切O.K.

BTW,滚动条会自动加上。
bbslucky 2000-08-10
  • 打赏
  • 举报
回复
其实你想做的是这个::::::::::::::
摘自VC知识库 http://www.vckbase.com/,非常有用的,以后也可以少给一些分了

TreeList control中使用check box
闻怡洋译
方法很简单,一句话总结:定义用户定义状态,并对不同的状态(state)使用不同的图片。
在下面的sample中,我们使用CTreeListCtrl作为父类。由于TreeList control支持一些现有state 所以用户定义的state必需使用INDEXTOSTATEIMAGEMASK(i)进行变换。
如果对本文所讲的方法有不明的地方,可以先熟悉一下TreeList Control的使用,然后再看本文。
Step 1: 创建state list image
创建的图片有三种状态。
state ImageList只是用于和state改变有关的显示图片,TreeList Control中还应包含其他image List,如:焦点选择改变的imageList,用于在选中和未选中是改变显示图片。
Step 2: 初始化
CImageList m_imageState; 成员变量
m_imageState.Create( IDB_STATE, 13, 1, RGB(255,255,255) );//创建ImageList
m_tree.SetImageList( &(m_tree.m_imageState), TVSIL_STATE );//在TreeList中加入表示状态的ImageList。
Step 3: 增加结点时设置标记
重新定义一个InsertItem函数。使用TV_INSERTSTRUCT来插入结点。
即使用函数HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct );
lpInsertStruct->item.mask |= TVIF_STATE ;//保证state 和stateMask是有效的。
你必须在TV_ITEM中标明state和stateMask。(INDEXTOSTATEIMAGEMASK宏可以得到state image的下标)
state 设置为INDEXTOSTATEIMAGEMASK(1)表示用户定义的第一种状态
stateMask设置为TVIS_STATEIMAGEMASK.表示用户定义的状态。
当然也可以调用SetItemState设置state.
SetItemState( hItem, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK );
Step 4: 增加mouse button down消息映射
通过使用HitTest来得知是否按在State图片上。并需要得到当前state。
void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT uFlags=0;
HTREEITEM hti = HitTest(point,&uFlags);
if( uFlags & TVHT_ONITEMSTATEICON )
{
int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;
//GetItemState( hti, TVIS_STATEIMAGEMASK )>>12 对用户定义state反变换
SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1),
TVIS_STATEIMAGEMASK );
return;
}
}
Step 5:处理 OnKeyDown
void CTreeCtrlX::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( nChar == VK_SPACE )
{
HTREEITEM hti = GetSelectedItem();
int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;
SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1),
TVIS_STATEIMAGEMASK );
return;
}
}
Step 6: 增加其他的功能函数
BOOL CTreeCtrlX::IsItemChecked(HTREEITEM hItem)
{
return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 == 2;
}
HTREEITEM CTreeCtrlX::GetFirstCheckedItem()
{
for ( HTREEITEM hItem = GetRootItem(); hItem!=NULL; hItem = GetNextItem( hItem ) )
if ( IsItemChecked(hItem) )
return hItem;
return NULL;
}
HTREEITEM CTreeCtrlX::GetNextCheckedItem( HTREEITEM hItem )
{
for ( hItem = GetNextItem( hItem ); hItem!=NULL; hItem = GetNextItem( hItem ) )
if ( IsItemChecked(hItem) )
return hItem;
return NULL;
}
HTREEITEM CTreeCtrlX::GetPrevCheckedItem( HTREEITEM hItem )
{
for ( hItem = GetPrevItem( hItem ); hItem!=NULL; hItem = GetPrevItem( hItem ) )
if ( IsItemChecked(hItem) )
return hItem;
return NULL;
}
bbslucky 2000-08-10
  • 打赏
  • 举报
回复
我试了再说
hand 2000-08-09
  • 打赏
  • 举报
回复
1.GetFont
2.change size
3.SetFont
bbslucky 2000-08-09
  • 打赏
  • 举报
回复
分太少,我不要

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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