在設計窗體時通常會把子窗體的
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 窗體在其父視窗中...