MFC控件及功能实现

发布时间 : 星期五 文章MFC控件及功能实现更新完毕开始阅读

Button属性页里Style的Bitmap点上 CBitmap Bitmap;

Bitmap.LoadBitmap(IDB_BITMAP1);

HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();

CButton *pButton=(CButton*)GetDlgItem(IDCANCEL); pButton->SetBitmap(hBitmap);

感觉效果不是很好。因为图片不会自动拉伸。 第二种:

可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。 第三种:

把button按钮属性设置为ower draw 然后映射onDrawItem消息

在ondraw函数内自己绘制就可以了

void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) {

if(nIDCtl == IDC_HELLO_CFAN) {

//绘制按钮框架

UINT uStyle = DFCS_BUTTONPUSH; //是否按下去了?

if (lpDrawItemStruct->itemState & ODS_SELECTED) uStyle |= DFCS_PUSHED; CDC dc;

dc.Attach(lpDrawItemStruct->hDC);

dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle); //输出文字

dc.SelectObject(&m_Font);

dc.SetTextColor(RGB(0, 0, 255)); dc.SetBkMode(TRANSPARENT); CString sText;

m_HelloCFan.GetWindowText(sText);

dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText); //是否得到焦点

if(lpDrawItemStruct->itemState & ODS_FOCUS) {

//画虚框

CRect rtFocus = lpDrawItemStruct->rcItem; rtFocus.DeflateRect(3, 3); dc.DrawFocusRect(&rtFocus); }

return; }

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); }

第 4 页 共 20页

第四种:

1,按钮属性 Onwer Drew选上,按钮ID: IDC_BUTTON1 2,定义private变量: CBitmapButton m_button; 3,在初始化里边

m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下 m_button.SubclassDlgItem(IDC_BUTTON1, this); m_button.SizeToContent(); 设置按钮显示的文字代码:

GetDlgItem(IDC_BUTTON2)->SetWindowText(\开始编码\

6、Flash控件的使用

[工具(T)]--[ActiveX Control Test Container]--[弹出对话框] [File]--[Register Controls]--[弹出对话框]

找到C:WINDOWS\\system32\\Macromed\\lash\\Flash10e.ocx,[打开]

弹出\框里为FLASH的ID添加映射:选择IDC_SHOCKWAVEFLASH1、FSCommand、[Add Function],弹出\选[OK]

在\框里第2页\,为FLASH的ID添加类,弹出提示对话框选择[确定],我们定义类名字,为m_flash,基类为CShockwaveFlash \播放按钮\代码:

为视图资源里的\播放\按钮消息响应函数修改代码 void CTest0407Dlg::OnOK() //对应\播放\按钮 {

// TODO: Add extra validation here

//CDialog::OnOK();

m_flash.LoadMovie(0,\播放FLASH文件,路径C:\\VC\\tu\\12.swf m_flash.Play(); }

7、为VC界面加载ssk皮肤

到网上下载这三个文件skinppwtl.dll,SkinPPWTL.h,SkinPPWTL.lib放到工程下,我的百度网盘下载连接(http://pan.http://www.china-audit.com//netdisk/singlepublic?fid=564282_898919684)

在界面的.cpp中添加头文件SkinPPWTL.h,在InitInstance()中添加skinppLoadSkin(\初始化皮肤xp_corona.ssk,按Alt+F7,选择连接,添加SkinPPWTL.lib确认即可。

8、窗口菜单的使用

在资源框中选中工程,右击选择insert->menu创建菜单,右击窗口,选择properties->general->menu; 为子菜单添加事件:右击子菜单选择-> MFC ClassWizard,弹出一个对话框,->select a exist class->选择创建的类如

CMyDlg;在Message maps中选择对应子菜单的ID,在Messages选择command->add function->确定->edit code即可 二级菜单的使用:选择一个子菜单右击选择->properties->general->Pop-up即可

9、窗口添加右击菜单

第 5 页 共 20页

按照上面的方法添加一个菜单,MFC ClassWizard 中Messages添加WM_OnRButtonDown事件,在OnRButtonDown(UINT nFlags, CPoint point)函数中添加代码:

void CMyDlg::OnRButtonDown(UINT nFlags, CPoint point) {

CMenu menu;

menu.LoadMenu(IDR_MENU2);//载入刚才创建的菜单 CMenu*pContextMenu=menu.GetSubMenu(0); CPoint point1;

GetCursorPos(&point1);//获得鼠标焦点

pContextMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point1.x,point1.y,this);//AfxGetMainWnd()

CDialog::OnRButtonDblClk(nFlags, point); }

10、为静态文本添加动态显示时间

在窗口拖入一个静态框,ID改为IDC_time, 在OnInitDialog()中添加SetTimer(1,1000,NULL);在MFC ClassWizard 中Messages添加WM_TIMER事件,在OnTimer(UINT nIDEvent)函数中添加代码: void CMyDlg::OnTimer(UINT nIDEvent) { CString str; CTime t; t=CTime::GetCurrentTime(); str.Format(\nute(),t.GetSecond()); GetDlgItem(IDC_time)->SetWindowText(str); CDialog::OnTimer(nIDEvent); }

11、状态栏的使用

1).添加字符串

在工作区中选择Resource View标签,转到资源编辑窗口,双击“String Table”→“String Table”项条目打开打开串表资源的编辑器。

选择最下面的空白项并双击,或选择某个串后按“Insert”键,将弹出“String Properties”对话框。在“ID”框中输入串标识符IDS_limin和IDS_TIME和值,在“Caption”框内输入标题字符的内容,串值为系统自动设定。

为Dlg类添加成员变量CStatusBar m_Bar;

在Dlg类中添加static UINT indicators[]={IDS_limin,IDS_TIME}; 2).在Dlg类OnInitDialg中添加如下代码 /*① 创建状态栏*/

m_StatusBar.Create(this);//默认ID //设置状态栏 m_bar.Create(this);//在当前窗口创建状态栏 m_bar.SetIndicators(indicators,2);//将状态栏分成两列 m_bar.SetPaneInfo(0,IDS_limin,SBPS_NORMAL,rect.Width()-150);

第 6 页 共 20页

m_bar.SetPaneInfo(1,IDS_TIME,SBPS_STRETCH,0); /*⑤ 显示状态栏*/

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);//显示状态栏 /*⑥ 状态栏随对话框窗口大小而变化*/

//关于此方法请查阅\界面技巧\之 \控件大小随窗口而调整\m_Bar.SetOwner(this);

m_Bar.SetResize(AFX_IDW_STATUS_BAR,PK_BOTTOM_LEFT,PK_BOTTOM_RIGHT);//AFX_IDW_STATUS_BAR为状态栏默认的ID【思路总结】

创建CStatusBar类变量;创建状态栏create;添加面板setIndicators;设置面板宽度SetPaneInfo;设置面板文本SetPaneText;显示状态栏RepositionBars;

状态栏显示时间:为CMainFrame类的OnTimer()函数添加如下代码:

语句“tmCurr=CTime::GetCurrentTime();”用于获取系统当前时间,再通过语句“strTime= tmCurr.Format('%H:%M:%S');”将时间格式化后赋给字符串strTime。最后通过状态栏类CStatusBar成员函数SetPaneText()将字符串strTime显示到ID_INDICATOR_TIME所指示的窗格中。m_bar.SetPaneText(1, strTime);

12、改变VC对话框的颜色实现

① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 ---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ) { ?

CExampleDlgDlg dlg; m_pMainWnd = &dlg;

//先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal(); ? }

---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的 是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变 应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。

---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() {

if (IsIconic()) ? else {

CRect rect;

CPaintDC dc(this); GetClientRect(rect);

dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景 CDialog::OnPaint();

第 7 页 共 20页

联系合同范文客服:xxxxx#qq.com(#替换为@)