// Frame_window - окно рамки.
VOID Diver_CheckWindowControls( HWND Frame_window )
{
 // Узнаем очередь сообщений окна.
 HMQ Message_queue = WinQueryWindowULong( Frame_window, QWL_HMQ );

 {
  // Перебираем окна в окне рабочего стола.
  HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE;
  while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE )
   {
    // Если окно скрыто - продолжаем перебор окон.
    if( !WinIsWindowVisible( Window ) ) continue;

    // Если это не окно рамки - продолжаем перебор окон.
    if( !IsFrameWindow( Window ) ) continue;

    // Если это то же самое окно - продолжаем перебор окон.
    if( Window == Frame_window ) continue;

    // Узнаем очередь сообщений окна.
    HMQ Window_queue = WinQueryWindowULong( Window, QWL_HMQ );

    // Если окно использует ту же очередь сообщений - его надо проверить.
    if( Window_queue == Message_queue ) if( PermissionForDrawing( Window ) )
     Diver_QueryWindowProperty( Window, WT_SYSMENU | WT_MINMAX, CLOSE_ACTION );
   }
  WinEndEnumWindows( Enumeration );
 }

 // Возврат.
 return;
}
Ejemplo n.º 2
0
 static USHORT sizeButtonBar(HWND hwnd, short cx, USHORT btnCount, const USHORT *btnlist)
 {
    USHORT              pos;
    int                 ySize = 0;
    USHORT			    xSize;
    int                 f;
    USHORT				y     = 0;
    HWND                h;

    for(f=0;f < btnCount; f++)
    {
       icqskin_querySizes(CHILD_WINDOW(hwnd,btnlist[f]),0,&y);
       if(y > ySize)
          ySize = y;
    }

    pos = cx;

    for(f=0;f < btnCount; f++)
    {
       h = CHILD_WINDOW(hwnd,btnlist[f]);
       if(WinIsWindowVisible(h))
       {
          xSize  = (USHORT) icqskin_querySizes(h,0,0);
          pos   -= xSize;
          WinSetWindowPos(h, 0, pos, 0, xSize, ySize, SWP_SIZE|SWP_MOVE);
          pos   -= 4;
       }
    }

    return ySize;
 }
Ejemplo n.º 3
0
void keyset_dialog(HWND hwnd)
{
    if (WinIsWindowVisible(hwndKeyset))
        return;

    hwndKeyset = WinLoadStdDlg(hwnd, pm_keyset, DLG_KEYSET, NULL);
}
Ejemplo n.º 4
0
void calibrate_dialog(HWND hwnd)
{
    if (WinIsWindowVisible(hwndCalibrate))
        return;

    hwndCalibrate = WinLoadStdDlg(hwnd, pm_calibrate, DLG_CALIBRATE, NULL);
}
Ejemplo n.º 5
0
// For frame windows, 'Show' is equivalent to 'Show & Activate'
nsresult nsFrameWindow::Show( PRBool bState)
{
   if( mWnd)
   {
      ULONG ulFlags;
      if( bState) {
         ULONG ulStyle = WinQueryWindowULong( GetMainWindow(), QWL_STYLE);
         ulFlags = SWP_SHOW;
         /* Don't activate the window unless the parent is visible */
         if (WinIsWindowVisible(WinQueryWindow(GetMainWindow(), QW_PARENT)))
           ulFlags |= SWP_ACTIVATE;
         if (!( ulStyle & WS_VISIBLE)) {
            PRInt32 sizeMode;
            GetSizeMode( &sizeMode);
            if ( sizeMode == nsSizeMode_Maximized) {
               ulFlags |= SWP_MAXIMIZE;
            } else if ( sizeMode == nsSizeMode_Minimized) {
               ulFlags |= SWP_MINIMIZE;
            } else {
               ulFlags |= SWP_RESTORE;
            }
         }
         if( ulStyle & WS_MINIMIZED)
            ulFlags |= (SWP_RESTORE | SWP_MAXIMIZE);
      }
      else
         ulFlags = SWP_HIDE | SWP_DEACTIVATE;
      WinSetWindowPos( GetMainWindow(), NULLHANDLE, 0L, 0L, 0L, 0L, ulFlags);
      SetWindowListVisibility( bState);
   }

   return NS_OK;
}
BYTE Krnl_Environment_ShellIsFileBar( VOID )
{
 // FileBar может быть вызван после расширителя.
 if( Krnl_Environment.RTSettings.Shell_is_FileBar ) return 1;
 {
  // Перебираем окна в окне рабочего стола.
  HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE;
  while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE )
   {
    // Если окно скрыто - продолжаем перебор окон.
    if( !WinIsWindowVisible( Window ) ) continue;

    // Если это FileBar - считаем, что он используется в качестве оболочки.
    if( IsFileBarWindow( Window ) )
     {
      Krnl_Environment.RTSettings.Shell_is_FileBar = 1;
      break;
     }
   }
  WinEndEnumWindows( Enumeration );
 }

 // Возврат.
 return Krnl_Environment.RTSettings.Shell_is_FileBar;
}
Ejemplo n.º 7
0
void emulator_dialog(HWND hwnd)
{
    if (WinIsWindowVisible(hwndEmulator)) {
        return;
    }

    hwndEmulator = WinLoadStdDlg(hwnd, pm_emulator, DLG_EMULATOR, NULL);
}
Ejemplo n.º 8
0
void drive_dialog(HWND hwnd)
{
    if (WinIsWindowVisible(hwndDrive)) {
        return;
    }

    hwndDrive = WinLoadStdDlg(hwnd, pm_drive, DLG_DRIVE, NULL);
}
Ejemplo n.º 9
0
void datasette_dialog(HWND hwnd)
{

    if (WinIsWindowVisible(hwndDatasette))
        return;

    hwndDatasette = WinLoadStdDlg(hwnd, pm_datasette, DLG_DATASETTE, NULL);
}
Ejemplo n.º 10
0
void joystick_dialog(HWND hwnd)
{
    static HWND hwnd2 = NULLHANDLE;

    if (WinIsWindowVisible(hwnd2))
        return;

    hwnd2 = WinLoadStdDlg(hwnd, pm_joystick, DLG_JOYSTICK, NULL);
}
Ejemplo n.º 11
0
void color_dialog(HWND hwnd)
{
    static HWND hwnd2 = NULLHANDLE;

    if (WinIsWindowVisible(hwnd2)) {
        return;
    }

    hwnd2 = WinLoadStdDlg(hwnd, pm_color, DLG_COLOR, NULL);
}
Ejemplo n.º 12
0
void joystick_extra_dialog(HWND hwnd)
{
    static HWND hwnd3 = NULLHANDLE;

    if (WinIsWindowVisible(hwnd3)) {
        return;
    }

    hwnd3 = WinLoadStdDlg(hwnd, pm_extra_joystick, DLG_EXTRA_JOYSTICK, NULL);
}
Ejemplo n.º 13
0
void crt_dialog(HWND hwnd, const char *scanline_shade, const char *blur, const char *oddlines_phase, const char *oddlines_offset)
{
    static HWND hwnd3 = NULLHANDLE;

    if (WinIsWindowVisible(hwnd3)) {
        return;
    }

    scanline_shade_res = scanline_shade;
    blur_res = blur;
    oddlines_phase_res = oddlines_phase;
    oddlines_offset_res = oddlines_offset;

    hwnd3 = WinLoadStdDlg(hwnd, pm_crt, DLG_CRT, NULL);
}
Ejemplo n.º 14
0
/*
 *   Modified by Chris Wohlgemuth 2001 for use with CandyFolder
 */
BOOL winhAssertWarp4Notebook(HWND hwndDlg,
                    USHORT usIdThreshold,    // in: ID threshold
                    ULONG ulDownUnits)       // in: dialog units or 0
{
    BOOL brc = FALSE;
    POINTL ptl;
    HAB hab = WinQueryAnchorBlock(hwndDlg);
    BOOL    fIsVisible = WinIsWindowVisible(hwndDlg);
    if (ulDownUnits) {
        ptl.x = 0;
        ptl.y = ulDownUnits;
        WinMapDlgPoints(hwndDlg, &ptl, 1, TRUE);
    }

    WinEnableWindowUpdate(hwndDlg, FALSE);

    if (cwQueryOSRelease()>=40) {
        HENUM henum = WinBeginEnumWindows(hwndDlg);
        HWND hwndItem;
        while ((hwndItem = WinGetNextWindow(henum))!=NULLHANDLE) {
            USHORT usId = WinQueryWindowUShort(hwndItem, QWS_ID);

            if (usId <= usIdThreshold) {
                // pushbutton to change:
              WinSetWindowBits(hwndItem, QWL_STYLE,
                        BS_NOTEBOOKBUTTON, BS_NOTEBOOKBUTTON);
                brc = TRUE;
            } else
                // no pushbutton to change: move downwards
                // if desired
                if (ulDownUnits)
                {
                    SWP swp;

                    WinQueryWindowPos(hwndItem, &swp);
                    WinSetWindowPos(hwndItem, 0,
                        swp.x,
                        swp.y - ptl.y,
                        0, 0,
                        SWP_MOVE);
                }
        }
        WinEndEnumWindows(henum);
    }
    if (fIsVisible)
        WinShowWindow(hwndDlg, TRUE);
    return (brc);
}
Ejemplo n.º 15
0
void color_dialog(HWND hwnd, const char *gamma, const char *tint, const char *saturation, const char *contrast, const char *brightness)
{
    static HWND hwnd2 = NULLHANDLE;

    if (WinIsWindowVisible(hwnd2)) {
        return;
    }

    gamma_res = gamma;
    tint_res = tint;
    saturation_res = saturation;
    contrast_res = contrast;
    brightness_res = brightness;

    hwnd2 = WinLoadStdDlg(hwnd, pm_color, DLG_COLOR, NULL);
}
// Window - окно, Type - какую полоску надо найти, значение "SBS_*".
// Target_window_placement - расположение окна, для которого должна быть найдена полоска.
// Возвращаемое значение: окно полоски просмотра или NULLHANDLE.
HWND Scroller_FindScrollBar( HWND Window, BYTE Type, PSWP Target_window_placement = NULL )
{
 // Если расположение окна не указано - задаем пустые значения.
 HWND Desktop = QueryDesktopWindow();

 INT X_Screen = WinQuerySysValue( Desktop, SV_CXSCREEN );
 INT Y_Screen = WinQuerySysValue( Desktop, SV_CYSCREEN );

 SWP Default_placement = { 0, Y_Screen * 2, X_Screen * 2, Y_Screen * (-1), X_Screen * (-1), NULLHANDLE, NULLHANDLE, 0, 0 };
 if( Target_window_placement == NULL ) Target_window_placement = &Default_placement;

 // Изначально окно полоски неизвестно.
 HWND Scroll_bar = NULLHANDLE;

 {
  // Перебираем окна, пока не найдем полоску.
  HENUM Enumeration = WinBeginEnumWindows( Window ); HWND Current_window = NULLHANDLE; 
  while( ( Current_window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE )
   {
    // Если окно не скрыто:
    if( WinIsWindowVisible( Current_window ) )
     {
      // Если это полоска просмотра:
      if( IsScrollBarWindow( Current_window ) )
       {
        // Узнаем, как она расположена.
        SWP Rectangle = {0}; WinQueryWindowPos( Current_window, &Rectangle );

        // Если мы ищем как раз такую полоску - завершаем перебор окон.
        if( Type == SBS_VERT ) if( Rectangle.cy > Rectangle.cx )
         if( Rectangle.y + Rectangle.cy / 2 > Target_window_placement->y )
          if( Rectangle.y + Rectangle.cy / 2 < Target_window_placement->y + Target_window_placement->cy )
           { Scroll_bar = Current_window; break; }

        if( Type == SBS_HORZ ) if( Rectangle.cx > Rectangle.cy )
         if( Rectangle.x + Rectangle.cx / 2 > Target_window_placement->x )
          if( Rectangle.x + Rectangle.cx / 2 < Target_window_placement->x + Target_window_placement->cx )
           { Scroll_bar = Current_window; break; }
       }
     }
   }
  WinEndEnumWindows( Enumeration );
 }

 // Возвращаем указатель на полоску, если она была найдена, или NULLHANDLE.
 return Scroll_bar;
}
// Window - окно, которое надо проверить.
BYTE WindowTypes_WindowIsPresent( HWND Window )
{
 // Проверяем, есть ли вообще такое окно.
 if( Window == NULLHANDLE ) return 0;
 if( !WinIsWindow( WinQueryAnchorBlock( Window ), Window ) ) return 0;

 // Проверяем, видимо ли оно.
 if( !WinIsWindowVisible( Window ) ) return 0;

 // Узнаем размер окна.
 RECT Rectangle = {0}; WinQueryWindowRect( Window, &Rectangle );

 // Проверяем его.
 if( Rectangle.yTop <= 1 || Rectangle.xRight <= 1 ) return 0;

 // Возврат.
 return 1;
}
Ejemplo n.º 18
0
 static void resize(HWND hwnd, short cx, short cy)
 {
    USHORT    ySize;
    USHORT	  top;
    USHORT    fator;
    int       pos;
    HWND	  h;

    top = icqskin_resizeUserInfoBox(hwnd,cx,cy);

    /* Button bar */
    ySize = icqskin_resizeButtonBox(hwnd,cx,buttonBar);

    /* Text box */
    pos = ySize+2;
    WinSetWindowPos(CHILD_WINDOW(hwnd,MSGID_TEXTBOX), 0, 0, pos, cx, (top-pos)+2, SWP_SIZE|SWP_MOVE|SWP_SHOW);

    /* Edit area */
    pos += 6;
    top -= 10;

    h = CHILD_WINDOW(hwnd,MSGID_HISTORY);

    if(h && WinIsWindowVisible(h))
    {
       fator = (top-pos) / 3;

       if(fator < (ySize * 3))
          ySize = fator;
       else
          ySize *= 3;

       WinSetWindowPos(h, 0, 4, pos+ySize, cx-8, top-(pos+ySize), SWP_SIZE|SWP_MOVE|SWP_SHOW);
       top = (pos+ySize)-4;
    }

    WinSetWindowPos(CHILD_WINDOW(hwnd,MSGID_EDITBOX), 0, 4, pos, cx-8, top-pos, SWP_SIZE|SWP_MOVE|SWP_SHOW);
 }
Ejemplo n.º 19
0
ULONG CPlugin::makeNPNCall(NPAPI_Action action, ULONG dw1, ULONG dw2, ULONG dw3, 
                           ULONG dw4, ULONG dw5, ULONG dw6, ULONG dw7)
{
  ULONG dwRet = CPluginBase::makeNPNCall(action, dw1, dw2, dw3, dw4, dw5, dw6, dw7);

    // update GUI for Manual mode action
  if((getMode() == NP_EMBED) && (WinIsWindowVisible(m_hWndManual)))
  {
    switch (action)
    {
      case action_npn_new_stream:
      case action_npn_destroy_stream:
      case action_npn_mem_alloc:
      case action_npn_mem_free:
        updateUI(m_hWndManual);
        break;
      default:
        break;
    }
  }

  return dwRet;
}
// Возвращаемое значение: 1 - WPS, 0 - другая оболочка.
BYTE Krnl_Environment_ShellIsWPS( VOID )
{
 // Перебираем окна в окне рабочего стола.
 HENUM Enumeration = WinBeginEnumWindows( QueryDesktopWindow() ); HWND Window = NULLHANDLE;
 while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE )
  {
   // Если окно скрыто - продолжаем перебор окон.
   if( !WinIsWindowVisible( Window ) ) continue;

   // Если это окно WPS - используется оболочка WPS.
   if( IsFolderWindow( Window ) )
    {
     // Завершаем перебор окон.
     WinEndEnumWindows( Enumeration );

     // Возврат.
     return 1;
    }
  }
 WinEndEnumWindows( Enumeration );

 // Возврат.
 return 0;
}
Ejemplo n.º 21
0
static MRESULT EXPENTRY pm_joystick(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
    switch (msg) {
        case WM_INITDLG:
            {
                int joy1, joy2;
                //
                // disable controls of non existing joysticks
                // remark: I think this cannot change while runtime
                //
                if (!(number_joysticks & JOYDEV_HW1)) {
                    WinEnableControl(hwnd, CB_JOY11, 0);
                    WinEnableControl(hwnd, CB_JOY12, 0);
                }
                if (!(number_joysticks&JOYDEV_HW2)) {
                    WinEnableControl(hwnd, CB_JOY21, 0);
                    WinEnableControl(hwnd, CB_JOY22, 0);
                }
                if (number_joysticks == 0) {
                    WinEnableControl(hwnd, ID_CALIBRATE, 0);
                }

                if (machine_class == VICE_MACHINE_VIC20) {
                    WinEnableControl(hwnd, CB_JOY12, 0);
                    WinEnableControl(hwnd, CB_JOY22, 0);
                    WinEnableControl(hwnd, CB_NUMJOY2, 0);
                    WinEnableControl(hwnd, CB_KS1JOY2, 0);
                    WinEnableControl(hwnd, CB_KS2JOY2, 0);
                    WinEnableControl(hwnd, ID_SWAP, 0);
                }

                resources_get_int("JoyDevice1", &joy1);
                resources_get_int("JoyDevice2", &joy2);
                WinSendMsg(hwnd, WM_SETCBS, (void*)joy1, (void*)joy2);
            }
            break;
        case WM_DESTROY:
        case WM_CLOSE:
            {
                if (WinIsWindowVisible(hwndCalibrate)) {
                    WinSendMsg(hwndCalibrate, WM_CLOSE, 0, 0);
                }

                if (WinIsWindowVisible(hwndKeyset)) {
                    WinSendMsg(hwndKeyset, WM_CLOSE, 0, 0);
                }
            }
            break;
        case WM_COMMAND:
            switch(LONGFROMMP(mp1)) {
                case DID_CLOSE:
                    {
                        if (WinIsWindowVisible(hwndCalibrate)) {
                            WinSendMsg(hwndCalibrate, WM_CLOSE, 0, 0);
                        }

                        if (WinIsWindowVisible(hwndKeyset)) {
                            WinSendMsg(hwndKeyset, WM_CLOSE, 0, 0);
                        }
                    }
                    break;
                case ID_SWAP:
                    {
                        int joy1, joy2;

                        resources_get_int("JoyDevice1", &joy1);
                        resources_get_int("JoyDevice2", &joy2);

                        resources_set_int("JoyDevice1", joy2);
                        resources_set_int("JoyDevice2", joy1);

                        WinSendMsg(hwnd, WM_SETCBS,  (void*)joy2, (void*)joy1);
                    }
                    return FALSE;
                case ID_CALIBRATE:
                    calibrate_dialog(hwnd);
                    return FALSE;
                case ID_KEYSET:
                    keyset_dialog(hwnd);
                    return FALSE;;
            }
            break;
        case WM_CONTROL:
            {
                int button =SHORT1FROMMP(mp1);
                int state = WinQueryButtonCheckstate(hwnd, button);
                int port = button & JOY_PORT1;
                int joya, joyb;

                resources_get_int(port ? "JoyDevice1" : "JoyDevice2", &joya);
                resources_get_int(port ? "JoyDevice2" : "JoyDevice1", &joyb);
                if (state) {
                    joya |= button & JOYDEV_ALL;
                } else {
                    joya &= ~(button & JOYDEV_ALL);
                }

                resources_set_int(port ? "JoyDevice1" : "JoyDevice2", joya);
                WinSendMsg(hwnd, WM_SETDLGS, (void*)(port ? joya : joyb), (void*)(port ? joyb : joya));

             }
             break;
        case WM_SETDLGS:
            {
                int joy1 = (int)mp1;
                int joy2 = (int)mp2;
                int joys = joy1 | joy2;

                if (WinIsWindowVisible(hwndCalibrate)) {
                    WinSendMsg(hwndCalibrate, WM_SETJOY, (MPARAM)(joys & JOYDEV_HW1), (MPARAM)(joys & JOYDEV_HW2));
                }

                if (WinIsWindowVisible(hwndKeyset)) {
                    WinSendMsg(hwndKeyset, WM_SETKEY, (MPARAM)(joys&JOYDEV_KEYSET1), (MPARAM)(joys&JOYDEV_KEYSET2));
                }
            }
            break;
        case WM_SETCBS:
            WinCheckButton(hwnd, CB_JOY11, (JOYDEV_HW1 & (int)mp1) ? 1 : 0);
            WinCheckButton(hwnd, CB_JOY12, (JOYDEV_HW1 & (int)mp2) ? 1 : 0);
            WinCheckButton(hwnd, CB_JOY21, (JOYDEV_HW2 & (int)mp1) ? 1 : 0);
            WinCheckButton(hwnd, CB_JOY22, (JOYDEV_HW2 & (int)mp2) ? 1 : 0);
            WinCheckButton(hwnd, CB_NUMJOY1, (JOYDEV_NUMPAD & (int)mp1) ? 1 : 0);
            WinCheckButton(hwnd, CB_NUMJOY2, (JOYDEV_NUMPAD & (int)mp2) ? 1 : 0);
            WinCheckButton(hwnd, CB_KS1JOY1, (JOYDEV_KEYSET1 & (int)mp1) ? 1 : 0);
            WinCheckButton(hwnd, CB_KS1JOY2, (JOYDEV_KEYSET1 & (int)mp2) ? 1 : 0);
            WinCheckButton(hwnd, CB_KS2JOY1, (JOYDEV_KEYSET2 & (int)mp1) ? 1 : 0);
            WinCheckButton(hwnd, CB_KS2JOY2, (JOYDEV_KEYSET2 & (int)mp2) ? 1 : 0);
            break;
    }
    return WinDefDlgProc (hwnd, msg, mp1, mp2);
}
// Message определяет пришедшее сообщение.
VOID Changer_ChangerMessageProcessing( PQMSG Message )
{
 // Устанавливаем приоритет потока.
 if( Message->msg == SM_PRIORITY )
  {
   // Устанавливаем приоритет.
   LONG Class = (LONG) Message->mp1;
   LONG Delta = (LONG) Message->mp2;
   DosSetPriority( PRTYS_THREAD, Class, Delta, 0 );

   // Запоминаем приоритет.
   Enhancer.Modules.Changer->Priority = MAKELONG( Class, Delta );
  }

 // Меняем значок окна.
 if( Message->msg == SM_CHANGE_ICON )
  {
   // Узнаем окно рамки.
   HWND Frame_window = (HWND) Message->mp1;
   // Узнаем значок, который должен быть установлен.
   HPOINTER New_icon = (HPOINTER) Message->mp2;

   // Если окна рамки нет - возврат.
   if( !WinIsWindow( WinQueryAnchorBlock( Frame_window ), Frame_window ) ) return;

   // Меняем значок.
   Changer_ChangeWindowIcon( Frame_window, New_icon );
  }

 // Сбрасываем значок, который был загружен с диска.
 if( Message->msg == SM_FREE_FILE_ICON )
  {
   // Узнаем значок.
   HPOINTER Icon = (HPOINTER) Message->mp1;

   // Освобождаем память.
   WinFreeFileIcon( Icon );
  }

 // Делаем окно доступным или недоступным для переключения.
 if( Message->msg == SM_SET_JUMPABLE )
  {
   // Узнаем окно рамки.
   HWND Frame_window = (HWND) Message->mp1;

   // Если окна рамки нет - возврат.
   if( !WinIsWindow( WinQueryAnchorBlock( Frame_window ), Frame_window ) ) return;

   // Узнаем свойство.
   ULONG Jumpable = (ULONG) Message->mp2;

   // Меняем его.
   if( Frame_window != GetDetectedShellWindow() ) SetJumpableFlag( Frame_window, Jumpable );
  }

 // Меняем шрифт для текстовых окон - первый и второй шаги.
 if( Message->msg == SM_CHANGE_VIO_FONT || Message->msg == SM_APPLY_VIO_FONT )
  {
   // Узнаем окно рамки.
   HWND Frame_window = (HWND) Message->mp1;

   // Если шрифт менять не надо - возврат.
   if( !VIOFontMustBeChanged( Frame_window ) ) return;

   // Если окна рамки нет - возврат.
   if( !WinIsWindow( WinQueryAnchorBlock( Frame_window ), Frame_window ) ) return;

   // Шаг первый: вызываем окно смены шрифта и ждем его появления.
   if( Message->msg == SM_CHANGE_VIO_FONT )
    {
     // Проверяем состояние окна.
     BYTE VIO_font_dialog = 0; FindProperty( Frame_window, PRP_VIO_FONT_DIALOG, &VIO_font_dialog );
     // Если для этого окна уже был вызван диалог выбора шрифта - возврат.
     if( VIO_font_dialog ) return;

     // Вызываем окно смены шрифта.
     OpenVIOFontMetricsDialog( Frame_window );

     // Запоминаем, что окно было показано.
     VIO_font_dialog = 1; SetProperty( Frame_window, PRP_VIO_FONT_DIALOG, &VIO_font_dialog );
    }

   // Шаг второй: выбираем в нем шрифт и применяем его.
   if( Message->msg == SM_APPLY_VIO_FONT )
    {
     // Выбираем шрифт.
     SubmitVIOFontMetricsDialog( Frame_window );
    }
  }

 // Делаем окно видимым.
 if( Message->msg == SM_SHOW_AND_ARRANGE )
  {
   // Узнаем окно рамки.
   HWND Frame_window = (HWND) Message->mp1;

   // Если окна рамки нет - возврат.
   if( !WinIsWindow( WinQueryAnchorBlock( Frame_window ), Frame_window ) ) return;

   // Делаем окно видимым.
   if( !WinIsWindowVisible( Frame_window ) ) WinShowWindow( Frame_window, 1 );

   // Если надо выравнивать текстовые окна:
   if( ArrangeVIOWindows() )
    {
     // Посылаем в окно сообщение WM_MARK. Когда оно будет получено, окно можно будет выравнивать.
     WinPostMsg( Frame_window, WM_MARK, (MPARAM) MRK_ARRANGE_WINDOW, (MPARAM) SM_ARRANGE_VIO );
    }
  }

 // Возврат.
 return;
}
// Frame_window - окно рамки, Target - какое из окон надо перерисовать.
VOID Painter_DrawWindowFrame( HWND Frame_window, ULONG Target )
{
 // Узнаем размер и расположение окна.
 RECT Frame_rectangle = {0}; SWP Frame_placement = {0};
 Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );

 // Если окно не показано - возврат.
 if( Frame_rectangle.yTop <= 1 || Frame_rectangle.xRight <= 1 ) return;

 // Узнаем, как выглядит рамка окна.
 LONG Frame_type = FrameType( Frame_window );

 // Узнаем, выбрано ли окно.
 BYTE Window_is_active = WindowIsActive( Frame_window );

 // Устанавливаем свойство.
 SetProperty( Frame_window, PRP_ACTIVATED, &Window_is_active );

 // Узнаем окно заголовка.
 HWND TitleBar_window = WinWindowFromID( Frame_window, FID_TITLEBAR );

 // Для некоторых окон можно рисовать только заголовок.
 BYTE Draw_TitleBar_only = 0;

 if( !Painter_PermissionForCompleteDrawing( Frame_window ) )
  {
   Draw_TitleBar_only = 1; Target = WT_TITLEBAR;
  }

 // Рисуем рамку для окна.
 if( !Draw_TitleBar_only )
  {
   for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
    {
     if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
     Painter_DrawFrameRectangle( Frame_window, Frame_type, &Frame_rectangle, &Frame_placement, Window_is_active );
     if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
    }
  }

 // Подчеркиваем объем меню окна.
 if( Painter.Settings.Draw_menus ) if( Frame_type != FT_FLAT )
  if( Target & WT_UNKNOWN || Target & WT_MENU )
   {
    HWND Menu_window = WinWindowFromID( Frame_window, FID_MENU );

    if( Menu_window != NULLHANDLE )
     {
      for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
       {
        if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
        Painter_DrawWindowMenu( Menu_window, Frame_window, &Frame_rectangle, &Frame_placement );
        if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
       }
     }
   }

 // Узнаем окно обычных кнопок.
 HWND MinMax_window = WinWindowFromID( Frame_window, FID_MINMAX );

 // Если окно плоское:
 if( Frame_type == FT_FLAT )
  {
   // Если в нем есть окно обычных кнопок - скрываем его.
   if( Painter.Settings.Draw_buttons ) if( MinMax_window != NULLHANDLE ) WinShowWindow( MinMax_window, 0 );

   // Возврат.
   return;
  }
 // А если это не плоское окно:
 else
  {
   // Если свойства окна неизвестны и могут быть определены в будущем - возврат.
   if( !PropertiesForDrawingAreDetected( Frame_window ) )
    if( WinWindowFromID( Frame_window, FID_SYSMENU ) != NULLHANDLE ) return;
  }

 // Узнаем окно картинки.
 HWND SysMenu_window = WinWindowFromID( Frame_window, FID_SYSMENU );

 // Узнаем высоту заголовка и картинки.
 INT TitleBar_height = 0;

 if( TitleBar_window != NULLHANDLE )
  {
   RECT Rectangle = {0}; WinQueryWindowRect( TitleBar_window, &Rectangle ); TitleBar_height = Rectangle.yTop - 1;
  }
 else
  {
   TitleBar_height = WinQuerySysValue( QueryDesktopWindow(), SV_CYMINMAXBUTTON ) - 1;
  }

 // Окна заголовка и картинки должны быть расположены на одной линии.
 // Если это не так - окно надо обновить и ничего не рисовать в нем.
 if( SysMenu_window != NULLHANDLE ) if( TitleBar_window != NULLHANDLE )
  if( WinIsWindowVisible( SysMenu_window ) )
   {
    // Узнаем ширину рамки окна.
    INT Frame_width = 0; FindProperty( Frame_window, PRP_BORDER, &Frame_width );
    if( !Frame_width ) Frame_width = FrameWidth( Frame_window );

    // Узнаем расположение окна картинки.
    SWP SysMenu_placement = {0}; WinQueryWindowPos( SysMenu_window, &SysMenu_placement );

    // Если оно расположено на своем месте:
    INT Y_middle_line = Frame_rectangle.yTop - Frame_width - TitleBar_height / 2;

    if( SysMenu_placement.y < Y_middle_line ) if( SysMenu_placement.y + SysMenu_placement.cy > Y_middle_line )
     {
      // Узнаем расположение окна заголовка.
      SWP TitleBar_placement = {0}; WinQueryWindowPos( TitleBar_window, &TitleBar_placement );

      // Если заголовок расположен не на своем месте:
      if( TitleBar_placement.y > Y_middle_line || TitleBar_placement.y + TitleBar_placement.cy < Y_middle_line )
       {
        // Обновляем окно.
        UpdateWindow( Frame_window );

        // Возврат.
        return;
       }
     }
   }

 // Узнаем, можно ли рисовать для окна новые кнопки.
 BYTE Draw_new_buttons = 0;

 if( Painter.Settings.Draw_buttons )
  {
   // Узнаем, было ли определено состояние кнопок.
   BYTE Actions_are_detected = 0; FindProperty( Frame_window, PRP_ACTIONS, &Actions_are_detected );

   // Если оно известно - кнопки можно рисовать.
   if( Actions_are_detected ) Draw_new_buttons = Painter_PermissionForButtonsDrawing( Frame_window );
  }

 // Кнопки уменьшения и увеличения окна надо скрыть и сжать в "|". Кроме того, рамка
 // может содержать несколько кнопок слева и справа от заголовка, их надо передвинуть.
 BYTE Advanced_controls = 0;

 // Если надо рисовать рамку или заголовок:
 if( Target & WT_UNKNOWN || Target & WT_BORDER || Target & WT_TITLEBAR )
  {
   // Передвигаем окна в заголовке и задаем подходящие цвета.
   if( TitleBar_window != NULLHANDLE || MinMax_window != NULLHANDLE )
    if( Painter_PermissionForCompleteDrawing( Frame_window ) )
     Advanced_controls = Painter_PrepareWindowControls( Frame_window, Frame_type, &Frame_rectangle, &Frame_placement, TitleBar_window, SysMenu_window, MinMax_window );

   // Если справа от заголовка были найдены дополнительные окна - запоминаем это.
   if( Advanced_controls ) SetProperty( Frame_window, PRP_CONTROLS, &Advanced_controls );
  }

 // Рисуем новые кнопки в правом верхнем углу окна.
 if( Draw_new_buttons )
  if( Target & WT_UNKNOWN || Target & WT_BORDER )
   if( TitleBar_window != NULLHANDLE )
    {
     for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
      {
       if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
       Painter_DrawButtons( Frame_window, Frame_type, &Frame_rectangle, &Frame_placement, TitleBar_window );
       if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
      }
    }

 // Рисуем картинку в левом верхнем углу окна.
 if( Painter.Settings.Draw_system_menus )
  if( Target & WT_UNKNOWN || Target & WT_SYSMENU )
   if( SysMenu_window != NULLHANDLE )
    {
     // Рисуем картинку.
     HPOINTER Icon = NULLHANDLE; FindProperty( Frame_window, PRP_ICON, &Icon );

     for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
      {
       if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
       Painter_DrawSystemMenu( SysMenu_window, Frame_window, &Frame_rectangle, &Frame_placement, Icon, Frame_type, 0 );
       if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
      }

     // Если окно картинки закрывает рамку - перерисовываем ее.
     if( Frame_rectangle.xRight + 1 < TitleBar_height * 2 )
      {
       for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
        {
         if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
         Painter_DrawFrameRectangle( Frame_window, Frame_type, &Frame_rectangle, &Frame_placement, Window_is_active );
         if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
        }
      }
    }

 // Рисуем заголовок окна.
 if( Painter.Settings.Draw_titles )
  if( Target & WT_UNKNOWN || Target & WT_TITLEBAR )
   if( TitleBar_window != NULLHANDLE )
    {
     // Рисуем заголовок. Только подчеркивать его объем нельзя - может получиться окно с незакрашенным заголовком и линиями по краям.
     CHAR Title[ SIZE_OF_TITLE ] = ""; FindProperty( Frame_window, PRP_TITLE, Title );

     for( INT Step = 0; Step < MAX_FCHECKS; Step ++ )
      {
       if( Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) Painter_QueryFrameRectangeAndPlacement( Frame_window, &Frame_rectangle, &Frame_placement );
       Painter_DrawTitleBar( TitleBar_window, Frame_window, Frame_type, &Frame_rectangle, &Frame_placement, Title, Window_is_active, Advanced_controls );
       if( Step != MAX_FCHECKS - 1 ) if( !Painter_FrameRectangleIsChanged( Frame_window, &Frame_rectangle, &Frame_placement ) ) break;
      }
    }

 // Возврат.
 return;
}