24小时热门版块排行榜    

查看: 292  |  回复: 1
当前主题已经存档。

小刀儿

捐助贵宾 (正式写手)

[交流] MFC编程常用的几个小技巧

文末附代码!

1.浮点数微调按钮
想必大家都用到过MFC自带的整数控制的微调按钮控件类CSpinButtonCtrl,其实对浮点型也就是继承这个类,然后稍做改进的.具体的实现原理可以参见MSDNECLARE_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 ]
回复此楼
为天地立心,为生民立命,为往圣继绝学,为万世开太平
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

YOY

银虫 (小有名气)

0.5

谢谢啊!
2楼2005-08-25 21:43:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 小刀儿 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 投票:  有多少人是今天查系统知道结果的? +17 爱看书的可乐 2026-08-26 19/950 2026-08-30 22:24 by xiangy672
[基金申请] 国社科又开始会评了,不知道这次命运如何 +5 雨打竹帘 2026-08-30 9/450 2026-08-30 22:23 by 余韵清
[基金申请] 能否申诉? +4 echo8914667 2026-08-30 5/250 2026-08-30 21:11 by echo8914667
[基金申请] 中青基了要发朋友圈吗? +4 349506619 2026-08-28 4/200 2026-08-29 22:41 by alongwaytogo
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 基金不中,共勉 +11 eulota 2026-08-26 11/550 2026-08-28 14:22 by 火星超人xi
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +5 yuleib84 2026-08-26 6/300 2026-08-28 00:02 by yudaoqian88
[基金申请] 面上合作单位盖章 +5 ssyjh 2026-08-27 5/250 2026-08-27 20:50 by gdfollow
[基金申请] 基金未中,这种答复是模板吗? +5 zhaosm1982 2026-08-27 6/300 2026-08-27 16:00 by lfy8008
[基金申请] 怎么看青基中了没有啊 +5 叶九微 2026-08-26 5/250 2026-08-27 10:35 by l_zh2008
[基金申请] 能否退出参与的面上项目解除限项 +23 koalala 2026-08-24 26/1300 2026-08-26 14:29 by 宝贝虫子
[基金申请] 为什么国自然不能直接公布 +4 bjdxyxy 2026-08-26 4/200 2026-08-26 13:12 by qingmu1201
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 项目信息和经费信息在系统里都可以看到了 +6 wittyboy 2026-08-26 14/700 2026-08-26 10:55 by wittyboy
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
信息提示
请填处理意见