CreateWindowEx и модальное окно

Тема в разделе "WASM.WIN32", создана пользователем Rustem, 17 фев 2007.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Столкнулся с проблемой.
    Есть прога. В ней сперва создается из ресурсов диалоговое окно.
    Потом при нажатии определенной кнопки создаю окно (стиль WS_OVERLAPPEDWINDOW).

    Нужно чтобы было модальным. Как сделать?

    Через DialogBox неохота.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    hWndParent в CreateWindowEx не помогает чтоли?

    только кода дофига, через диалоговый шаблон всяко проще
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Astrix
    Нет не помогло. Можно переключаться между окнами, а это нежелательно
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    используй EnableWindow для главного окна

    приблизительно так
    Код (Text):
    1.   invoke EnableWindow, hMain,0
    2.   INVOKE CreateWindowEx,WS_EX_TOOLWINDOW or WS_EX_TOPMOST,ADDR ClassNameAbout,NULL,\
    3.                                 WS_POPUP,CW_USEDEFAULT,\
    4.                                 CW_USEDEFAULT,260,180,hMain,NULL,\
    5.                                 hInst,NULL
    6.   mov   hwnd,eax
    7.   invoke ShowWindow, hwnd,SW_SHOWNORMAL
    8.   invoke UpdateWindow, hwnd
    9.   .WHILE TRUE
    10.       invoke GetMessage, ADDR msg, NULL,0,0
    11.       .BREAK .IF (!eax)
    12.         invoke TranslateMessage, ADDR msg
    13.         invoke DispatchMessage, ADDR msg
    14.   .ENDW
    15.   invoke EnableWindow, hMain,1
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    WS_EX_TOPMOST, imho, не в тему.
     
  6. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Astrix
    Спасибо. Это работает...

    P.S. Как все просто оказалось :)
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ну не совсем все так как через DialogBoxParam, например главное окно после
    invoke EnableWindow, hMain,1 проваливается вниз, это тоже надо бы пофиксить,
    думаю здесь решений может быть несколько
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Код (Text):
    1. #define NEW_MAX_THREAD_SWITCHES     1000
    2.  
    3. #ifdef SPI_GETFOREGROUNDLOCKTIMEOUT
    4. #define _BRINGWINDOW_SPI_GETFOREGROUNDLOCKTIMEOUT       SPI_GETFOREGROUNDLOCKTIMEOUT
    5. #else
    6. #define _BRINGWINDOW_SPI_GETFOREGROUNDLOCKTIMEOUT       0x2000
    7. #endif
    8.  
    9. #ifdef SPI_SETFOREGROUNDLOCKTIMEOUT
    10. #define _BRINGWINDOW_SPI_SETFOREGROUNDLOCKTIMEOUT       SPI_SETFOREGROUNDLOCKTIMEOUT
    11. #else
    12. #define _BRINGWINDOW_SPI_SETFOREGROUNDLOCKTIMEOUT       0x2001
    13. #endif
    14.  
    15. BOOL NewBringWindowToFront(HWND hWnd)
    16. {
    17.     DWORD dwTimeout= 0;
    18.     HWND hWindow= NULL;
    19.     DWORD dwTheadID;
    20.     DWORD dwCurrentTheadID;
    21.     HWND hCurWnd;
    22.     unsigned int i;
    23.  
    24.     // Add a critical section,  if needed
    25.  
    26.     hWindow= hWnd;
    27.  
    28.     if(hWindow)
    29.         if(!IsWindow(hWindow))
    30.             hWindow= NULL;
    31.  
    32.     if(hWindow)
    33.         if((GetWindowLong(hWindow, GWL_STYLE) & WS_CHILD) && (GetParent(hWindow)))
    34.             hWindow= NULL;
    35.  
    36.     if(hWindow)
    37.         if(!SystemParametersInfo(_BRINGWINDOW_GETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0))
    38.             dwTimeout= 0;
    39.  
    40.    
    41.     dwTheadID= GetCurrentThreadId();
    42.  
    43.     for(i= 0; hCurWnd= GetForegroundWindow(), (hWindow?hCurWnd!=hWindow:true); i++)
    44.     {
    45.         dwCurrentTheadID= GetWindowThreadProcessId(hCurWnd, 0);
    46.  
    47.         if(dwCurrentTheadID==dwTheadID && !hWindow)
    48.             break;
    49.  
    50.         AttachThreadInput(dwTheadID, dwCurrentTheadID, TRUE);
    51.  
    52.         if(hWindow)
    53.             SetForegroundWindow(hWindow);
    54.  
    55.         AttachThreadInput(dwTheadID, dwCurrentTheadID, FALSE);
    56.  
    57.         SwitchToThread();
    58.         // Sleep(20);
    59.  
    60.         if(i>NEW_MAX_THREAD_SWITCHES)
    61.             break;
    62.     }
    63.  
    64.  
    65.     if(hWindow)
    66.     {
    67.         if(dwTimeout)
    68.             if(!SystemParametersInfo(_BRINGWINDOW_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0))
    69.                 dwTimeout= 0;
    70.    
    71.         SetWindowPos(hWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    72.    
    73.         if(dwTimeout)
    74.             SystemParametersInfo(_BRINGWINDOW_SETFOREGROUNDLOCKTIMEOUT, 0, &dwTimeout, 0);
    75.     }
    76.  
    77.     return i>NEW_MAX_THREAD_SWITCHES?FALSE:TRUE;
    78. }
     
  9. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Astrix
    Да после выхода родительское сворачивается.
    Я просто после EnableWindow hParent, TRUE добавил SetFocus hParent