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

Discussion in 'WASM.BEGINNERS' started by glukker, Jul 19, 2008.

  1. glukker

    glukker New Member

    Blog Posts:
    0
    Joined:
    Feb 14, 2008
    Messages:
    72
    Привет всем...
    Запутался в такой ситуауии...
    Программа, вначале регистрирует свой класс окна, создаёт окно ну и дальше, как обычно, имеет свою функцию обработки сообщений... У окна есть кнопка при нажатии на которую вызывается функция в которой создаётся новый класс окна, новое окно с кнопкой и процедура обработки сообщений тоже новая.
    Вопрос как сделать так, чтобы пользователю было запрещено при вызове второго окна переключиться на первое, предварительно не закрыв его или не нажав кнопку (диалог использовать нельзя).
    Code (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

    Blog Posts:
    0
    Joined:
    Aug 8, 2007
    Messages:
    2,824
    модальное окно?
     
  3. DEEP

    DEEP Андрей

    Blog Posts:
    0
    Joined:
    Apr 27, 2008
    Messages:
    491
    Location:
    г. Владимир
    Ага, я тоже с этим сталкивался. Изучил как это делается в диалогах. В итоге пришёл к выводу, что нужно в WM_CREATE нового окна выполнять EnableWindow(FALSE) по хендлу своего родителя. А при WM_CLOSE - тем же макаром разблокировать.
     
  4. glukker

    glukker New Member

    Blog Posts:
    0
    Joined:
    Feb 14, 2008
    Messages:
    72
    Ага правильно так и сделал в обработчике нажатия кнопки в главном окне сделал так:
    Code (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;
    А в функции обработчике не главного окна сделал так:
    Code (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:
    Code (Text):
    1.         case WM_CLOSE:
    2.             EnableWindow (hMain_1, TRUE);
    3.             DestroyWindow (hMain_2);
    Вроде всё верно сделал, так?
     
  5. glukker

    glukker New Member

    Blog Posts:
    0
    Joined:
    Feb 14, 2008
    Messages:
    72
    Ещё подскажите пожалуйста как второе окно разместить всегда по центру первого?
     
  6. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    Для птичьих языков програмирования есть специальный раздел, а для НАЧИНАЮЩИХ писать на птичьих языках - специальные сайты
     
  7. Vilco

    Vilco Vitaly

    Blog Posts:
    0
    Joined:
    Mar 5, 2007
    Messages:
    190
    Location:
    Nsk, Russia
    GetWindowRect
    Дальше там посчитаешь сам (составляешь 2 уравнения и считаешь новые координаты и указываешь их при создании окна, или двигаешь с помощью SetWindowPos)
     
  8. glukker

    glukker New Member

    Blog Posts:
    0
    Joined:
    Feb 14, 2008
    Messages:
    72
    Vilco
    сделал так...
    Code (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

    Blog Posts:
    0
    Joined:
    May 6, 2007
    Messages:
    28
    GetSystemMetrics() - все узнать: размеры рамки, заголовка и т.д.
     
  10. Vilco

    Vilco Vitaly

    Blog Posts:
    0
    Joined:
    Mar 5, 2007
    Messages:
    190
    Location:
    Nsk, Russia
    GetClientRect
    GetSystemMetrics на худой конец
    msdn читай