os2FrameWindow::~os2FrameWindow() { if (mFrameIcon) { WinFreeFileIcon(mFrameIcon); mFrameIcon = 0; } }
static void DestroyIcon(HPOINTER hIcon, bool fWpsIcon) { if (fWpsIcon) WinDestroyPointer(hIcon); else WinFreeFileIcon(hIcon); return; }
nsresult os2FrameWindow::SetIcon(const nsAString& aIconSpec) { static HPOINTER hDefaultIcon = 0; HPOINTER hWorkingIcon = 0; // Assume the given string is a local identifier for an icon file. nsCOMPtr<nsIFile> iconFile; mOwner->ResolveIconName(aIconSpec, NS_LITERAL_STRING(".ico"), getter_AddRefs(iconFile)); // if the file was found, try to use it if (iconFile) { nsCAutoString path; iconFile->GetNativePath(path); if (mFrameIcon) { WinFreeFileIcon(mFrameIcon); } mFrameIcon = WinLoadFileIcon(path.get(), FALSE); hWorkingIcon = mFrameIcon; } // if that doesn't work, use the app's icon (let's hope it can be // loaded because nobody should have to look at SPTR_APPICON) if (!hWorkingIcon) { if (!hDefaultIcon) { hDefaultIcon = WinLoadPointer(HWND_DESKTOP, 0, 1); if (!hDefaultIcon) { hDefaultIcon = WinQuerySysPointer(HWND_DESKTOP, SPTR_APPICON, FALSE); } } hWorkingIcon = hDefaultIcon; } WinSendMsg(mFrameWnd, WM_SETICON, (MPARAM)hWorkingIcon, (MPARAM)0); return NS_OK; }
// 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; }