windows程序设计 第7章中的 CHECKER4 中。主窗口:
hwnd=CreateWindow(
szAppName,
TEXT("Checker4 Mouse Hit-Test Demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
子窗口:
hwndChild[x][y]=CreateWindow(
szChildClass,
NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0,0,0,0,
hwnd,(HMENU)(y<<8 | x),
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);hwnd是主窗口柄。那么子窗口的回调函数中:LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//...
switch(message)
{
case WM_SETFOCUS:
idFocus=GetWindowLong(hwnd,GWL_ID);
return 0;
}
//....
}
中的GetWindowLong(hwnd,GWL_ID)是什么意思。
获得主窗口的ID吗,可以主窗口哪有ID啊,不是NULL吗?那么GetWindowLong(hwnd,GWL_ID)得到的到底是什么?
hwnd=CreateWindow(
szAppName,
TEXT("Checker4 Mouse Hit-Test Demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
子窗口:
hwndChild[x][y]=CreateWindow(
szChildClass,
NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0,0,0,0,
hwnd,(HMENU)(y<<8 | x),
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);hwnd是主窗口柄。那么子窗口的回调函数中:LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//...
switch(message)
{
case WM_SETFOCUS:
idFocus=GetWindowLong(hwnd,GWL_ID);
return 0;
}
//....
}
中的GetWindowLong(hwnd,GWL_ID)是什么意思。
获得主窗口的ID吗,可以主窗口哪有ID啊,不是NULL吗?那么GetWindowLong(hwnd,GWL_ID)得到的到底是什么?
解决方案 »
- MFC activex开发,如何在这个activex上添加多个按钮并响应按钮事件
- 这里高手多,别的版块问不出来的基础问题,来这里问问吧。大家请进,谢谢。
- 为什么我的对话框程序不能响应listctrl的HDN_ITEMCHANGED消息??
- 使用MFC INET类,提交http请求,aspx的post问题【解决了以后加到100】
- 如何在CEdit里只显示两位小数?
- 在SDK中怎样改变STATIC静态文本的背景颜色?(在SDK中,不是MFC)
- 我是一个VC初学者,请问怎样才能将所画的线一直保留在窗体上?
- 单文档多视:为何切换后视和客户区不一样大?最大化也不响应?
- 怎样才能在CTreeCtrl里回车结束一个label的编辑
- 再讨论,VB vs VC++(在一个贴子里你回复不能超过50次!!换一个,嘿嘿)
- GLSL两个着色器在shaderdesigner中通过了,但在VS2005中载入出现提示语法错误
- 在VC中出现“读取位置0x00000358时发生访问冲突”
虽然你设的是NULL
但这个函数的功能还是那样
idFocus=GetWindowLong(hwnd,GWL_ID);
执行后idFocus应该是0才对啰.但调试时,击键后(0,0)块除外,iFocus就不等于0.全代码如下:
#include <Windows.h>#define DIVISIONS 5LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
TCHAR szChildClass[]=TEXT("Checker3_Child");
int idFocus=0;int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd )
{
static TCHAR szAppName[]=TEXT("temp");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("注册失败"),szAppName,MB_ICONERROR);
return 0;
}
wndclass.hCursor=LoadCursor(NULL,IDC_HAND);
wndclass.lpfnWndProc=ChildWndProc;
wndclass.hIcon=NULL;
wndclass.cbWndExtra=sizeof(long);
wndclass.lpszClassName=szChildClass;
if(!RegisterClass(&wndclass))
return 0; hwnd=CreateWindow(
szAppName,
TEXT("Checker4 Mouse Hit-Test Demo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nShowCmd);
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 HWND hwndChild[DIVISIONS][DIVISIONS];
int cxBlock,cyBlock,x,y;
switch(message)
{
case WM_CREATE:
for(x=0;x<DIVISIONS;x++)
for(y=0;y<DIVISIONS;y++)
hwndChild[x][y]=CreateWindow(
szChildClass,
NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0,0,0,0,
hwnd,(HMENU)(y<<8 | x),
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
return 0;
case WM_SIZE:
cxBlock=LOWORD(lParam)/DIVISIONS;
cyBlock=HIWORD(lParam)/DIVISIONS;
for(x=0;x<DIVISIONS;x++)
for(y=0;y<DIVISIONS;y++)
MoveWindow(hwndChild[x][y],x*cxBlock,y*cyBlock,cxBlock,cyBlock,TRUE);
return 0;
case WM_LBUTTONDOWN:
MessageBeep(MB_ICONERROR);
return 0;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd,idFocus));
return 0;
case WM_KEYDOWN:
x=idFocus & 0xFF;
y=idFocus>>8;
switch(wParam)
{
case VK_UP:
y--;
break;
case VK_DOWN:
y++;
break;
case VK_END:
x=y=DIVISIONS-1;
break;
case VK_HOME:
x=y=0;
break;
case VK_LEFT:
x--;
break;
case VK_RIGHT:
x++;
break;
default:
return 0;
}
x=(x+DIVISIONS)%DIVISIONS;
y=(y+DIVISIONS)%DIVISIONS;
idFocus=y<<8 | x;
SetFocus(GetDlgItem(hwnd,idFocus));
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
SetWindowLong(hwnd,0,0);
return 0;
case WM_KEYDOWN:
if(wParam!=VK_RETURN && wParam !=VK_SPACE)
{
SendMessage(GetParent(hwnd),message,wParam,lParam);
return 0;
}
case WM_LBUTTONDOWN:
SetWindowLong(hwnd,0,1^GetWindowLong(hwnd,0));
SetFocus(hwnd);
InvalidateRect(hwnd,NULL,FALSE);
return 0;
case WM_SETFOCUS:
idFocus=GetWindowLong(hwnd,GWL_ID);
case WM_KILLFOCUS:
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
Rectangle(hdc,0,0,rect.right,rect.bottom);
if(GetWindowLong(hwnd,0))
{
MoveToEx(hdc,0,0,NULL);
LineTo(hdc,rect.right,rect.bottom);
MoveToEx(hdc,0,rect.bottom,NULL);
LineTo(hdc,rect.right,0);
}
if(hwnd==GetFocus())
{
rect.left+=rect.right/10;
rect.right-=rect.left;
rect.top+=rect.bottom/10;
rect.bottom-=rect.top;
SelectObject(hdc,GetStockObject(NULL_BRUSH));
SelectObject(hdc,CreatePen(PS_DASH,0,0));
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
DeleteObject(SelectObject(hdc,GetStockObject(BLACK_PEN)));
}
EndPaint(hwnd,&ps);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
GetWindowLong(hwnd,GWL_ID)就是获取子窗口ID,当然不为0咯
一语点醒!!
再问一句,点子窗口时,子窗口是不是先获得WM_FOCUS,再获得WM_KEYDOWN.
原来没用过Spy++,刚下了一个,怎么对窗口发送消息?
只看见里面有一堆父窗口句柄,上一个窗口句柄之类的东西,没看到有WM_SETFOCUS、WM_LBUTTONDOWN: