Запрет переключения между окнами...

Тема в разделе "WASM.BEGINNERS", создана пользователем glukker, 19 июл 2008.

  1. glukker

    glukker New Member

    Публикаций:
    0
    Привет всем...
    Запутался в такой ситуауии...
    Программа, вначале регистрирует свой класс окна, создаёт окно ну и дальше, как обычно, имеет свою функцию обработки сообщений... У окна есть кнопка при нажатии на которую вызывается функция в которой создаётся новый класс окна, новое окно с кнопкой и процедура обработки сообщений тоже новая.
    Вопрос как сделать так, чтобы пользователю было запрещено при вызове второго окна переключиться на первое, предварительно не закрыв его или не нажав кнопку (диалог использовать нельзя).
    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3.  
    4. LRESULT CALLBACK WindowFunc_1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    5. LRESULT CALLBACK WindowFunc_2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    6.  
    7. char szWinName_1[] = "MyApp_1";
    8. char szWinName_2[] = "MyApp_2";
    9.  
    10. HWND hMain_1,
    11.      hButton_1,
    12.      hMain_2,
    13.      hButton_2;
    14.  
    15. VOID MyFunc ()
    16. {
    17.     MSG Msg;
    18.     WNDCLASSEX wc = {0};
    19.  
    20.     wc.hInstance = GetModuleHandle (NULL);
    21.     wc.lpszClassName = szWinName_2;
    22.     wc.lpfnWndProc = WindowFunc_2;
    23.     wc.style = CS_SAVEBITS | CS_DBLCLKS;
    24.     wc.cbSize = sizeof(WNDCLASSEX);
    25.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    26.     wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    27.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    28.     wc.lpszMenuName = NULL;
    29.     wc.cbClsExtra = 0;
    30.     wc.cbWndExtra = 0;
    31.     wc.hbrBackground = GetSysColorBrush (COLOR_3DFACE);
    32.  
    33.     RegisterClassEx(&wc);
    34.  
    35.     hMain_2 = CreateWindowEx (WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT,
    36.                              szWinName_2,
    37.                              "Не главное окно",
    38.                              WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_SYSMENU | DS_3DLOOK | DS_SETFONT | DS_MODALFRAME,
    39.                              350,
    40.                              350,
    41.                              400,
    42.                              400,
    43.                              hMain_1,
    44.                              NULL,
    45.                              GetModuleHandle (NULL),
    46.                              NULL);
    47.  
    48.     ShowWindow (hMain_2, SW_SHOW), UpdateWindow (hMain_2);
    49.  
    50.     hButton_2 = CreateWindow ("BUTTON",
    51.                             "OK",
    52.                             WS_VISIBLE|WS_CHILD,
    53.                             150,
    54.                             150,
    55.                             90,
    56.                             30,
    57.                             hMain_2,
    58.                             NULL,
    59.                             GetModuleHandle (NULL),
    60.                             NULL);
    61.    
    62.     ShowWindow(hButton_2,SW_SHOW), UpdateWindow(hButton_2);
    63.  
    64.     while(GetMessage(&Msg, NULL,0,0))
    65.     {
    66.         TranslateMessage(&Msg);
    67.         DispatchMessage(&Msg);
    68.     }
    69.  
    70.     UnregisterClass (szWinName_2, GetModuleHandle (NULL));
    71. }
    72.  
    73. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
    74. {
    75.     MSG Msg;
    76.     WNDCLASSEX wc = {0};
    77.  
    78.     wc.hInstance = GetModuleHandle (NULL);
    79.     wc.lpszClassName = szWinName_1;
    80.     wc.lpfnWndProc = WindowFunc_1;
    81.     wc.style = CS_SAVEBITS | CS_DBLCLKS;
    82.     wc.cbSize = sizeof(WNDCLASSEX);
    83.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    84.     wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    85.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    86.     wc.lpszMenuName = NULL;
    87.     wc.cbClsExtra = 0;
    88.     wc.cbWndExtra = 0;
    89.     wc.hbrBackground = GetSysColorBrush (COLOR_3DFACE);
    90.  
    91.     RegisterClassEx(&wc);
    92.  
    93.     hMain_1 = CreateWindowEx (WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT,
    94.                              szWinName_1,
    95.                              "Главное окно",
    96.                              WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_SYSMENU | DS_3DLOOK | DS_SETFONT | DS_MODALFRAME,
    97.                              300,
    98.                              300,
    99.                              400,
    100.                              400,
    101.                              HWND_DESKTOP,
    102.                              NULL,
    103.                              GetModuleHandle (NULL),
    104.                              NULL);
    105.  
    106.     ShowWindow (hMain_1, SW_SHOW), UpdateWindow (hMain_1);
    107.  
    108.     hButton_1 = CreateWindow ("BUTTON",
    109.                             "OK",
    110.                             WS_VISIBLE|WS_CHILD,
    111.                             150,
    112.                             150,
    113.                             90,
    114.                             30,
    115.                             hMain_1,
    116.                             NULL,
    117.                             GetModuleHandle (NULL),
    118.                             NULL);
    119.    
    120.     ShowWindow(hButton_1,SW_SHOW), UpdateWindow(hButton_1);
    121.  
    122.     while(GetMessage(&Msg, NULL,0,0))
    123.     {
    124.         TranslateMessage(&Msg);
    125.         DispatchMessage(&Msg);
    126.     }
    127.  
    128.     UnregisterClass (szWinName_1, GetModuleHandle (NULL));
    129. }
    130.  
    131. LRESULT CALLBACK WindowFunc_1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    132. {
    133.     PAINTSTRUCT ps;
    134.     static HDC  hdc;
    135.  
    136.     switch(message)
    137.     {
    138.         case WM_PAINT:
    139.             {
    140.                 hdc = BeginPaint(hwnd, &ps);
    141.            
    142.                 EndPaint(hwnd, &ps);
    143.             } break;
    144.  
    145.         case WM_COMMAND:
    146.             switch (LOWORD(wParam))
    147.             {
    148.             case BN_CLICKED:
    149.                 if (hButton_1 == (HWND)lParam)
    150.                 {
    151.                     MyFunc ();
    152.                     MessageBox (0, "1", "1", 0);
    153.                 }
    154.             } break;
    155.  
    156.         case WM_DESTROY:
    157.             PostQuitMessage(0);
    158.             break;
    159.         default:
    160.                 return DefWindowProc(hwnd, message, wParam, lParam);
    161.     }
    162.         return 0;
    163. }
    164.  
    165. LRESULT CALLBACK WindowFunc_2(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    166. {
    167.     PAINTSTRUCT ps;
    168.     static HDC  hdc;
    169.  
    170.     switch(message)
    171.     {
    172.         case WM_PAINT:
    173.             {
    174.                 hdc = BeginPaint(hwnd, &ps);
    175.            
    176.                 EndPaint(hwnd, &ps);
    177.             } break;
    178.  
    179.         case WM_COMMAND:
    180.             switch (LOWORD(wParam))
    181.             {
    182.             case BN_CLICKED:
    183.                 if (hButton_2 == (HWND)lParam)
    184.                     MessageBox (0, "2", "2", 0);
    185.             } break;
    186.  
    187.         case WM_DESTROY:
    188.             PostQuitMessage(0);
    189.             break;
    190.         default:
    191.                 return DefWindowProc(hwnd, message, wParam, lParam);
    192.     }
    193.         return 0;
    194. }
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    модальное окно?
     
  3. DEEP

    DEEP Андрей

    Публикаций:
    0
    Ага, я тоже с этим сталкивался. Изучил как это делается в диалогах. В итоге пришёл к выводу, что нужно в WM_CREATE нового окна выполнять EnableWindow(FALSE) по хендлу своего родителя. А при WM_CLOSE - тем же макаром разблокировать.
     
  4. glukker

    glukker New Member

    Публикаций:
    0
    Ага правильно так и сделал в обработчике нажатия кнопки в главном окне сделал так:
    Код (Text):
    1.         case WM_COMMAND:
    2.             switch (LOWORD(wParam))
    3.             {
    4.             case BN_CLICKED:
    5.                 if (hButton_1 == (HWND)lParam)
    6.                 {
    7.                     EnableWindow (hMain_1, FALSE);
    8.                     MyFunc ();
    9.                 }
    10.             } break;
    А в функции обработчике не главного окна сделал так:
    Код (Text):
    1.         case WM_COMMAND:
    2.             switch (LOWORD(wParam))
    3.             {
    4.             case BN_CLICKED:
    5.                 if (hButton_2 == (HWND)lParam)
    6.                     EnableWindow (hMain_1, TRUE);
    7.                     DestroyWindow (hMain_2);
    8.  
    9.             } break;
    Переключения не происходит и при надатии на кнопку окно закрывается и делает активным главное...
    То же самое написал и для обработчика сообщения WM_CLOSE:
    Код (Text):
    1.         case WM_CLOSE:
    2.             EnableWindow (hMain_1, TRUE);
    3.             DestroyWindow (hMain_2);
    Вроде всё верно сделал, так?
     
  5. glukker

    glukker New Member

    Публикаций:
    0
    Ещё подскажите пожалуйста как второе окно разместить всегда по центру первого?
     
  6. driver

    driver New Member

    Публикаций:
    0
    Для птичьих языков програмирования есть специальный раздел, а для НАЧИНАЮЩИХ писать на птичьих языках - специальные сайты
     
  7. Vilco

    Vilco Vitaly

    Публикаций:
    0
    GetWindowRect
    Дальше там посчитаешь сам (составляешь 2 уравнения и считаешь новые координаты и указываешь их при создании окна, или двигаешь с помощью SetWindowPos)
     
  8. glukker

    glukker New Member

    Публикаций:
    0
    Vilco
    сделал так...
    Код (Text):
    1. int iWinX1 = 600, iWinY1 = 600; // для главного окна
    2. int iWinX2 = 300, iWinY2 = 300; // для дочернего окна
    3.  
    4. // для главного окна
    5.  
    6.     hMain = CreateWindowEx (WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT,
    7.                            szMainClass,
    8.                            "BMP Counter 8.0",
    9.                            WS_CAPTION | WS_VISIBLE | WS_SYSMENU,
    10.                            GetSystemMetrics (SM_CXSCREEN)/2-iWinX/2,
    11.                            GetSystemMetrics (SM_CYSCREEN)/2-iWinY/2,
    12.                            iWinX,
    13.                                   iWinY,
    14.                            HWND_DESKTOP,
    15.                            NULL,
    16.                            hThisInst,
    17.                            NULL);
    18.  
    19. // а для дочернего окна делаю так
    20.  
    21. POINT point;
    22.  
    23. point.x = iWinX/2 - iWinX2/2;
    24. point.y = iWinY/2 - iWinY2/2;
    25.  
    26. ClientToScreen (hMain, &point);
    27.  
    28. // создание дочернего окна
    29.  
    30. CreateWindowEx (WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT,
    31.                              szAboutClass,
    32.                              "Дочернее окно",
    33.                              WS_CAPTION | WS_POPUP | WS_VISIBLE | WS_SYSMENU | DS_MODALFRAME,                          
    34.                              point.x,
    35.                              point.y,
    36.                              iWinX2,
    37.                              iWinY2,
    38.                              hMain,
    39.                              NULL,
    40.                              GetModuleHandle (NULL),
    41.                              NULL);
    Проблема в том что неправильно выравнивает по вертикали, так как ширина окна без учёта меню и заголовка...
    Тогда как же программно узнать полные размеры окна?
     
  9. ADim

    ADim New Member

    Публикаций:
    0
    GetSystemMetrics() - все узнать: размеры рамки, заголовка и т.д.
     
  10. Vilco

    Vilco Vitaly

    Публикаций:
    0
    GetClientRect
    GetSystemMetrics на худой конец
    msdn читай