peerconnection_client的MainWnd分析(一)

来源:互联网 发布:vc6.0连接mysql数据库 编辑:程序博客网 时间:2024/06/04 20:10

MainWnd中使用的就是MFC的消息机制,在此复习一下MFC吧

在MainWnd::Create()中,调用RegisterWindowClass():

bool MainWnd::RegisterWindowClass() {  if (wnd_class_)    return true;  WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };  wcex.style = CS_DBLCLKS;  wcex.hInstance = GetModuleHandle(NULL);  wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);  wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);  wcex.lpfnWndProc = &WndProc;  //注册消息处理函数  wcex.lpszClassName = kClassName;  wnd_class_ = ::RegisterClassEx(&wcex);  ASSERT(wnd_class_ != 0);  return wnd_class_ != 0;}

MainWnd中发送消息为调用:

PostMessage(wnd_, WM_COMMAND, ...)

其中wnd_为接收消息的窗口句柄,MainWnd中接收消息的函数就是上面注册的WndProc:

LRESULT CALLBACK MainWnd::WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {  MainWnd* me = reinterpret_cast<MainWnd*>(      ::GetWindowLongPtr(hwnd, GWLP_USERDATA));  if (!me && WM_CREATE == msg) {    CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lp);    me = reinterpret_cast<MainWnd*>(cs->lpCreateParams);    me->wnd_ = hwnd;    ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(me));  }  LRESULT result = 0;  if (me) {    void* prev_nested_msg = me->nested_msg_;    me->nested_msg_ = &msg;    bool handled = me->OnMessage(msg, wp, lp, &result);    if (WM_NCDESTROY == msg) {      me->destroyed_ = true;    } else if (!handled) {      result = ::DefWindowProc(hwnd, msg, wp, lp);    }    if (me->destroyed_ && prev_nested_msg == NULL) {      me->OnDestroyed();      me->wnd_ = NULL;      me->destroyed_ = false;    }    me->nested_msg_ = prev_nested_msg;  } else {    result = ::DefWindowProc(hwnd, msg, wp, lp);  }  return result;}
0 0