}
---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog { ...
protected:
CBrush m_brush; ... };
---- ②在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg::OnInitDialog() { ...
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子 ... }
---- ③利用ClassWizard重载OnCtlColor(?),即WM_CTLCOLOR消息: HBRUSH CExampleDlgDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) { /*
** 这里不必编写任何代码! **下行代码要注释掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); */
return m_brush; //返加绿色刷子 }
---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): ---- 步骤①、②同上方法三中的步骤①、②。
---- 步骤③利用ClassWizard重载OnCtlColor(?)(即WM_CTLCOLOR消息)时则有 些不同:
HBRUSH CExampleDlgDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); //在这加一条是否为对话框的判断语句 if(nCtlColor ==CTLCOLOR_DLG) return m_brush; //返加绿色刷子 return hbr; }
第 8 页 共 20页
13、为MFC对话框添加背景图片
先在资源框中加载一张bmp的位图,在OnPaint()函数中添加代码 void CMyView::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_pic1);//选择的背景图片的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); // Do not call CRecordView::OnPaint() for painting messages }
14、进度条的使用
(一)进度条的主要功能
进度条控制(Progress Control)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充。
进度条控制在MFC类库中的封装类为CProgressCtrl,通常仅作为输出类控制,所以其操作主要是设置进度条的范围和当前位置,并不断地更新当前位置。进度条的范围用来表示整个操作过程的时间长度,当前位置表示完成情况的当前时刻。SetRange()函数用来设置范围,初始范围为0-100,SetPos()函数用来设置当前位置,初始值为0,SetStep()函数用来设置步长,初始步长为10,StepIt()函数用来按照当前步长更新位置,OffsetPos()函数用来直接将当前位置移动一段距离。如果范围或位置发生变化,那么进度条将自动重绘进度区域来及时反映当前工作的进展情况。 进度条的对象结构 进度条控制的建立方法
CProgressCtrl &ProgressCtrl 建立进度条控制对象结构 Create 建立进度条控制对象并绑定对象
进度条控制类CprogressCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
其中参数dwStyle用来确定进度条控制的控制风格;参数rect用来确定进度条控制的大小和位置;参数pParentWnd用来确定进度条父窗口指针;参数nID用来确定进度条控制的控制符ID值。 2、进度条控制的类属性
进度条控制的类属性包括设置进度条最大最小控制范围SetRange、设置进度条当前位置SetPos、设置进度条当前位置偏移值OffsetPos和设置进度条控制增量值SetStep。 3、进度条控制的操作方法
第 9 页 共 20页
进度条控制的操作方法主要是使进度条控制并重绘进度条的StepIt函数。 进度条控制的应用技巧示例
1、利用应用程序向导AppWizard生成基于对象框的应用程序CProgDlg; 2、在对话框中设置进度条和静态文本控制, 其ID分别为IDC_PROG和IDCPERCENT;
在对话框初始代码中增加控制的范围和位置:
在ProgDlg.h中设置两个数据成员,用来表示进度条的最大值和步长: //ProgDlg.h
class CProgDlg:public Cdialog { ......//其它代码 public:
int m_nMax,m_nStep; ...... //其它代码 }
(2)在ProgDlg.cpp中设置初始状态 BOOL CProgDlg::OnInitDialog() { Cdialog::OnInitDialog(); ......//其它代码
//TODO:Add extra initialization here
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG); pProgCtrl->SetRange(0,200);//设置进度条范围 ......//其它代码 m_nMax=200; m_nStep=10;
SetTimer(1,1000,NULL);//设置进度条更新时钟 return TRUE; }
m_progress.SendMessage(PBM_SETBKCOLOR, 0, RGB(rand()%5,rand()%5,rand()%5));//设置进度条的颜色
(3)完善WM_TIMER消息处理,使进度条按照当前步长进行更新,同时完成进度条的百分比显示: void CProgDlg::OnTimer(UINT nIDEvent) { //TODO:Add your message handler?
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG); int nPrePos=pProgCtrl->StepIt();//取得更新前位置 char test[10];
int nPercent=(int)(((nPrePos+m_nStep)/m_nMax*100+0.5); wsprintf(test,?%d%%?,nPercent);
GetDlgItem(IDC_PERCENT)->SetWindowText(text); Cdialog::OnTimer(nIDEvent); }
15、下拉列表框CComboBox的使用
将Combo Box拖入窗口,在MFC ClassWizard 中Member Varibles添加变量m_combo,在OnInitDialog()中
第 10 页 共 20页
添加m_combo.SetCurSel(0);使其显示第一个数据; 往列表中添加数据:
1) 选择properties->Data输入一个数据,按Ctrl+Enter换行继续添加下移个数据; 2) 在代码中动态添加,((CComboBox*)GetDlgItem(IDC_COMBO))->InsertString(i,str); 获取列表选中的数据所在位置:int in=m_combo.GetCurSel();
16、使用Vc读取数据库中的数据实现
CDatabase对象表示到数据源的连接,通过它可以操作数据源。数据源是位于一些数据库管理系统(DBMS)的数据的指定实例,包括MicrosoftSQLServer,MicrosoftAccess,BorlanddBASE和xBASE。在应用中可以同时使一个或多个CDatabase对象活动。
注意:
如果在处理数据访问对象(DAO)类而不是开放数据库连接(ODBC)类,可使用类CDaoDatabase。 为使用CDatabase,构造一个CDatabase对象并调用它的OpenEx成员函数。这打开了一个连接。在接着构造CRecordset对象以操纵连接的数据源时,向CDatabase对象传递记录集构造程序指针。完成使用连接时调用Close成员函数并销毁CDatabase对象。Close关闭以前没有关闭的任何记录集。
#include
要建立与数据源的连接,首先应构造一个CDatabase对象,然后再调用CDatabase的Open成员函数Open函数负责建立连接,其声明为:
virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect ="ODBC;", BOOL bUseCursorLib = TRUE ); throw( CDBException, CMemoryException );
说明:
1) 参数lpszDSN指定了数据源名(构造数据源的方法将在后面介绍),在lpszConnect参数中也可包括数据源名,此时lpszDSN必需为NULL,若在函数中未提供数据源名且使lpszDSN为NULL,则会显示一个数据源对话框,用户可以在该对话框中选择一个数据源。
2) 参数bExclusive说明是否独占数据源,由于目前版本的类库还不支持独占方式,故该参数的值应该是FALSE,这说明数据源是被共享的。
3) 参数bReadOnly若为TRUE则对数据源的连接是只读的。 4) 参数lpszConnect指定了一个连接字符串,连接字符串中可以包括数据源名、用户帐号(ID)和口令等信息,字符串中的“ODBC”表示要连接到一个ODBC数据源上。
5) 参数bUseCursorLib若为TRUE,则会装载光标库,否则不装载,快照需要光标库,动态集不需要光标库。
6) 若连接成功,函数返回TRUE,若返回FALSE,则说明用户在数据源对话框中按了Cancel按钮。若函数内部出现错误,则框架会产生一个异常。
例子:
1) CDatabase m_db; //在文档类中嵌入一个CDatabase对象 2) //连接到一个名为"Student Registration"的数据源 m_db.Open(\
3) //在连接数据源的同时指定了用户帐号和口令
m_db.Open(NULL,FALSE,FALSE,\4) m_db.Open(NULL); //将弹出一个数据源对话框
2. 要从一个数据源中脱离,可调用函数Close。在脱离后,可以再次调用Open函数来建立一个新的连接。
3. 调用IsOpen可判断当前是否有一个连接。
第 11 页 共 20页
相关推荐: