VC在线程中操作界面(二)

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“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中关于SetWindowLongGWL_WNDPROC的说明:

若使用SetWindowLong函数和GWL_WNDPROC索引替换窗口过程,则给定的窗口过程必须遵

WindowProc回调函数的说明中指定的准则。

使用GWL_WNDPROC索引调用SetWindowLong函数可创建该窗口类的子类(窗口类用来创建窗

)。应用程序不得用另一个过程的窗口产生子类。

当然要在使用完后在用SetWindowLong原来的窗口过程设置回去。使用这种方法可用于修改你无法更改代码的类,可以重写他的消息处理函数。

你可能感兴趣的:(callback,button)