请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
VC在线程中操作界面(二)
同样是在VC在线程中操作界面(一)的问题。我们可以通过另外一种方法来解决。
1. 定义消息处理函数和SetWindowLong返回值
static LRESULT CALLBACK PluginWinProc(HWND, UINT, WPARAM, LPARAM);
long OldProc;
2. 在Button1的处理函数中创建线程
void CMyDlg::OnButton1()
{
HWND h = m_btn2.m_hWnd;
OldProc = SetWindowLong(h,GWL_WNDPROC,long(PluginWinProc));
_beginthread(ThreadStart1,0,(void *)(&m_btn2));
}
3.
void CMyDlg::OnDestroy()
{
CDialog::OnDestroy();
SetWindowLong(m_btn2.m_hWnd,GWL_WNDPROC,OldProc);
}
4.
static LRESULT CALLBACK PluginWinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case MYMSG:
{
CWnd *wnd = CWnd::FromHandle(hwnd);
wnd->SetWindowText("aaaaaaa");
}
break;
default:
break;
}
return CallWindowProc((WNDPROC)OldProc,hwnd,msg,wParam,lParam);
}
代码都非常简单。关键的是SetWindowLong这个函数,这个函数的作用是设定窗口属性。GWL_WNDPROC 为窗口过程设置新地址。下面是MSDN中关于SetWindowLong和GWL_WNDPROC的说明:
若使用SetWindowLong函数和GWL_WNDPROC索引替换窗口过程,则给定的窗口过程必须遵
循WindowProc回调函数的说明中指定的准则。
使用GWL_WNDPROC索引调用SetWindowLong函数可创建该窗口类的子类(窗口类用来创建窗
口)。应用程序不得用另一个过程的窗口产生子类。
当然要在使用完后在用SetWindowLong原来的窗口过程设置回去。使用这种方法可用于修改你无法更改代码的类,可以重写他的消息处理函数。