我在使用win32编成,我现在自己注册了一个窗口类,并且自己定义了一个窗口过程,然后再创建窗口的时候,指定为子窗口,然后父窗口是 windows默认注册的那个,现在我的问题是,程序运行后我单击子窗口,或者父窗口的时候,这些响应消息都不发送了,因为我在子窗口和父窗口的WM_LBUTTONDWON,中写了输出文本框,但是都没有收到,这是怎么回事儿呢。

解决方案 »

  1.   

    好的,下面是我的主要代码:两个窗口类的注册:
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSSCREEN));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_BASICPRACAPP);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_WINDOWSSCREEN)); return RegisterClassEx(&wcex);
    }ATOM RegisterClassChild(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wcex.lpfnWndProc = WndChildProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSSCREEN));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_BASICPRACAPP);
    wcex.lpszClassName = szWindowClassChild;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_WINDOWSSCREEN)); return RegisterClassEx(&wcex);
    }BOOL InitInstanceChild(HINSTANCE hInstance, HWND hwndParent, int nCmdShow)
    {
    HWND hWndChild;
    hWndChild = CreateWindowEx(WS_EX_CLIENTEDGE, szWindowClassChild,
    TEXT("ChildWindows"),WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
    200, 100, 200, 100, hwndParent, HMENU(1000), hInstance, NULL); if (!hWndChild)
    {
    ErrorExit(TEXT("GetProcessId")); }
    ::hWndChild = hWndChild;
    //ShowWindow(hWndChild,nCmdShow);
    //UpdateWindow(hWndChild);
    return TRUE;
    }
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;   hInst = hInstance; // Store instance handle in our global variable   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);   if (!hWnd)
       {
          return FALSE;
       }
       DragAcceptFiles(hWnd,TRUE);
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);   InitInstanceChild(hInstance,hWnd,nCmdShow);
       return TRUE;
    }//主窗口类的窗口过程
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HWND hwndBtnColr;
    static HWND hwndBtnFont;
    static HWND hwndBtnText;
    static int cxChar,cyChar;
    static int cxPos = 10,cyPos = 10;
    static int iRed = 0,iGreen = 50,iBlue = 100;
    static CHOOSECOLOR cc;
    static COLORREF crCustColors[16];
    static COLORREF crTextRef = RGB(0x80,0x80,0x80);
    static CHOOSEFONT cf;
    static LOGFONT lf;
    static bool bFlag = false;
    RECT rt;
    static HCURSOR hOldCursor;
    static HWND hWndToolBar; switch (message)
    {
    case WM_CREATE:
    cxChar = LOWORD(GetDialogBaseUnits());
    cyChar = HIWORD(GetDialogBaseUnits());// hWndToolBar = CreateSimpleToolbar(hWnd);
    break;
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    { case IDM_NEW:
    MessageBox(hWnd,TEXT("aaa"),TEXT("bbbbb"),0);
    break;
    case IDM_CHGCOLOR: cc.lStructSize = sizeof(CHOOSECOLOR);
    cc.hwndOwner = hWnd;
    cc.hInstance = NULL;
    cc.rgbResult = crTextRef;
    cc.lpCustColors = crCustColors;
    cc.Flags = CC_RGBINIT | CC_FULLOPEN;
    cc.lCustData = 0;
    cc.lpfnHook = NULL;
    cc.lpTemplateName = NULL;
    ChooseColor(&cc);
    crTextRef = cc.rgbResult;
    InvalidateRect(hWnd,NULL,TRUE);
    break;
    case IDM_CHGFRONT:
    cf.lStructSize = sizeof(CHOOSEFONT);
    cf.hwndOwner = hWnd;
    cf.hDC = NULL;
    cf.lpLogFont = &lf;
    cf.iPointSize = 0;
    cf.Flags = CF_INITTOLOGFONTSTRUCT |
      CF_SCREENFONTS | CF_EFFECTS;
    cf.rgbColors = 0;
    cf.lCustData = 0;
    cf.lpfnHook = NULL;
    cf.lpTemplateName = NULL;
    cf.hInstance = NULL;
    cf.lpszStyle = NULL;
    cf.nFontType = 0;
    cf.nSizeMin = 0;
    cf.nSizeMax = 0;
    ChooseFont(&cf);
    //cxChar = cf.lpLogFont->lfWidth;
    //cyChar = cf.lpLogFont->lfHeight;
    InvalidateRect(hWnd,NULL,TRUE);

    break;
    case IDM_CHGTEXT:
    hDlgModeless = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG),
    hWnd,DlgProc);
    SetFocus(hDlgModeless);
    break;
    case ID_FILE_OPEN:
    hDlgModeless = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG),
    hWnd,DlgProc);
    break;
    case ID_FILE_CLOSEDIALOG:
    SendMessage(hDlgModeless,SWM_EXIT,0,0);
    break;
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    }
    return 0;
    case WM_LBUTTONDOWN:
    MessageBox(NULL,TEXT("Parent Wind lbuttondown"),TEXT("Parent Wind lbuttondown"),0);
    if (( LOWORD(lParam) >= cxPos &&
    LOWORD(lParam) <= (cxPos + cxChar * sizeof(szTextOput))) &&
    (HIWORD(lParam) >= cyPos && HIWORD(lParam) <= (cyPos + cyChar) ))
    bFlag = true;
    break;
    case WM_LBUTTONUP:
    if (true == bFlag)
    {
    cxPos = LOWORD(lParam);
    cyPos = HIWORD(lParam);
    }
    bFlag = false;
    SetCursor(hOldCursor);
    InvalidateRect(hWnd,NULL,TRUE);
    break;
    case WM_MOUSEMOVE:
    if ((wParam & MK_LBUTTON) && bFlag)
    { hOldCursor = SetCursor(LoadCursor(NULL,IDC_CROSS));
    }
    return 0; case WM_KEYDOWN:
    switch(wParam)
    {
    case VK_ESCAPE:
    SendMessage(hWnd,WM_CLOSE,0,0);
    break;
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd,&ps);

    SetBkColor(hdc,0xffffff);
    SelectObject(hdc,CreateFontIndirect(&lf));
    SetTextColor(hdc, crTextRef);
    TextOut(hdc,cxPos,cyPos,szTextOput,MAX_LOADSTRING); EndPaint(hWnd,&ps);
    break;
    case WM_DROPFILES :
    //MessageBox(hWnd,TEXT("file drop"),TEXT("a file drop"),0);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_KILLFOCUS:
    MessageBox(NULL,TEXT("parent lost focus"),TEXT("parent lost focus"),0);
    break;
    case WM_SETFOCUS:
    MessageBox(NULL,TEXT("parent get focus"),TEXT("parent get focus"),0);
    SetFocus(hWndToolBar);
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    //子窗口类的过程LRESULT CALLBACK WndChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_CREATE:
    break;
    case WM_COMMAND:
    break;
    case WM_LBUTTONDOWN:
    MessageBox(NULL,TEXT("Child Wind lbuttondown"),TEXT("Child Wind lbuttondown"),0);
    break;
    case WM_LBUTTONUP:
    break;
    case WM_MOUSEMOVE:
    break;
    case WM_KEYDOWN:
    break;
    case WM_PAINT:
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_SETFOCUS:
    //SetFocus(GetParent(hWnd));
    MessageBox(NULL,TEXT("child get focus"),TEXT("child get focus"),0);
    break;
    case WM_KILLFOCUS:
    //SetFocus(GetParent(hWnd));
    MessageBox(NULL,TEXT("child lost focus"),TEXT("child lost focus"),0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  2.   

    还有这个是main函数 
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);  // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable; // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_BASICPRACAPP, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    if (!RegisterClassChild(hInstance))
    {
    MessageBox(NULL,TEXT("ChildClass Register faild"),TEXT("ChildClass Register faild"),0);
    }
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BASICPRACAPP)); // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless,&msg))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    } } return (int) msg.wParam;
    }
      

  3.   

    少用‘MessageBox’它会改变焦点。
    用OutputDebugString(“xxx”)来代替。hWndChild = CreateWindowEx(WS_EX_CLIENTEDGE, szWindowClassChild,
    TEXT("ChildWindows"),WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
    200, 100, 200, 100, hwndParent, HMENU(1000), hInstance, NULL);成功没有?