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

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

  1. glukker

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Привет всем...
    Запутался в такой ситуауии...
    Программа, вначале регистрирует свой класс окна, создаёт окно ну и дальше, как обычно, имеет свою функцию обработки сообщений... У окна есть кнопка при нажатии на которую вызывается функция в которой создаётся новый класс окна, новое окно с кнопкой и процедура обработки сообщений тоже новая.
    Вопрос как сделать так, чтобы пользователю было запрещено при вызове второго окна переключиться на первое, предварительно не закрыв его или не нажав кнопку (диалог использовать нельзя).
    Код (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
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    модальное окно?
     
  3. DEEP

    DEEP Андрей

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

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Ага правильно так и сделал в обработчике нажатия кнопки в главном окне сделал так:
    Код (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
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    Ещё подскажите пожалуйста как второе окно разместить всегда по центру первого?
     
  6. driver

    driver New Member

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

    Vilco Vitaly

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

    glukker New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2008
    Сообщения:
    72
    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
    Регистрация:
    6 май 2007
    Сообщения:
    28
    GetSystemMetrics() - все узнать: размеры рамки, заголовка и т.д.
     
  10. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    GetClientRect
    GetSystemMetrics на худой конец
    msdn читай