Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизВопрос про MDI Найти похожие ветки
← →
Михаил Багров (2004-08-07 11:10) [0]Речь идет о много документальном интерфейсе. Типа:(Корел; 1С).
Нужно сделать что бы при выходе чилд-формы за пределы главного окна не появлялись скролбары на панели форм, главного окна? Autoscroll = false для главного окна не дает нужного эффекта.
← →
Игорь Шевченко © (2004-08-09 10:58) [1]
{ Избавление от ScrollBar"ов в MDI-форме. (С) Peter Below (TeamB) }
type
TfMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fMain: TfMain;
implementation
{$R *.DFM}
procedure TfMain.Newchild2Click(Sender: TObject);
begin
with TfChild.Create(Application) do
Show();
end;
function ClientWindowProc( wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;
var
f: Pointer;
begin
f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));
case msg of
WM_NCCALCSIZE:
if ( GetWindowLong( wnd, GWL_STYLE ) and
(WS_HSCROLL or WS_VSCROLL)) <> 0 then
SetWindowLong( wnd, GWL_STYLE, GetWindowLong( wnd, GWL_STYLE )
and not (WS_HSCROLL or WS_VSCROLL));
end;
Result := CallWindowProc( f, wnd, msg, wparam, lparam );
end;
procedure TfMain.FormCreate(Sender: TObject);
begin
if ClientHandle <> 0 then begin
if GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 then
Exit; {cannot subclass client window, userdata already in use}
SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong( ClientHandle,
GWL_WNDPROC, integer( @ClientWindowProc)));
end;
end;
end.
← →
nikkie © (2004-08-09 13:28) [2]>Игорь Шевченко
http://delphimaster.net/view/15-1091864404/
:)) скажи, у тебя есть персональная антипатия к М.Багрову? если нет, то почему ты только через двое суток отвечаешь на такой простой вопрос?? ;)
вообще не нравится мне этот код Below"a - зачем сохранять указатель на старую WndProc в USERDATA? тоже самое проще и надежнее сделать с глобальной переменной или членом класса.
← →
Игорь Шевченко © (2004-08-09 13:42) [3]nikkie © (09.08.04 13:28)
> :)) скажи, у тебя есть персональная антипатия к М.Багрову?
> если нет, то почему ты только через двое суток отвечаешь
> на такой простой вопрос?? ;)
Наверное, потому что два дня меня просто не было. Просмотрев конференцию, не увидел ответа, решил ответить.
> вообще не нравится мне этот код Below"a - зачем сохранять
> указатель на старую WndProc в USERDATA? тоже самое проще
> и надежнее сделать с глобальной переменной или членом класса.
А чем лучше и надежнее ?
Кстати, я не вижу, зачем вообще избавляться от Scrollbar"ов в главной форме, но это уже выходит за рамки.
← →
nikkie © (2004-08-09 14:10) [4]>Кстати, я не вижу, зачем вообще избавляться от Scrollbar"ов в главной форме, но это уже выходит за рамки.
ну я даже не про скроллбары говорю, а про технику сабклассирования.
>А чем лучше и надежнее ?
а я не говорил лучше. я говорил - проще. :)
надежнее - потому как наши переменные никто ненамеренно испортить не сможет. а USERDATA - кто угодно. поэтому и написано: {cannot subclass client window, userdata already in use}. хотя я с трудом представляю как такая ситуация может возникнуть. разве что новая версия VCL будет как-то использовать USERDATA...
вот пример на "чисто ООП" - проверки USERDATA нет, потому и проще. можно сделать FDefClientProc и ClientWndProc глобальными и убрать MakeObjectInstance. в любом случае проще, имхо.FDefClientProc: TFarProc;
procedure ClientWndProc(var Message: TMessage);
procedure TfrmMain.ClientWndProc(var Message: TMessage);
begin
...
Result := CallWindowProc(FDefClientProc, ClientHandle, Msg, wParam, lParam);
end;
procedure TfrmMain.CreateWnd;
begin
inherited CreateWnd;
FDefClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC,
Longint(MakeObjectInstance(ClientWndProc)));
end;
← →
Игорь Шевченко © (2004-08-09 14:18) [5]
> надежнее - потому как наши переменные никто ненамеренно
> испортить не сможет. а USERDATA - кто угодно. поэтому и
> написано: {cannot subclass client window, userdata already
> in use}. хотя я с трудом представляю как такая ситуация
> может возникнуть. разве что новая версия VCL будет как-то
> использовать USERDATA...
Вот и я с трудом представляю.
В принципе, можно поспорить с тем, что твой способ оборачивается необходимостью заводить лишнюю переменную, но это уже, по-моему, ловля блох будет :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c