按钮控件
创建按钮:BOOL CButton::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,UINT nID );
处理按钮消息:要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED( id, memberFxn )id为按钮的ID值,就是创建时指定的nID值。处理函数原型为afx_msg void memberFxn( );
Static Box
静态文本控件的功能比较简单,可作为显示字符串,图标,位图用。创建一个窗口可以使用成员函数:
BOOL CStatic::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对静态控件指明专门的风格。
SS_CENTER,SS_LEFT,SS_RIGHT 指明字符显示的对齐方式。
SS_GRAYRECT 显示一个灰色的矩形
SS_NOPREFIX 如果指明该风格,对于字符&将直接显示,否则&将作为转义符,&将不显示而在其后的字符将有下划线,如果需要直接显示&必须使用&&表示。
SS_BITMAP 显示位图
SS_ICON 显示图标
SS_CENTERIMAGE 图象居中显示
控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。
控制显示的图标利用成员函数SetIcon/GetIcon用于设置/得到当前显示的图标。
控制显示的位图利用成员函数SetBitmap/GetBitmap用于设置/得到当前显示的位图。下面一段代码演示如何创建一个显示位图的静态窗口并设置位图
CStatic* pstaDis=new CStatic;
pstaDis->Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP|SSCENTERIMAGE,
CRect(0,0,40,40),pWnd,1);
CBitmap bmpLoad;
bmpLoad.LoadBitmap(IDB_TEST);
pstaDis->SetBitmap(bmpLoad.Detach());
Picture Control
下面是关于怎样使用Picture Control显示BMP图片:
查找了一下SetBitmap是这样定义的:
// uBmpResource:图片ID; uCtrlResource: Picture控件ID
void SetBitmap(UINT uBmpResource, UINT uCtrlResource)
{
HBITMAP hBitmap;
CStatic *pStatic = (CStatic *)GetDlgItem(uCtrlResource);
hBitmap = (HBITMAP)LoadImage(
AfxGetInstanceHandle(),
MAKEINTRESOURCE(uBmpResource),
IMAGE_BITMAP,
0,
0,
LR_LOADMAP3DCOLORS);
pStatic->ModifyStyle(0xF, SS_BITMAP);
pStatic->SetBitmap(hBitmap);
}
根据定义,在对话框初始的时候写入下面的代码(结果成功正常显示):
BOOL CLoginDog::OnInitDialog()
{
CDialog::OnInitDialog();
//添加登陆窗口中的图片
HBITMAP hBitmap;
//关联图片ID
hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP_LOGIN_PIC),
IMAGE_BITMAP,0,0,
LR_LOADMAP3DCOLORS);
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_STATIC_PIC);//控件ID
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pStatic->SetBitmap(hBitmap);
return TRUE;
} 来源:考试大-计算机二级考试
////////////////////////////////////////////////////////////////////////////
静态加载位图:
1.添加控件:添加Text控件做为显示位图的控件,添加“显示位图”按钮控件;
2.插入位图资源,设置ID为IDB_BITMAP1;
3.用classwizard为按钮控件添加响应函数,并添加代码如下:
void CStaticImageDlg::OnShowbitmap()
{
// TODO: Add your control notification handler code here
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_STATICIMAGE2);
//获得位图句柄
HBITMAP hBitmap=::LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pStatic->SetBitmap(hBitmap);
}
然后就可以编译运行了。
动态加载位图
动态加载位图也就是说可以通过点击按钮来选择文件中你所想要打开显示的位图,而不是事先导入的。
1.首先也是添加显示位图的控件,不过这次添加的是picture控件,然后添加“显示位图”按钮;
2.为“显示位图”按钮添加响应函数:
void CLoadMapDlg::OnLoadmap()
{
// TODO: Add your control notification handler code here
OnPaint();
CString m_strfile;
CRect r;
GetClientRect(&r); //获得控件客户窗口大小
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("Layer Files (*.DEM;*.TIFF;*.BMP;*.JPG)|*.DEM;*.TIFF;*.BMP;*.JPG;)||"),NULL);
if(dlg.DoModal ())
{
m_strfile=dlg.GetPathName ();
}
HBITMAP hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_strfile,IMAGE_BITMAP,r.Width()/2,
r.Height()/2,LR_LOADFROMFILE);
CStatic* pPic=(CStatic*)GetDlgItem(IDC_PICTURE);
ASSERT(pPic);
pPic->SetBitmap(hbitmap);
Invalidate();
}
3.最重要的一点是插入的picture控件的TYPE要选中“BitMap”,而不是Frame,否则将出现编译通过,而位图无法显示的情况!
///////////////////////////////////////////////////////////////////////////////////
查看文章
VC动态加载bmp位图资源SDK和MFC插入资源时,都要求是BMP格式的位图资源。但位图资源不是显示动态图片。好了不废话。下面介绍两种VC动态加载bmp位图资源:
1、加载BMP文件路径的位图资源
利用到了一个API函数LoadImage(),具体用法可以查询MSDN
添加一个静态文本控件IDC_Static,添加成员变量m_Image,添加入以下代码:
this->m_Image.ModifyStyle(0,SS_BITMAP | SS_CENTERIMAGE); //该静态控件设置为是用来显示位图的,
HBITMAP hBmp = (HBITMAP)::LoadImage(0, "2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //bmp文件路径直接读取该bmp图象的句柄,并转换为HBITMAP类型
this->m_Image.SetBitmap(hBmp); // 将bmp文件显示到静态文本框中
2、动态加载资源里的位图bmp
用到了API函数LoadBitmap()
添加位图资源 ID为IDB_BITMAP1和一个静态文本控件IDC_Static,并为其添加成员变量m_Image,
添加入以下代码:
this->m_Image.ModifyStyle(0,SS_BITMAP | SS_CENTERIMAGE); //将该静态控件设置为是用来显示位图的
HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
//从工程资源处获得IDB_BITMAP1的位图句柄,并将其赋值给hBitmap变量
this->m_Image.SetBitmap(hBitmap); // 将bmp文件显示到静态文本框中
VC++6.0编译通过
Edit Box
Edit窗口是用来接收用户输入最常用的一个控件。创建一个输入窗口可以使用成员函数:
BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对输入控件指明专门的风格。
ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明输入文字超出显示范围时自动滚动。
ES_CENTER,ES_LEFT,ES_RIGHT 指定对齐方式
ES_MULTILINE 是否允许多行输入
ES_PASSWORD 是否为密码输入框,如果指明该风格则输入的文字显示为*
ES_READONLY 是否为只读
ES_UPPERCASE,ES_LOWERCASE 显示大写/小写字符
控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。
通过GetLimitText/SetLimitText可以得到/设置在输入框中输入的字符数量。
由于在输入时用户可能选择某一段文本,所以通过voidCEdit::GetSel( int& nStartChar, int& nEndChar )得到用户选择的字符范围,通过调用void CEdit::SetSel( int nStartChar, int nEndChar, BOOL bNoScroll =FALSE )可以设置当前选择的文本范围,如果指定nStartChar=0 nEndChar=-1则表示选中所有的文本。void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE )可以将选中的文本替换为指定的文字。
此外输入框还有一些和剪贴板有关的功能,voidClear( );删除选中的文本,void Copy( );可将选中的文本送入剪贴板,void Paste( );将剪贴板中内容插入到当前输入框中光标位置,void Cut();相当于Copy和Clear结合使用。
最后介绍一下输入框几种常用的消息映射宏:
ON_EN_CHANGE 输入框中文字更新后产生
ON_EN_ERRSPACE 输入框无法分配内存时产生
ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生
使用以上几种消息映射的方法为定义原型如:afx_msgvoid memberFxn( );的函数,并且定义形式如ON_Notification( id,memberFxn )的消息映射。如果在对话框中使用输入框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。
Scroll Bar
Scroll Bar一般不会单独使用,因为SpinCtrl可以取代滚动条的一部分作用,但是如果你需要自己生成派生窗口,滚动条还是会派上一些用场。创建一个滚动条可以使用成员函数::
BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对滚动条指明专门的风格。
SBS_VERT 风格将创建一个垂直的滚动条。
SBS_HORZ 风格将创建一个水平的滚动条。
在创建滚动条后需要调用voidSetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE )设置滚动范围,
int GetScrollPos( )/int SetScrollPos( )用来得到和设置当前滚动条的位置。
void ShowScrollBar( BOOL bShow = TRUE );用来显示/隐藏滚动条。
BOOL EnableScrollBar( UINT nArrowFlags =ESB_ENABLE_BOTH )用来设置滚动条上箭头是否为允许状态。nArrowFlags可取以下值:
ESB_ENABLE_BOTH 两个箭头都为允许状态
ESB_DISABLE_LTUP 上/左箭头为禁止状态
ESB_DISABLE_RTDN 下/右箭头为禁止状态
ESB_DISABLE_BOTH 两个箭头都为禁止状态
如果需要在滚动条位置被改变时得到通知,需要在父窗口中定义对消息WM_VSCROLL/WM_HSCROLL的映射。方法为在父窗口类中重载
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)/afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
所使用的消息映射宏为:ON_WM_VSCROLL( ),ON_WM_HSCROLL( ),在映射宏中不需要指明滚动条的ID,因为所有滚动条的滚动消息都由同样的函数处理。在OnHScroll/OnVScroll的第三个参数会指明当前滚动条的指针。第一个参数表示滚动条上发生的动作,可取以下值:
SB_TOP/SB_BOTTOM 已滚动到顶/底部
SB_LINEUP/SB_LINEDOWN 向上/下滚动一行
SB_PAGEDOWN/SB_PAGEUP 向上/下滚动一页
SB_THUMBPOSITION/SB_THUMBTRACK 滚动条拖动到某一位置,参数nPos指明当前位置(参数nPos在其它的情况下是无效的)
SB_ENDSCROLL 滚动条拖动完成(用户松开鼠标)
List Box/Check List Box
ListBox窗口用来列出一系列的文本,每条文本占一行。创建一个列表窗口可以使用成员函数:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。
LBS_MULTIPLESEL 指明列表框可以同时选择多行
LBS_EXTENDEDSEL 可以通过按下Shift/Ctrl键选择多行
LBS_SORT 所有的行按照字母顺序进行排序
在列表框生成后需要向其中加入或是删除行,可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )删除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )将行插入到指定位置。
void ResetContent( )可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。
如果需要得到/设置当前被选中的行,可以调用int GetCurSel( )/int SetCurSel(int iIndex)。如果你指明了选择多行的风格,你就需要先调用int GetSelCount( )得到被选中的行的数量,然后intGetSelItems( int nMaxItems, LPINT rgIndex )得到所有选中的行,参数rgIndex为存放被选中行的数组。通过调用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框内指定行的字符串。
此外通过调用int FindString( int nStartAfter,LPCTSTR lpszItem )可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以选中包含指定字符串的行。
在MFC 4.2版本中添加了CCheckListBox类,该类是由CListBox派生并拥有CListBox的所有功能,不同的是可以在每行前加上一个检查框。必须注意的是在创建时必须指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE风格。
通过void SetCheckStyle( UINT nStyle )/UINTGetCheckStyle( )可以设置/得到检查框的风格。
通过void SetCheck( int nIndex, intnCheck )/int GetCheck( int nIndex )可以设置和得到某行的检查状态。
最后介绍一下列表框几种常用的消息映射宏:
ON_LBN_DBLCLK 鼠标双击
ON_EN_ERRSPACE 输入框无法分配内存时产生
ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生
ON_LBN_SELCHANGE 选择的行发生改变
使用以上几种消息映射的方法为定义原型如:afx_msgvoid memberFxn( );的函数,并且定义形式如ON_Notification( id,memberFxn )的消息映射。如果在对话框中使用列表框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。