Win32窗口过程与窗口问题

wangsifu2009 2010-11-18 12:59:02
请问一个窗口过程是对应一个窗口还是对应一类窗口(使用同一个窗口类创建的)?

窗口过程函数


LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);


里面的hwnd指的是哪个窗口句柄,如何使用这个句柄?

...全文
196 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangsifu2009 的回复:]
To:wltg2001

如果创建两个窗口共享一个窗口过程,那么如何区分开对获得的消息进行不同的处理呢?就是说如果两个窗口对同一个消息处理方式不同,那怎么做。
[/Quote]
既然两个窗口共享同一个窗口过程,那么对于同一个消息它的处理行为就应该是一致的,如果对同一个消息的处理方式不同,那么这两个窗口就不应该共用一个窗口类。
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
不好意思,没注意到这个函数,谢谢你
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
大哥哥:
你的程序只启动了一个进程,PostQuitMessage是给当前的进程发送消息,结束当前进程。当然退出了。
你可以销毁一个窗口不就完了.
你可以DestoryWindow(hwnd)销毁一个指定窗口啊.
两个窗口属于一个进程,就好象你开VS 或者 VC 6.0 ,退出的时候退出的是整个进程,所有附属窗口也关闭了。

wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
关键是为什么关掉一个窗口后另一个也关闭了,而且消息框只弹出一次。
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
我创建了一个文件 用了以下 你是看的弹出的字符串是么?
MessageBox(hWnd,"OK!Window1",NULL,0);
你的两个消息都弹出的这个, 你怎么判断, 你把 hwnd = ghwnd2 换一下弹出字符串
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复

#include<windows.h>
#include<tchar.h>
//窗口类名和窗口标题
TCHAR szWindowClass[]=_T("HELLOWINDOWS");
TCHAR szWindowTitle1[]=_T("This is the MAIN window");
TCHAR szWindowTitle2[]=_T("Test");

HWND g_hWnd1;
HWND g_hWnd2;
//窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//LogMessage(logfile,msg,wParam,lParam);//
if(hWnd == g_hWnd1)
{
switch(msg)
{
case WM_DESTROY:
MessageBox(hWnd,"OK!Window1",NULL,0);
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
}
else if(hWnd == g_hWnd2)
{
switch(msg)
{
case WM_DESTROY:
MessageBox(hWnd,"OK!Window1",NULL,0);
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
}
}

int WINAPI _tWinMain( HINSTANCE hInstance,HINSTANCE,LPTSTR lpCmdLine,int nCmdShow)
{
//注册窗口类
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
//创建主窗口
HWND hWnd1 = CreateWindowEx(0,szWindowClass, szWindowTitle1, WS_OVERLAPPEDWINDOW,
128, 96, 512, 480, HWND_DESKTOP, NULL, hInstance, NULL);

if (!hWnd1)
return FALSE;
g_hWnd1 = hWnd1;
HWND hWnd2 = CreateWindowEx(0,szWindowClass, szWindowTitle2, WS_OVERLAPPEDWINDOW,
128, 96, 512, 480, HWND_DESKTOP, NULL, hInstance, NULL);

if (!hWnd2)
return FALSE;
g_hWnd2 = hWnd2;
//显示并更新主窗口
ShowWindow(hWnd1,nCmdShow);
UpdateWindow(hWnd1);

ShowWindow(hWnd2,nCmdShow);
UpdateWindow(hWnd2);
// 进入消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
//程序退出
}
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangsifu2009 的回复:]

按你的方式我试了下,感觉有问题啊。
[/Quote]
你能给段代码么 看看代码
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
按你的方式我试了下,感觉有问题啊。
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
两个窗口公用一个窗口过程,那么过程函数地址也是不一样的啊,如果你能保证两个窗口函数的地址一样
那么你就
HWND h1,h2

WndPRoc(HWND h...)
{
case WM_..
if(h = h1)
..
if(h == h2)
..
}
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangsifu2009 的回复:]

To wangbo56916860 :

你的意思且不就是每个窗口有一个窗口过程嘛!

我现在想对两个窗口进行不同的处理(对同一种消息),这窗口过程如何写呢?
[/Quote]

写两个WndProc 不就完了么
WindowProc1
WindowProc2
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
To wangbo56916860 :

你的意思且不就是每个窗口有一个窗口过程嘛!

我现在想对两个窗口进行不同的处理(对同一种消息),这窗口过程如何写呢?
zyouth 2010-11-18
  • 打赏
  • 举报
回复
楼上说的有道理
wangbo56916860 2010-11-18
  • 打赏
  • 举报
回复
WindowProc(
HWND hwnd, //handle to the window

不同的窗口的hwnd 不同,回调函数的地址也不同

多个窗口调用统一个,操作系统会 为每个窗口调用自己的窗口过程
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
To crosoli :

在哪里判断?你是说在窗口过程里判断吗?

crosoli 2010-11-18
  • 打赏
  • 举报
回复
判断触发消息的句柄hwnd
wangsifu2009 2010-11-18
  • 打赏
  • 举报
回复
To:wltg2001

如果创建两个窗口共享一个窗口过程,那么如何区分开对获得的消息进行不同的处理呢?就是说如果两个窗口对同一个消息处理方式不同,那怎么做。
wltg2001 2010-11-18
  • 打赏
  • 举报
回复
请问一个窗口过程是对应一个窗口还是对应一类窗口(使用同一个窗口类创建的)?
=============
是对应一类窗口。

里面的hwnd指的是哪个窗口句柄,如何使用这个句柄?
============
hwnd是指收到消息的窗口,对于很多操作窗口的API来说,这个hwnd都是必须的参数。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧