Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1093882368
undert
2004-08-30 20:12
2004.09.19
Подскажите пожалуйста


3-1092988776
Tormoz
2004-08-20 11:59
2004.09.19
Oracle SQL*Plus. Где результат запроса?


6-1089949637
Гость778
2004-07-16 07:47
2004.09.19
Подскажите где скачать компонент TWebBrowser


3-1093217295
Anarki
2004-08-23 03:28
2004.09.19
Соединение с базой данных MS Access, защищённой паролем


1-1093890542
Arcady
2004-08-30 22:29
2004.09.19
как справиться с генератором тестов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский