求助:窗口过程的问题!
#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
到底是怎么是怎么换窗口过程,又是怎么把不处理的消息交给以前的窗口过程处理的,
谢谢大家了。
#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
到底是怎么是怎么换窗口过程,又是怎么把不处理的消息交给以前的窗口过程处理的,
谢谢大家了。
...全文
相关推荐
求助各位大虾关于itae积分指标实现的问题-heatexdemo.m
求助各位大虾关于itae积分指标实现的问题-heatexdemo.m 这个在matlab里面怎么实现阿 ! 比如用pid去控制一个最简单的一阶惯性环节! 用这个itae指标去优化pid的参数 这个怎么弄 具体步骤 向各位大虾求助了阿
windows 窗口过程函数
该文档描述了windows程序中,窗口过程函数组件的知识,窗口过程承载了windows程序的功能实现部分
如何获取其它进程中窗口的窗口过程
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
获取另一个窗口的窗口过程_VC源码
获取另一个窗口的窗口过程,常用来定位FromHandlePermennet什么的.
编写窗口过程函数
编写窗口过程函数 这里告诉我们什么是编写窗口过程函数。


