最近、MISシステムインターフェイスの全体的なフレームワークを考慮して、MDIフォーム+モジュールでMDIの子供を使用することにしましたが、MDIフォームのワークスペースには常に厄介な厚いエッジがあります。
昨日の午後、インターネットからC ++バージョンの解決策を見つけました。
MDIフォームに次のコードを書きます。
インタフェース
tfmmain = class(tform)
...
手順formcreate(sender:tobject);
...
プライベート
...
手順createdefwndproc();
手順ClientWndProc(var message:tmessage);
終わり;
実装
...
手順tfmmain.createdefwndproc;
var
hwnd1:hwnd;
CCS:tclientCreatestruct;
始める
ccs.hwindowmenu:= 0;
ccs.idfirstchild:= $ ff00;
hwnd1:= createwindowex(ws_ex_clientedge、
'mdiclient'、 ''、ws_childまたはws_visibleまたはws_groupまたは
ws_tabstopまたはws_clipchildrenまたはws_hscrollまたはws_vscrollまたは
ws_clipsiblingsまたはmdis_allchildstyles、0、0、clientWidth、
clientheight、handle、0、hinstance、@ccs);
fclientInstance:= pointer(getwindowlong(hwnd1、gwl_wndproc));
DestroyWindow(hwnd1);
終わり;
手順tfmmain.clientwndproc(var message:tmessage);
// var
// mydc:hdc;
始める
if(message.msg = wm_erasebkgnd)then
始める
//ここでVCLをシミュレートするソースプログラムは、メインウィンドウの背景色でクライアント領域を埋めます。
//クライアント領域にグラフィックを描画することもできます。
fillRect(HDC(message.wparam)、clientRect、Brush.Handle);
// mydc:= twmerasebkgnd(message).dc;
// bitblt(mydc、(clientwidth -imback.picture.width)div 2、
//(clientheight -imback.picture.height)div 2、
// imback.picture.width、imback.picture.height、
// imback.picture.bitmap.canvas.handle、0、0、srccopy);
message.result:= 1;
終わり
それ以外
message.result:= callwindowproc(fclientinstance、clienthandle、
message.msg、message.wparam、message.lparam);
終わり;
手順tfmmain.formcreate(sender:tobject);
始める
// ********* mdichildの厚い境界線を取り外す***************
createdefwndproc();
SetWindowlong(clienthandle、gwl_wndproc、
longint(makeobjectInstance(clientWndproc)));
SetWindowlong(clienthandle、gwl_exstyle、getWindowlong(
clienthandle、gwl_exstyle)および(ws_ex_clientedgeではない));
SetWindowpos(clienthandle、0,0,0,0,0、swp_framechanged
またはswp_noactivateまたはswp_nomoveまたはswp_nosizeまたはswp_nozorder);
// ****************************************** ************
終わり;