求助:窗口过程的问题!
#include <windows.h>
#define ID_LIST 1
#define DIRATTR (DDL_READWRITE|DDL_READONLY| DDL_SYSTEM |DDL_DIRECTORY)
LRESULT CALLBACK listproc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);
WNDPROC oldproc;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
static TCHAR szAppName[]=TEXT("MyApp");
MSG msg;
HWND hwnd;
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(COLOR_BTNFACE+1);
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon=LoadIcon(NULL,NULL);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinProc;
wndcls.lpszClassName=szAppName;
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
hwnd=CreateWindow(szAppName,"app",
WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
hwndlist=CreateWindow(TEXT("listbox"),NULL,WS_CHILDWINDOW|WS_VISIBLE|LBS_STANDARD | WS_BORDER,
150,45,180,200,hwnd,(HMENU)ID_LIST,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
oldproc=(WNDPROC)SetWindowLong(hwndlist,GWL_WNDPROC,(LPARAM)listproc);
return 0;
case WM_PAINT:
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
LRESULT CALLBACK listproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
if((message==WM_KEYDOWN)&&(wparam==VK_RETURN))
SendMessage(GetParent(hwnd),WM_COMMAND,MAKELONG(1,LBN_DBLCLK),(LPARAM)hwnd);
return CallWindowProc(oldproc,hwnd,message,wparam,lparam);
}
oldproc=(WNDPROC)SetWindowLong(hwndlist,GWL_WNDPROC,(LPARAM)listproc);
这个意思是说将hwndlist的窗口过程换成listproc而不用主窗口的窗口过程吗?
return CallWindowProc(oldproc,hwnd,message,wparam,lparam);
那这个oldproc又是什么意思呢?oldproc不是在上面等于listproc。可是我看有的地方说
是如在本程序中只处理if((message==WM_KEYDOWN)&&(wparam==VK_RETURN))这个,其他消息
就交给上一个窗口过程程序。这上一个窗口过程我理解可能是主窗口的处理程序。只是这里
用oldproc=(WNDPROC)SetWindowLong(hwndlist,GWL_WNDPROC,(LPARAM)listproc);后将hwndlist
这个子窗口的窗口过程从WndProc换成了listproc.但return CallWindowProc(oldproc,hwnd,message,wparam,lparam);
我又不明白了,我认为应该是CallWindowProc(Wndproc,hwnd,message,wparam,lparam);
这样才是把消息发给以前的窗口过程,就是父窗口处理程序才对啊。
各位友友谁能给我解释一下SetWindowLong和CallWindowProc
到底是怎么是怎么换窗口过程,又是怎么把不处理的消息交给以前的窗口过程处理的,
谢谢大家了。