win32 api 初级问题

兰博618 2009-08-15 04:16:18
最近我在学习《windows程序设计 第五版》这本书,有很多不懂的地方,下面就是其中一个,希望大侠帮忙修改源程序

下面的程序是“对话框”-“模态对话框”-“定义自己的控件”里的一个例子,我想根据书上的要求添加一个功能:
我在对话框里自定义了一个按钮(.rc文件表述如下),问题是如何实现书上的描述:
“按钮不会像普通的按键那样闪烁。要翻转按键内的颜色,窗口消息处理程序必须处理WM_KEYDOWN(来自空格键)和WM_LBUTTONDOWN消息。窗口消息处理程序还必须在收到WM_LBUTTONDOWN消息时拦截鼠标,并且,如果当按钮还处于按下状态,而鼠标移到了子窗口的显示区域之外,那么得要释放鼠标拦截(并将按钮的内部颜色回复为正常状态)。只有在鼠标被拦截时松开该按钮,子窗口才会给其父窗口送回一个WM_COMMAND消息。”
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
ICON "ABOUT3",IDC_STATIC,7,7,20,20
CTEXT "About3",IDC_STATIC,40,12,100,8
CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8
CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END
/////////////////////////////////////////////////////////////////////////////
// Menu
ABOUT3 MENU DISCARDABLE
BEGIN
POPUP "&Help"
BEGIN
MENUITEM "&About About3...", IDM_APP_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
// Icon
ABOUT3 ICON DISCARDABLE "icon1.ico"

.c文件程序如下
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK EllipPushWndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("About3") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = EllipPushWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = TEXT ("EllipPush") ;

RegisterClass (&wndclass) ;

hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance ;

switch (message)
{
case WM_CREATE :
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;

case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDM_APP_ABOUT :
DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
return 0 ;
}
break ;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG :
return TRUE ;

case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}

LRESULT CALLBACK EllipPushWndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
TCHAR szText[40] ;
HBRUSH hBrush ;
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
case WM_PAINT :
GetClientRect (hwnd, &rect) ;
GetWindowText (hwnd, szText, sizeof (szText)) ;

hdc = BeginPaint (hwnd, &ps) ;

hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;
SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;

Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
DrawText (hdc, szText, -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

DeleteObject (SelectObject (hdc, hBrush)) ;

EndPaint (hwnd, &ps) ;
return 0 ;

case WM_LBUTTONDOWN:

case WM_KEYUP :
if (wParam != VK_SPACE)
break ;
// fall through
case WM_LBUTTONUP :
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
...全文
124 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mark!
回复
雪影 2009-08-16
CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
按钮在rc正确写法
DEFPUSHBUTTON "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14

另外在窗口函数中,响应按钮的按下消息应该是WM_COMMAND消息,而不是WM_LBUTTONDOWN消息
回复
矛盾博弈 2009-08-16
LZ慢慢品味吧
回复
vchell 2009-08-16
怎么感觉lz把孙鑫第一张的例子给贴出来了 最近照顾了下孙鑫
回复
youjianwanlei 2009-08-16
回复
zngsai 2009-08-16
[Quote=引用 3 楼 tr0j4n 的回复:]
你的意思就是说鼠标移出窗口,想让他照样相应WM_LBUTTONUP是吧?
用SetCapture抓住鼠标就行了

HWND SetCapture(HWND hwnd);


[/Quote]

貌似这个对头!
回复
兰博618 2009-08-16
1楼,3楼说的都没错,但我不知从何入手,相关的例子实在是少.

CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14

是自定义按钮,这样做的目的只是为了学习一种方法,所以需要自己来发送消息,以达到按钮的功能,书上的例子只处理了WM_KEYUP(来自空格键)和WM_LBUTTONUP消息,这样还不能完全实现象按钮一样按下之后回凹陷下去或使背景色改变;所以我想通过WM_KEYDOWN(来自空格键)和WM_LBUTTONDOWN来使这个按钮的效果更好,但我刚学win32,改这么个简单的功能都不知道从何下手,所以希望有人能给我帮助
回复
HuWenjin 2009-08-16
CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
用Wnd来模拟自绘按钮??



建议:

扔了这本书,另找一本有实用性的,比如先学习每一个标准控件用法,WINDOWS消息。。。
回复
healer_kx 2009-08-15
MARK
回复
DavidHsing 2009-08-15
看得有点晕。lz 检紧要的贴出来吧
回复
MoXiaoRab 2009-08-15
你的意思就是说鼠标移出窗口,想让他照样相应WM_LBUTTONUP是吧?
用SetCapture抓住鼠标就行了

HWND SetCapture(HWND hwnd);

回复
见习学术士 2009-08-15
LZ这样垒代码累不
回复
猞猁狲 2009-08-15
一个简单问题让楼主说的那么复杂,楼主意思是说,鼠标按下不松开,如果鼠标滑出按钮区域,按钮就恢复正常状态,是这个意思吧!?

捕获按钮的 WM_MOVE 消息,检查如果鼠标的坐标在按钮之外,向按钮发送 WM_LBUTTONUP 消息
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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