| 查看: 244 | 回复: 1 | |||
| 当前主题已经存档。 | |||
[交流]
MFC编程常用的几个小技巧
|
|||
|
文末附代码! 1.浮点数微调按钮 想必大家都用到过MFC自带的整数控制的微调按钮控件类CSpinButtonCtrl,其实对浮点型也就是继承这个类,然后稍做改进的.具体的实现原理可以参见MSDN ECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明. 通过这个功能类,你可以对MFC附带的那个里面的参数有更深入的了解..2.超链接控制 喜欢用这个,简单又方便.我是这样实现的,创建一个静态文本控件,通过API函数GetWindowRect(),获得窗口中控件的位置,这样就可以在窗口的消息中利用位置判断来实现事件控制.这个以创建email链接说明一下子. ⑴.假定创建的是基于对话框的LS工程。 ⑵.在LS工程的资源文件中引入光标文件将其ID设为"IDC_HAND",在LS_DIALOG的对话 框中加入静态文本控件将其ID设为"IDC_LINK",Caption设为"XXXX" ⑶.在对话类的头文件(LSDlg.h)添加数据成员 protected: RECT m_pRectLink; //用于保存静态文本框的屏幕坐标 ⑷.获取控件坐标 在对话类成员函数OnInitDialog()中添加以下代码(LSDlg.cpp): GetDlgItem(IDC_LINK)->GetWindowRect(&m_pRectLink); //将静态文本的屏幕坐标存放在m_pRectLink中 ScreenToClient(&m_pRectLink); //将屏幕坐标转换为客户坐标 ⑸.变换鼠标形状 利用ClassWizard为对话框添加OnMouseMove()消息,在函数OnMouseMove(UINT nFlags, CPoint point)中,point参数可获得对应于窗口左上角的鼠标坐标,通过判断算 法就可实现事件的控制。 //下面设置鼠标在静态文本区时,将光标设成小手状 if (point.x>m_pRectLink.left&&point.xm_pRectLink.top&& point.y //此处添加判断坐标算法 { HCURSOR hCursor; hCursor=AfxGetApp()->LoadCursor(IDC_HAND); //将鼠标设为小手状 SetCursor(hCursor); } } ⑹.添加鼠标单击事件 利用ClassWizard为对话框添加OnLButtonDown()消息,参数与OnMouseMove()一样。 if (point.x>m_pRectLink.left&&point.xm_pRectLink.top&& point.y //此处添加判断坐标算法 { if (nFlags==MK_LBUTTON) //鼠标左键按下 { //为改善鼠标效果,此处加入变换鼠标形状的代码 ShellExecute(0, NULL, "mailto:hj594@163.com?subject=Hello!", NULL,NULL, SW_NORMAL);,boy //也可以添加其他的链接 } } ^_^,很乱,我在VCsp6+win2k下编译通过. 3.闪屏效果实现 这个是纯粹拿来主义,copy的,效果还好,有待改进算法.后来看了一下子,大致思路就是在程 序初始化实例里创建一个窗口. ///////////////////////////////////////////////////////////////////////////// // CMyApp initialization BOOL CMyApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif //////////////////在这里 CYuWnd *pWnd = new CYuWnd; //建立一个新窗口对象 pWnd->CreatYuWnd (); //创建窗口 pWnd->SetXStep ( 0 ); //X方向的步长 pWnd->SetYStep ( 2 ); //Y方向的步长 pWnd->SetBlockNum ( 300 ); //将图片在X,Y方向均分为多少份 pWnd->SetDirection ( TRUE ); //表示第一个点从左上角开始,TRUE:左上,FLASE: 右下 pWnd->SetDelay ( 5 ); //绘制完一组点(m_nBlockNum个)后的延时 pWnd->CenterWindow (); //在屏幕中央 pWnd->ShowWindow (SW_SHOW); //显示窗口 pWnd->UpdateWindow (); //更新窗口,激活OnPait函数 Sleep(500); //等待函数指定秒钟 if (pWnd != NULL) { pWnd->SendMessage (WM_CLOSE); //关闭窗口 delete pWnd; pWnd = NULL; } ///////////////////end 具体引用的类见附件. 4.彩色渐显进程条 这个很还是扩展MFC附带的功能,而且可重用性较好,来源网络.只要自己对应的参数设置得好,效果很棒!见附件. 5.默认帮助事件的替换^_^,这个最简单,适合懒人用.当然也可以自己制作.hlp,.chm文件的,这里不赘述. 基于对话框程序,默认的F1键调出.hlp帮助,也就是ON_COMMAND(ID_HELP,CWinApp::OnHelp).现在我只想按F1弹出MSG,或者其他帮助文件,可以通过更改消息映射来完成. ///////////////////////////////////////////////////////////////////////////// // CMyApp.cpp BEGIN_MESSAGE_MAP(CMyApp, CWinApp) //{{AFX_MSG_MAP(CMyApp) //}}AFX_MSG ON_COMMAND(ID_HELP, OnHelp) //CWinApp::OnHelp -> OnHelp,这个函数功能定制 END_MESSAGE_MAP() /////////////////////////////////////////// BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_SYSCOMMAND() ON_COMMAND( ID_HELP, OnHelp ) //添加响应 ON_WM_DESTROY() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ////////////////////////////////// // Implementation protected: HICON m_hIcon; RECT m_pRectLink; // Generated message map functions //{{AFX_MSG(CMyDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnHelp(); //添加的 afx_msg void OnDestroy(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon() //}}AFX_MSG ///////////////////////////////////////////////// //定制OnHelp()函数,自己更改,^_^ void CMyDlg::OnHelp() { AfxMessageBox("我是一个好孩子,啦啦啦!" ;} /////////////////////////////////////////////////////////// ====================================================== 这些只是给起到程序锦上添花的作用,前提还是需要做好自己的核心程序~~~ ^_^,OVER仅供菜鸟参考... ============================================ 源代码附件: http://byhh.net/upload/speffcode.rar [ Last edited by 幻影无痕 on 2006-10-5 at 13:49 ] |
» 猜你喜欢
存款400万可以在学校里躺平吗
已经有15人回复
拟解决的关键科学问题还要不要写
已经有6人回复
Materials Today Chemistry审稿周期
已经有6人回复
基金委咋了?2026年的指南还没有出来?
已经有10人回复
基金申报
已经有6人回复
推荐一本书
已经有13人回复
国自然申请面上模板最新2026版出了吗?
已经有17人回复
纳米粒子粒径的测量
已经有8人回复
疑惑?
已经有5人回复
计算机、0854电子信息(085401-058412)调剂
已经有5人回复

2楼2005-08-25 21:43:49











ECLARE_DYNAMIC()和IMPLEMENT_DYNAMIC声明. 通过这个功能类,你可以对MFC附带的那个里面的参数有更深入的了解..
;
回复此楼