不同的窗口,使用同一个窗口过程,这应该在runtime时是多个不同的线程吧!?
我有点思维混乱。
这个从代码段的角度应该是相同的吧!?只是因为函数指针指向导致。但在runtime时形成不同的线程,不同的窗口应该不会互相干涉混乱。我这个理解可对?

解决方案 »

  1.   

    “不同的窗口,使用同一个窗口过程”
    “不同的窗口“, 即不同的 m_hWnd !
      

  2.   


    之所以有这个问题,就是因为我实在没法解决edit控件的不响应问题,想要自己做一个edit控件。但因为程序中会有很多使用它的地方,所以担心会存在自定义edit控件的窗口过程混乱干扰问题。
      

  3.   

    例子:// 同类多窗口.cpp : Defines the entry point for the console application.
    //
    #include <windows.h>
    // 隐藏控制台窗口
    #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #define WM_SETIMAGE   WM_APP+1HINSTANCE hInstance;
    HWND hwndT0=0,hwndT1=0,hwndT2=0,hwndT3=-0;
    HBITMAP hbmpT0=0,hbmpT1=0,hbmpT2=0,hbmpT3=0;
    int g_WinNum=0;
    //
    LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        HDC hmemDC;
    HBITMAP hbmpOld;
    HDC hdc;
      RECT rc;
    HBITMAP hbmpTmp;
    int nWindth;
    int nHeight;
    POINT pt;
    char *fileName;
    char  txt[10]; PAINTSTRUCT ps;
    switch(uMsg)
    {
    case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps);
    //
    GetClientRect(hwnd, &rc);
    nWindth=rc.right-rc.left;
    nHeight=rc.bottom-rc.top;
    hmemDC=CreateCompatibleDC(hdc);
    //
    SetBkMode(hdc,TRANSPARENT);
    if(hwnd==hwndT0)
    {
    if(hbmpT0) 
    {
    hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT0);
    strcpy(txt,"Test0");
    }
    }
    else if(hwnd==hwndT1)
    {
    if(hbmpT1) 
    {
    hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT1);
    strcpy(txt,"Test1");
    }
    }
    else if(hwnd==hwndT2)
    {
    if(hbmpT2) 
    {
    hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT2);
    strcpy(txt,"Test2");
    }
    }
    else if(hwnd==hwndT3)
    {
    if(hbmpT3) 
    {
    hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT3);
    strcpy(txt,"Test3");
    }
    }
    // draw 
    SetStretchBltMode(hdc,HALFTONE);
    StretchBlt(hdc,0,0,nWindth,nHeight,hmemDC,0,0,200,200,SRCCOPY);
    // text
    TextOut(hdc,0,0,txt,strlen(txt));
    // free
    SelectObject(hmemDC,hbmpOld);
    EndPaint (hwnd, &ps);
            return 0;
    case WM_SETIMAGE:
    fileName=(char *)lParam;
    hbmpTmp=(HBITMAP)::LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,
    LR_LOADFROMFILE | LR_CREATEDIBSECTION );
    if(hwnd==hwndT0)
    {
    hbmpT0=hbmpTmp;
    }
    else if(hwnd==hwndT1)
    {
    hbmpT1=hbmpTmp;
    }
    else if(hwnd==hwndT2)
    {
    hbmpT2=hbmpTmp;
    }
    else if(hwnd==hwndT3)
    {
    hbmpT3=hbmpTmp;
    }
    return 0;
    case WM_SETCURSOR:
    GetClientRect(hwnd, &rc);
    GetCursorPos(&pt); 
    ScreenToClient(hwnd,&pt);
    if(PtInRect(&rc,pt))
    {
    lParam=HTCLIENT;// arrow
    }
    break;
    case WM_DESTROY:
    g_WinNum--;
    if (g_WinNum==0) PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc( hwnd, uMsg, wParam, lParam);
    }
    //
    void initRegister()
    {
    hInstance = GetModuleHandle(NULL);
    WNDCLASS wndc;
    wndc.cbClsExtra = 0;
    wndc.cbWndExtra = 0;
    wndc.hCursor = LoadCursor(hInstance, IDC_ARROW);
    wndc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wndc.lpszMenuName = NULL;
    wndc.style = CS_HREDRAW | CS_VREDRAW;
    wndc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wndc.lpfnWndProc = WindowProc;
    wndc.lpszClassName = "classname";
    wndc.hInstance = hInstance;
    //
    RegisterClass(&wndc);
    }
    //
    HWND createWidget(char *name, int x, int y, int width, int height)
    {
    HWND hWnd=0;
    hWnd = CreateWindow("classname", name,    
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,    
    x,  y, width, height,  
    NULL,                   
    NULL,               // (HMENU) (int) (ID_FIRSTCHILD + i), =100....  
    hInstance,   
    NULL);    
    // 
    g_WinNum++;
    //
    return hWnd;
    }
    //
    void SetWndImage(HWND hWnd,char *fileName)//这个只是通知显示图片
    {
    SendMessage(hWnd,WM_SETIMAGE,0,(LPARAM)fileName);
    }
    //
    #define ScreenX 240
    #define ScreenY 100
    void main()
    {// 
    initRegister();
    hwndT0=createWidget("test0",ScreenX,ScreenY,300,300);
    SetWndImage(hwndT0, "a.bmp");
    hwndT1=createWidget("test1",ScreenX+300,ScreenY,300,300);
    SetWndImage(hwndT1, "b.bmp");
    // row 2
    hwndT2=createWidget("test2",ScreenX,ScreenY+300,300,300);
    SetWndImage(hwndT2, "c.bmp");
    hwndT3=createWidget("test3",ScreenX+300,ScreenY+300,300,300);
    SetWndImage(hwndT3, "d.bmp");
    //
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
      

  4.   

    "自定义edit控件的窗口过程"一个实例,一个窗口,一个窗口一个窗口过程。
    不属于多个窗口 ,一个窗口过程。
    参考上面的例子 !
      

  5.   

    所谓窗口过程就是一个回调函数,被框架层调用。 你也可以自己写底层,底层调用窗口过程。至于线程与是否互相影响,就看你在这同一个回调函数的函数体里, 是不是写了与两个窗口共享变量的代码。一般来说,他们都是UI线程里的,
    UI一般都在主线程,就是在一个线程。除非你自己把他运行在多个线程里。
      

  6.   

    #3代码77、78行之间应添加一行DeleteDC(hmemDC);
    另外在退出窗口或窗口消息结束后应对hbmpT0~3调用DeleteObject虎头蛇尾是俗人的习惯,
    有始有终是君子的操守。
      

  7.   

    窗口过程 只是个callback,你可以在窗口过程里得到线程id和主线程等线程id 对比下,就知道运行的架构,顺序