/* Resizable options dialog plugin for Miranda IM Copyright © 2006 Cristian Libotean This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "dlg_handlers.h" #include "commctrl.h" #define DIALOG_CLASS "#32770" static int MIN_OPTIONS_WIDTH = 320; static int MIN_OPTIONS_HEIGHT = 200; static int MAX_OPTIONS_WIDTH = 1200; static int MAX_OPTIONS_HEIGHT = 1200; static HWND hFirstChildDlg = NULL; WNDPROC oldOptDlgProc; void HookOptionsProc(HWND hOptDlg) { oldOptDlgProc = (WNDPROC) SetWindowLong(hOptDlg, GWL_WNDPROC, (LONG) DlgProcOptions); } void UnhookOptionsProc(HWND hOptDlg) { SetWindowLong(hOptDlg, GWL_WNDPROC, (LONG) oldOptDlgProc); } int OptionsDialogResizer(HWND hWnd, LPARAM lParam, UTILRESIZECONTROL *urc) { switch (urc->wId) { case IDC_EXPERT: { return RD_ANCHORX_LEFT | RD_ANCHORY_BOTTOM; break; } case IDC_PAGETREE: { return RD_ANCHORX_WIDTH | RD_ANCHORY_TOP; break; } case IDOK: case IDCANCEL: case IDC_APPLY: { return RD_ANCHORX_RIGHT | RD_ANCHORY_BOTTOM; break; } } return RD_ANCHORX_RIGHT | RD_ANCHORY_TOP; //default value } int CALLBACK DlgProcOptions(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: { UnhookOptionsProc(hWnd); break; } case WM_SIZE: { if (IsIconic(hWnd)) { break; } UTILRESIZEDIALOG urd = {0}; urd.cbSize = sizeof(UTILRESIZEDIALOG); urd.hInstance = GetModuleHandle(NULL); urd.lpTemplate = MAKEINTRESOURCE(IDD_OPTIONS); urd.pfnResizer = OptionsDialogResizer; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM) &urd); break; } case WM_USER + 10: { //todo break; } case RODM_HOOKED: { RECT r; GetWindowRect(hWnd, &r); MIN_OPTIONS_WIDTH = r.right - r.left; MAX_OPTIONS_WIDTH = 1200; MIN_OPTIONS_HEIGHT = MAX_OPTIONS_HEIGHT = r.bottom - r.top; hFirstChildDlg = FindWindowEx(hWnd, NULL, DIALOG_CLASS, NULL); ULONG style = GetWindowLong(hWnd, GWL_STYLE); style = style | WS_SIZEBOX & (~WS_MINIMIZEBOX); SetWindowLong(hWnd, GWL_STYLE, style); break; } } return CallWindowProc(oldOptDlgProc, hWnd, msg, wParam, lParam); }