24小时热门版块排行榜    

查看: 245  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 小刀儿 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见