导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

鼠标移动到CStatic上改变图标??

Nirvana0 2004-04-05 05:29:46
我添加了一个基于CStatic类的新类,重载了
OnMouseMove方法
基本代码如:
CMyStatic.cpp
ON_WM_MOUSEMOVE()
...
void CMyStatic::OnMouseMove( UINT nFlags, CPoint point )
{
::SetCursor(AfxGetApp()->LoadCursor(IDI_ICON1));
或者
::SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDI_ICON1)));
}
...

XXX.h
CStatic myStatic;

XXX.cpp
myStatic.Create(_T("测试"), SS_CENTER | SS_NOTIFY,CRect(50,80,305,125),this,IDS_TEST);
调试的时候鼠标移动到myStatic上的时候,能够进入OnMouseMove方法,但是鼠标的光标没有改变,为什么?
...全文
115 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
整个类的代码粘给你算了,使用方法是在对话框上放一个CStatic的静态文本,然后在对话框中添加此类的成员,然后用该类subclassing CStatic对象窗口。

头文件:
#ifndef _LINKER_H
#define _LINKER_H

class CLinker:public CStatic
{
private:
CString m_strlink; //存储链接文件的路径(URL)
public:
DECLARE_DYNAMIC(CLinker)

CLinker();
void SetLinkObject(CString str); //设置链接文件的路径(URL)
~CLinker(){}
static COLORREF t_unvclr; //存储标题颜色
static COLORREF t_vdclr; //同上
static HCURSOR t_hc; //鼠标句柄
protected:
CFont m_font; //字体
COLORREF m_color; //实时标题颜色
DECLARE_MESSAGE_MAP()

afx_msg UINT OnNcHitTest(CPoint point);
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg HBRUSH CtlColor(CDC* pDC,UINT nCtlColor);
afx_msg BOOL OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message);
};

#endif _LINKER_H

源文件:
#include <stdafx.h>
#include "Linker.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif

COLORREF CLinker::t_unvclr=RGB(0,0,255); //蓝色
COLORREF CLinker::t_vdclr=RGB(128,0,128); //紫色光
HCURSOR CLinker::t_hc=NULL; //初设光标句柄

IMPLEMENT_DYNAMIC(CLinker,CStatic)

BEGIN_MESSAGE_MAP(CLinker,CStatic)
ON_WM_NCHITTEST()
ON_WM_LBUTTONDOWN()
ON_WM_CTLCOLOR_REFLECT()
ON_WM_SETCURSOR()
END_MESSAGE_MAP()

CLinker::CLinker()
{
m_color=t_unvclr; //初赋蓝色
}

void CLinker::SetLinkObject(CString str)
{
m_strlink=str; //用户设置目标路径(URL)
}

void CLinker::OnLButtonDown(UINT nFlags,CPoint point)
{
HINSTANCE hInst;
CString str;
GetWindowText(str); //获取当前控件标题
(!m_strlink.IsEmpty())?
(hInst=ShellExecute(0,_T("open"),m_strlink,0,0,SW_SHOWNORMAL)):
(hInst=ShellExecute(0,_T("open"),str,0,0,SW_SHOWNORMAL));
//如果用户没指定路径(URL),则试图用控件的标题作为路径(URL)
if((UINT)hInst<=32)
{
MessageBox("Can not found any object.");
//提示找不到目标
}
else
{
m_color=t_vdclr; //改为紫色
}
}

UINT CLinker::OnNcHitTest(CPoint point)
{
return HTCLIENT; //返回客户区鼠标
}

HBRUSH CLinker::CtlColor(CDC* pDC, UINT nCtlColor)
{
ASSERT(nCtlColor==CTLCOLOR_STATIC);
DWORD dwStyle=GetStyle();
HBRUSH hbr=NULL;
if((dwStyle & 0xFF)<=SS_RIGHT) //判断是否为文本
{
if(!(HFONT)m_font)
{
LOGFONT lf;
GetFont()->GetObject(sizeof(lf),&lf);
lf.lfUnderline = TRUE; //可选择下划线字体
m_font.CreateFontIndirect(&lf);
}
pDC->SelectObject(&m_font); //应用字体
pDC->SetTextColor(m_color); //应用文本前景色
pDC->SetBkMode(TRANSPARENT); //背景为透明

hbr=(HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}
return hbr;
}

BOOL CLinker::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message)
{
if(t_hc==NULL)
{
t_hc=::LoadCursor(NULL,MAKEINTRESOURCE(32649));
}
::SetCursor(t_hc);
return FALSE;
}

使用例子:
link.SubclassDlgItem(IDC_STATICLINK,this);
回复
模仿对话框上的超级链接,由CStatic类派生,参考了www.vckbase.com上的程序,中就有用到

BOOL CLinker::OnSetCursor(CWnd* pWnd,UINT nHitTest,UINT message)
{
if(t_hc==NULL)
{
t_hc=::LoadCursor(NULL,MAKEINTRESOURCE(32649));
}
::SetCursor(t_hc);
return FALSE;
}
回复
byf2002 2004-04-05
CStatic类似乎把WM_MOUSEMOVE消息给屏蔽了
回复
enoloo 2004-04-05
看看
HCURSOR h_icon = NULL;
h_icon= SetCursor( HCURSOR hCursor );
if(h_icon == NULL)
AfxMessageBox("failed");
else
AfxMessageBox("success");

如果没有对话框弹出,说明button没有接受到这个消息。
回复
zhangcrony 2004-04-05
Mark!!!
回复
zhangcrony 2004-04-05
::SetCursor(AfxGetApp()->LoadCursor(IDI_ICON1));
或者
::SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDI_ICON1)));
-------------------------------------------------------------------------------
I think here you get some problems. Absolutely you use a ICON here. What you are supposed to set is a Cursor, but not a Icon!!!
You should import a file resource with the extended file name *.cur or *. ani, but not *.ico
Please check this factor!!!
回复
Nirvana0 2004-04-05
myStatic.Create(_T("测试"), SS_CENTER | SS_NOTIFY(这里)
已经设了呀.
回复
szclm 2004-04-05
你要把它设成Notity
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……