分享
 
 
 

智能ABC窗口的实现

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

智能ABC窗口的实现

作者:王海军

下载源代码高级顶层窗口是一种无标题栏、菜单、工具条的一种常居顶层的窗口,最常见的例子就是输入法窗口,比如智能ABC窗口。这类窗口的特点除了上边所说的,最重要的就是窗口移动。普通窗口移动是通过标题栏由系统自动实现的,对于这类窗口就无法依靠系统了,需要手工实现。实现的方法有两种:

手工处理WM_MOVE、WM_LBUTTONUP消息,并根据鼠标的移动自己实现窗口移动过程中的绘制;

在WM_MOVE消息处理函数中通过向自己发送参数wParam为HTCAPTION

lParam为鼠标位置的WM_NCLBUTTONDOWN消息实现窗口移动,此时窗口移动过程的绘制由系统实现。

显然,后者较前者简单。本文采用后者。

为了实现移动,还要对窗口定义有效移动区域,就是当鼠标移动到窗口中哪部分时鼠标变为十字箭头,暗示现在可以按下左键开始拖动。本文实现的窗口中有四个紧密排列的位图“按钮”,它们之间没有空隙,所以我定义位图以外窗口以内为有效移动区域。鼠标进入这片区域时将变为十字箭头形状,提示用户现在可以进行拖动。

在定义窗口类时,如果窗口有边框,那么当鼠标在边框上时,接收到的是WM_NCMOUSEMOVE消息,所以为了在WM_MOUSEMOVE消息处理函数中统一处理,本文窗口没有使用边框,只要鼠标进入窗口,就开始接收到WM_MOUSEMOVE消息了。但这又引入另一个问题:如何绘制3D边框?本文使用了函数

:void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)

实现了3D边框的绘制。

本文实现的基本原理:

从CWnd直接派生一个窗口类CMainWnd,并添加一个共有函数bool

CreateMainWnd()用来创建窗口;

在相应WM_PAINT时,在客户区中根据四个标记变量绘制相应的四个位图;

在WM_LBUTTONDOWN 消息处理中,检测鼠标是否落入某个“按钮”位图,设置相应标志,并强制系统重绘客户区;

在WM_MOUSEMOVE消息处理中,检测鼠标是否落入有效移动区域,并设置相应光标。如果按下了左键,就开始发送WM_NCLBUTTONDOWN消息,实现窗口移动;

为了关闭窗口,本程序设置了加速键F12,按F12可关闭程序;

代码如下:

1、创建窗口:

bool CMainWnd::CreateMainWnd(void)

{

if(!CreateEx(0,

::AfxRegisterWndClass(0,

::LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)),

GetSysColorBrush(COLOR_ACTIVEBORDER)

),

NULL,

WS_POPUP,

0,0,300,50,

NULL,

NULL))

return false;

return true;

}

2、窗口绘制:根据四个位图“按钮”标志变量绘制相应的位图。

void CMainWnd::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: 在此处添加消息处理程序代码

// 不为绘图消息调用 CWnd::OnPaint()

CBitmap* pOldBmp;

CDC CompatibleDC;

CompatibleDC.CreateCompatibleDC(&dc);

//绘制第一个按钮

if(m_bBTState[0])

pOldBmp=CompatibleDC.SelectObject(&m_BT1_1);

else

pOldBmp=CompatibleDC.SelectObject(&m_BT1_2);

dc.BitBlt(m_rcBT1.left,m_rcBT1.top,m_rcBT1.Width(),m_rcBT1.Height(),&CompatibleDC,0,0,SRCCOPY);

//绘制第二个按钮

if(m_bBTState[1])

CompatibleDC.SelectObject(&m_BT2_1);

else

CompatibleDC.SelectObject(&m_BT2_2);

dc.BitBlt(m_rcBT2.left,m_rcBT2.top,m_rcBT2.Width(),m_rcBT2.Height(),&CompatibleDC,0,0,SRCCOPY);

//绘制第三个按钮

if(m_bBTState[2])

CompatibleDC.SelectObject(&m_BT3_1);

else

CompatibleDC.SelectObject(&m_BT3_2);

dc.BitBlt(m_rcBT3.left,m_rcBT3.top,m_rcBT3.Width(),m_rcBT3.Height(),&CompatibleDC,0,0,SRCCOPY);

//绘制第四个按钮

if(m_bBTState[3])

CompatibleDC.SelectObject(&m_BT4_1);

else

CompatibleDC.SelectObject(&m_BT4_2);

dc.BitBlt(m_rcBT4.left,m_rcBT4.top,m_rcBT4.Width(),m_rcBT4.Height(),&CompatibleDC,0,0,SRCCOPY);

//绘制第五个按钮

if(m_bBTState[4])

CompatibleDC.SelectObject(&m_BT5_1);

else

CompatibleDC.SelectObject(&m_BT5_2);

dc.BitBlt(m_rcBT5.left,m_rcBT5.top,m_rcBT5.Width(),m_rcBT5.Height(),&CompatibleDC,0,0,SRCCOPY);

//绘制边框

CRect rcClient;

GetClientRect(&rcClient);

dc.Draw3dRect(&rcClient,RGB(192,192,192),RGB(0,0,0));

rcClient.DeflateRect(1,1,1,1);

dc.Draw3dRect(&rcClient,RGB(255,255,255),RGB(144,144,144));

CompatibleDC.SelectObject(pOldBmp);

}

3、WM_MOUSEMOVE 消息处理函数

void CMainWnd::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

bool bInRegionNow=IsInRegion(point);

TRACE("Mouse move:(%d,%d) InRegion=%d\n",point.x,point.y,bInRegionNow);

if(bInRegionNow)

{

SetCursor(m_hCrossCursor);//设置十字形光标

if(nFlags&MK_LBUTTON)

{

POINT pt;

pt.x=point.x;pt.y=point.y;

ClientToScreen(&pt);

//发送移动消息

SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,(LPARAM)(pt.x|(pt.y16)));

}

}

CWnd::OnMouseMove(nFlags, point);

}

程序运行效果

效果如下:

你可以用鼠标拖动它到任意位置。

结束语

本文只是实现了和智能ABC类似的窗口,但我在用spy++查找智能ABC窗口时发现并不能找到它,不知为什么,难道它根本就不是一个真正的窗口?那它又是怎么实现的呢?有谁知道的能否告诉我,谢谢!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有