// 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; }
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; }
void keyset_dialog(HWND hwnd) { if (WinIsWindowVisible(hwndKeyset)) return; hwndKeyset = WinLoadStdDlg(hwnd, pm_keyset, DLG_KEYSET, NULL); }
void calibrate_dialog(HWND hwnd) { if (WinIsWindowVisible(hwndCalibrate)) return; hwndCalibrate = WinLoadStdDlg(hwnd, pm_calibrate, DLG_CALIBRATE, NULL); }
// 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; }
void emulator_dialog(HWND hwnd) { if (WinIsWindowVisible(hwndEmulator)) { return; } hwndEmulator = WinLoadStdDlg(hwnd, pm_emulator, DLG_EMULATOR, NULL); }
void drive_dialog(HWND hwnd) { if (WinIsWindowVisible(hwndDrive)) { return; } hwndDrive = WinLoadStdDlg(hwnd, pm_drive, DLG_DRIVE, NULL); }
void datasette_dialog(HWND hwnd) { if (WinIsWindowVisible(hwndDatasette)) return; hwndDatasette = WinLoadStdDlg(hwnd, pm_datasette, DLG_DATASETTE, NULL); }
void joystick_dialog(HWND hwnd) { static HWND hwnd2 = NULLHANDLE; if (WinIsWindowVisible(hwnd2)) return; hwnd2 = WinLoadStdDlg(hwnd, pm_joystick, DLG_JOYSTICK, NULL); }
void color_dialog(HWND hwnd) { static HWND hwnd2 = NULLHANDLE; if (WinIsWindowVisible(hwnd2)) { return; } hwnd2 = WinLoadStdDlg(hwnd, pm_color, DLG_COLOR, NULL); }
void joystick_extra_dialog(HWND hwnd) { static HWND hwnd3 = NULLHANDLE; if (WinIsWindowVisible(hwnd3)) { return; } hwnd3 = WinLoadStdDlg(hwnd, pm_extra_joystick, DLG_EXTRA_JOYSTICK, NULL); }
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); }
/* * 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); }
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; }
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); }
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; }
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; }