一部の HTML 要素にドラッグ ロジックを使用して、ボーダレス ウィンドウを実装したいと考えています。私はいくつかの実用的な例(Chromeのフレームレスウィンドウなど)を見つけました。これが私が試したものです:
.title-area
{
-webkit-app-region: drag;
}
<div class='title-area'>
A draggable area
</div>
次に、C# コードで IDragHandler クラスを実装しました。
internal class PromtDragHandler : IDragHandler
{
bool IDragHandler.OnDragEnter(IWebBrowser browserControl, IBrowser browser, IDragData dragData, DragOperationsMask mask)
{
return false;
}
void IDragHandler.OnDraggableRegionsChanged(IWebBrowser browserControl, IBrowser browser, IList<DraggableRegion> regions)
{
}
}
メソッド OnDraggableRegionsChanged は開始時に 1 回起動し、要素「タイトル エリア」のテキストをドラッグすると OnDragEnter が起動します。しかし、ウィンドウを移動するために次に何をすればよいかわかりません。
アップデート。コメントで述べたように、CefTestAppはこのドラッグ機能をサポートしています。ソース コードには、DragHandler から呼び出されるメソッド OnSetDruggableRegions があります。
void RootWindowWin::OnSetDraggableRegions(
const std::vector<CefDraggableRegion>& regions) {
REQUIRE_MAIN_THREAD();
// Reset draggable region.
::SetRectRgn(draggable_region_, 0, 0, 0, 0);
// Determine new draggable region.
std::vector<CefDraggableRegion>::const_iterator it = regions.begin();
for (;it != regions.end(); ++it) {
HRGN region = ::CreateRectRgn(
it->bounds.x, it->bounds.y,
it->bounds.x + it->bounds.width,
it->bounds.y + it->bounds.height);
::CombineRgn(
draggable_region_, draggable_region_, region,
it->draggable ? RGN_OR : RGN_DIFF);
::DeleteObject(region);
}
// Subclass child window procedures in order to do hit-testing.
// This will be a no-op, if it is already subclassed.
if (hwnd_) {
WNDENUMPROC proc = !regions.empty() ?
SubclassWindowsProc : UnSubclassWindowsProc;
::EnumChildWindows(
hwnd_, proc, reinterpret_cast<LPARAM>(draggable_region_));
}
}
ドラッグ可能な領域 (開始時に 1 回だけ起動する) に関する情報がウィンドウの移動にどのように役立つのか、まだよくわかりません。誰かがこのロジックを説明したり、このコードに相当する C# を提供したりできますか?