能力值:
( LV15,RANK:670 )
|
-
-
2 楼
Win32 编程进阶:打造自己的标准控件 后续
作者:cntrump
上一章的教程中已经创建一个独立功能的控件,但是这个控件是封闭的,在父窗口的消息循环中接收不了控件的消息。如果只是单独地打开一个网页链接的话这是没有什么问题的,但如果需要像按钮一样单击之后进行其他处理就不行。
本章教程目的就是解决这个问题,让自定义的控件能像标准控件一样在父窗口的 WM_COMMAND消息中对其进行响应。
要解决这个问题很简单,只需要在控件相应的消息中把消息发给其父窗口就可以了。
关键的消息有两个:WM_COMMAND和WM_NOTIFY。
由于我们的这个控件很简单,WM_COMMAND消息就可以完全处理了,所以WM_NOTIFY通知不用理会。
需要修改的地方是鼠标按下和弹起,还有转发WM_COMMAND消息给父窗口。
修改后的地方:
case WM_LBUTTONDOWN:
SetCursor(LoadCursor(NULL, IDC_HAND));
wParam = GetDlgCtrlID(hWnd);
SendMessage(GetParent(hWnd), WM_COMMAND, wParam, (LPARAM)hWnd);
break;
case WM_LBUTTONUP:
{
SetCursor(LoadCursor(NULL, IDC_HAND));
wParam = GetDlgCtrlID(hWnd);
SendMessage(GetParent(hWnd), WM_COMMAND, wParam, (LPARAM)hWnd);
}
break;
case WM_COMMAND:
SendMessage(GetParent(hWnd), WM_COMMAND, wParam, lParam);
break;
这样在父窗口就可以进行处理了,当子类化按钮时也不会改变按钮的点击行为了。
|
能力值:
( LV7,RANK:100 )
|
-
-
3 楼
我以前倒是没想这么多。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
大牛啊,还在努力的啃汇编跟C,不知道什么时候才能到这种程度...
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢楼主分享,mark~!
|
能力值:
( LV3,RANK:30 )
|
-
-
6 楼
cntrump是猛男啊是猛男
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
这个微软已经提供了吧。。CMFCXXXX后面是啥不记得了。。。
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
楼主编程水平很高。学习。
|
能力值:
( LV9,RANK:610 )
|
-
-
9 楼
膜拜大牛~ 学习。。。
|
能力值:
( LV15,RANK:520 )
|
-
-
10 楼
谢谢啊,123212
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
换皮肤原理是不是也差不多?
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
case WM_LBUTTONUP: // 鼠标弹起时打开链接
{
TCHAR *text = (TCHAR*)GetWindowLong(hWnd, 0);
SetCursor(LoadCursor(NULL, IDC_HAND));
if (text == NULL)
break;
ShellExecute(hWnd, _T("OPEN"), text, NULL, NULL, SW_SHOW);
}
;这个地方应该再判断一下是否是在该控件上点击后再弹起鼠标左键的,否则在非控件区域点按下鼠标左键后,再移动到超链接控件,再弹起鼠标左键,这样也会执行以上流程,打开网址~
|
能力值:
( LV15,RANK:670 )
|
-
-
13 楼
http://www.cppblog.com/alantop/archive/2009/11/08/100410.html
可能是这个,MS提供的都是高级货。俺们只能山寨个能用的。
|
能力值:
( LV15,RANK:670 )
|
-
-
14 楼
对,这是个问题,应该在控件的鼠标左键被按下时捕捉鼠标。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
学习下,又来马克了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
绝对牛人啊,膜拜
|
能力值:
( LV3,RANK:20 )
|
-
-
17 楼
case WM_LBUTTONUP:
{
if(GetCaptured() == hWnd)
{
TCHAR *text = (TCHAR*)GetWindowLong(hWnd, 0);
SetCursor(LoadCursor(NULL, IDC_HAND));
..
}
}
break;
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
学习了。。。。
|
能力值:
( LV5,RANK:60 )
|
-
-
19 楼
不错啊。。。。。。。。。。 学习下
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
看了下windows标准控件BUTTON的实现方式,是先在WM_LBUTTONDOWN的时候调用:SetCapture,这样的话所有鼠标输入都会发送给BUTTON按钮处理,直到收到WM_LBUTTONUP后。
|
能力值:
( LV15,RANK:670 )
|
-
-
21 楼
鼠标移出的时候也要处理,否则...
我在二楼添加了修正后的附件。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
不胜感激 正头疼呢 找了一下午 就这一篇由价值
|
|
|