在线程中如和创建和显示一个窗口 用的 请教各位高手哪个应该怎样做 
//Socket线程,负责接收数据
DWORD WINAPI CAVIOMgr::SockThreadProc(LPVOID lpParameter)
{   
    CAVIOMgr* pMgr=(CAVIOMgr*)lpParameter;
    /////////////////////////////pMgr->m_Socketcp.Listen();
    SOCKET TEMPSOCKET=NULL;
    int i ;
    i=sizeof(struct sockaddr_in);
    sockaddr_in addr;
    DWORD ThreadId;                          
    TEMPSOCKET=accept(pMgr->m_Socketcp.serv, (sockaddr*)&addr, &i);//gjl200
    CreateThread(0,0,SockThreadProc,(LPVOID)lpParameter,0,&ThreadId);
    if (TEMPSOCKET!=INVALID_SOCKET )
{
pMgr->m_Socketcp.CLINET_SOCK[socknum]=TEMPSOCKET;
   //if(socknum < 4)
   //{
   //CVideoWnd *ss = new CVideoWnd;
   //m_remownd[socknum]=ss;

    m_remownd[socknum].Create(IDD_VIDEO,pMgr->m_hwndMainWnd, FALSE);
    
    m_remownd[socknum].m_vs.remsock=TEMPSOCKET;
    ShowWindow(m_remownd[socknum],SW_SHOW);
    ShowWindow(m_remownd[socknum].m_vs,SW_SHOW);
//SetWindowPos(m_remownd[socknum].GetHwnd(),100,122+20,100,0,0,SWP_NOSIZE);
// }
}

解决方案 »

  1.   

    你可以直接使用从CWinThread派生的类,可能更方便一些,就按照CWinApp的模式来做。
      

  2.   


    给你打了一段程序,又出错了,白打了简单说一下吧
    在你的线程类中重载CWinThread::InitInstance()
    在其中创建你的窗口
      

  3.   

    只有在带消息泵的界面线程才可以,
    在工作者线程中是没有办法创建窗口的,除非自己写消息循环而且在线程中创建的窗口必须为顶级窗口,如果是主窗口的子窗口,会有好多的问题。
    比如不能使用CWnd*来指定父窗口劝你不要找麻烦了像你这种程序可以在主线程创建窗口,然后线程中通过消息方式显示
      

  4.   

    我有一段在在NT服务中创建窗口的代码,看看对你是否有帮助// 为了任务栏的图标
    #define WM_SYSTEMTRAY      WM_USER + 1
    #define WM_FRONTHASDO      WM_USER + 2
    #define WM_ADDTRAYICON     WM_USER + 4LRESULT CALLBACK myboleProc(
      HWND hwnd,        // handle to window
      UINT useMsg,      // message identifier
      WPARAM wParam,    // first message parameter
      LPARAM lParam     // second message parameter
    )
    {
    switch(useMsg)
    {
    case WM_SYSTEMTRAY:
    {  
    switch (lParam)
    {
            // 双击打开前台处理程序   
    case WM_LBUTTONDBLCLK:         
    ShellExecute(NULL,"open",g_ExeFileDirectory,NULL,NULL,SW_SHOW);    
             break;
    }
    }
    break; case WM_TIMER:
            g_iWhichIcon = !g_iWhichIcon;
    NOTIFYICONDATA  nid;
    nid.cbSize = sizeof( NOTIFYICONDATA );
    nid.hWnd = hwnd;
    nid.uID = IDI_MYICON;
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.uCallbackMessage = WM_SYSTEMTRAY;
    nid.hIcon =  ::LoadIcon(g_hInstance,MAKEINTRESOURCE( g_iWhichIcon ?  IDI_MYICON : IDI_MYICON2)  );
    strcpy((nid.szTip),"ExceptionService收到故障报警。鼠标左键双击该图标进行处理");
    Shell_NotifyIcon(NIM_MODIFY ,&nid);
    break; // 向任务栏添加图标
    case WM_ADDTRAYICON:
    NOTIFYICONDATA  nid2;
    nid2.cbSize = sizeof( NOTIFYICONDATA );
    nid2.hWnd   = hTrayIconDlghWnd;
    nid2.uID    = IDI_MYICON;
    nid2.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid2.uCallbackMessage = WM_SYSTEMTRAY;
    nid2.hIcon =  ::LoadIcon( g_hInstance,MAKEINTRESOURCE(IDI_MYICON));
    strcpy(nid2.szTip,"安防报警服务程序");
    Shell_NotifyIcon(NIM_ADD,&nid2);
    SetTimer(hTrayIconDlghWnd,1,500,NULL);
    break;
       
    // 收到前台界面发送的消息,从任务栏删除图标
        case WM_FRONTHASDO:
    NOTIFYICONDATA  nid1;
    nid1.cbSize = sizeof( NOTIFYICONDATA );
    nid1.hWnd = hwnd;
    nid1.uID = IDI_MYICON;
    nid1.uFlags = 0;
    Shell_NotifyIcon(NIM_DELETE,&nid1);
    break; default:
    return DefWindowProc(hwnd,useMsg,wParam,lParam);
    } return 0;
    }void CreateTrayIconWindows()
    {
    g_hInstance = NULL;
        g_hInstance = GetModuleHandle(NULL);
    g_iWhichIcon = 1;    if ( !hTrayIconDlghWnd )
    {
    WNDCLASS wndclass; 
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=NULL;
    wndclass.hIcon=NULL;
    wndclass.hInstance=g_hInstance ;
    wndclass.lpfnWndProc=myboleProc;
    wndclass.lpszClassName="myclass";
    wndclass.lpszMenuName=NULL;
    wndclass.style=CS_VREDRAW;

    RegisterClass(&wndclass);

    hTrayIconDlghWnd = CreateWindow("myclass","{370E815D-1685-4ab9-8D92-830373FEF138}static const GUID <<name>>= { 0x370e815d, 0x1685, 0x4ab9, { 0x8d, 0x92, 0x83, 0x3, 0x73, 0xfe, 0xf1, 0x38 } }",WS_OVERLAPPEDWINDOW,50,50,400,300,NULL,NULL,g_hInstance,NULL);
    if(!hTrayIconDlghWnd )
    {
    return ;
    }
    }
    ::ShowWindow(hTrayIconDlghWnd,SW_HIDE); m_bTrayIconDlgHasCreate= true;
    }// 添加任务栏图标的接收的窗口
    BOOL AddTrayIconWindows()
    { HDESK   hdeskCurrent;
        HDESK   hdesk;
        HWINSTA hwinstaCurrent;
        HWINSTA hwinsta;    hwinstaCurrent = GetProcessWindowStation();
        if (hwinstaCurrent == NULL)
    {
    return FALSE;
    }    hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
        if (hdeskCurrent == NULL)
    {
    return FALSE;
    }    hwinsta = OpenWindowStation( "winsta0", FALSE,
                                      WINSTA_ACCESSCLIPBOARD   |
                                      WINSTA_ACCESSGLOBALATOMS |
                                      WINSTA_CREATEDESKTOP     |
                                      WINSTA_ENUMDESKTOPS      |
                                      WINSTA_ENUMERATE         |
                                      WINSTA_EXITWINDOWS       |
                                      WINSTA_READATTRIBUTES    |
                                      WINSTA_READSCREEN        |
                                      WINSTA_WRITEATTRIBUTES);
        if (hwinsta == NULL)
    {
    return FALSE;
    }    if (!SetProcessWindowStation(hwinsta))
    {
    return FALSE;
    }
        hdesk = OpenDesktop("default", 0, FALSE,
                                DESKTOP_CREATEMENU |
    DESKTOP_CREATEWINDOW |
                                DESKTOP_ENUMERATE    |
                                DESKTOP_HOOKCONTROL  |
                                DESKTOP_JOURNALPLAYBACK |
                                DESKTOP_JOURNALRECORD |
                                DESKTOP_READOBJECTS |
                                DESKTOP_SWITCHDESKTOP |
                                DESKTOP_WRITEOBJECTS);
    if (hdesk == NULL)
    {
               return FALSE;
    } SetThreadDesktop(hdesk);    // 创建一个窗口
        CreateTrayIconWindows()  ;


    if (!SetProcessWindowStation(hwinstaCurrent))
    {
    return FALSE;
    }
    if (!SetThreadDesktop(hdeskCurrent))
    {
    return FALSE;
    }
    if (!CloseWindowStation(hwinsta))
    {
    return FALSE;
    }
    if (!CloseDesktop(hdesk))
    {
             return FALSE;
    }  return true;
    }在NT SERVICE的的主线程中
    {
    ...// 创建任务栏图标的接收窗口
        AddTrayIconWindows();
    while (1)
        {
    MSG msg;
    BOOL bRet;
    if ( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

    if (bRet == -1)
    {
    // handle the error and possibly exit
    }
    else
    {
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }
    }
    Sleep(100); if ( !g_isRunning )
            {
                break;
            }
        }
    ...
    }