子窗體彈出位置錯誤

2021-06-15 21:02:11 字數 4848 閱讀 8255

在設計窗體時通常會把子窗體的

position 設定成 pomainformcenter。也就是說,子窗體彈出的位置是主窗體的正中。但是如果把主窗體拖動到螢幕左下角,而且主窗體的50%部分已經超出了螢幕範圍,這個時候主窗體的正中其實已經不在螢幕範圍之內了。這個時候彈出的子窗體可能部分或者完全處在螢幕之外了。

具體解決方法:修改

forms.pas,修改

procedure tcustomform.cmshowingchanged(var message: tmessage);

proceduretcustomform.cmshowingchanged(varmessage: tmessage);

const

showcommands:array[twindowstate]ofinteger =

(sw_shownormal, sw_showminnoactive, sw_showmaximized);

var

x, y: integer;

newactivewindow: hwnd;

centerform: tcustomform;

begin

ifnot(csdesigningincomponentstate)and(fsshowinginfformstate)then

raisetry

ifnot(csdesigningincomponentstate)then

begin

ifshowingthen

begin

try

doshow;

exceptend;

if(fposition = poscreencenter)or

((fposition = pomainformcenter)and(formstyle = fsmdichild))then

begin

ifformstyle = fsmdichildthen

begindiv

2div2;

endelse

begin

x := (screen.width - width)div2;

y := (screen.height - height)div2;

end;

ifx < screen.desktopleftthen

x := screen.desktopleft;

ify < screen.desktoptopthen

y := screen.desktoptop;

ify > screen.workareaheight - heightthen

//patch

y := screen.workareaheight - height;      

//patch

setbounds(x, y, width, height);

ifvisiblethensetwindowtomonitor;

end

elseiffpositionin[pomainformcenter, poownerformcenter]then

beginif(fposition = poownerformcenter)and(owneristcustomform)then

centerform := tcustomform(owner);

ifassigned(centerform)then

begin

x := ((centerform.width - width)div

2) + centerform.left;

y := ((centerform.height - height)div

2) + centerform.top;

endelse

begin

x := (screen.width - width)div2;

y := (screen.height - height)div2;

end;

ifx < screen.desktopleftthen

x := screen.desktopleft;

ify < screen.desktoptopthen

y := screen.desktoptop;

ify > screen.workareaheight - heightthen

//patch

y := screen.workareaheight - height;      

//patch

setbounds(x, y, width, height);

ifvisiblethensetwindowtomonitor;

end

elseiffposition = podesktopcenterthen

begin

ifformstyle = fsmdichildthen

begindiv

2div2;

endelse

begin

x := (screen.desktopwidth - width)div2;

y := (screen.desktopheight - height)div2;

end;

ifx < screen.desktopleftthen

//patch

x := screen.desktopleft;                  

//ify < screen.desktoptopthen

//y := screen.desktoptop;                   

//ify > screen.workareaheight - heightthen

//y := screen.workareaheight - height;      

//patch

setbounds(x, y, width, height);

end;

好了!大功告成。將修改後的 forms.pas 複製到您的工程目錄下,再次編譯您的程式。這個問題消失了。

此外,對於修改

delphi 的原始檔,我建議把所有修改過的原始檔都放在乙個新的目錄 (例如 patchedvcls),然後在 delphi 裡面定義乙個環境變數,這樣以後你只要給其它工程的路徑裡面新增這個環境變數,這些工程都可以使用你修改過的**了。至於修改原始碼的一些方法和技巧,請參考

如何訪問私有成員變數和函式

Winform視窗彈出位置設定

winform視窗彈出位置控制 窗體的彈出位置可以由屬性startposition來指定,預設值有 manural 自定義,由屬性location指定 centerscreen 螢幕 windowsdefaultbounds 系統預設位置 但大小為系統預設窗體大小 windowsdefaultloc...

DialogFragment彈出位置的調整

1.目的是在頁面下方的工具欄之上彈出設定的選項。2.實現方式 dialogfragment 頂部彈出 設定距離頂部的距離 onstart 注意 不能將dialogfragment布局設定成match parent,否則該方法無效 最後沒有採用此方法,原因是這個彈出位置也僅僅是修改彈出位置,dialo...

C 設定彈出窗體位置

一 c 中彈出視窗位置 加入命名空間 using system.drawing using system.windows.forms 假定視窗名為form1,則 窗體位置在螢幕中間 form1.startposition formstartposition.centerscreen 窗體在其父視窗中...