Blog chia sẽ kinh nghiệm lập trình và Technical VN. Nơi mà các bạn có thể học tập và tham khảo về những công nghệ mới nhất hiện nay về .NET
Thứ Ba, 28 tháng 4, 2015
SystemMenuPhysicalCoordinatesTiêu đề có vẻ khó hình dung - thật sự tôi cũng không biết diễn đạt thế nào; hôm nay tôi sẽ mang đến cho các bạn một cách để giải quyết vấn đề mà tôi gặp phải và tôi nghĩ cũng nhiều người có cùng thắc mắc như tôi. Vấn đề nảy sinh nhiều khi bạn làm một ứng dụng WPF, bạn muốn làm một Window cho riêng mình, không có phần Border hay Style mặc định của Windows, bạn chọn cách ẩn hết những thứ mặc định đi sau đó thiết kế lại; và một số thứ bạn ẩn nó đi rồi không thể tìm thấy được khi cần thiết. Một trong những thứ mất đi nhưng cần thiết đó là một số SystemMenu, nó chính là phần menu ở góc trái trên, xuất hiện khi bạn nhấn vào logo/icon của window; Vậy làm thế nào hiện nó lại mà vẫn giữ được việc ẩn những thứ không cần thiết.
I> SystemMenu-Physical-Coordinates là gì?
Trong một số trường hợp SystemMenu ở góc 10h thật sự phát huy tác dụng và riêng tôi một phần mềm chuyên nghiệp không nên bỏ qua nó nếu đặc thù lĩnh vực vẫn cho phép. Đến với một ứng dụng WPF thông thường chúng ta sẽ thấy nó như thế này
Nhưng với tôi nó có vẻ không ổn, tôi muốn ẩn hết các đường Border mặc định kia đi, các Button góc 2h cũng không cần thiết vì Style này không đồng nhất với mẫu Design của tôi -> Tôi bỏ nó ra khỏi ứng dụng của mình và design thêm một chút
Window.XAML
Và tôi được kết quả thế này

Chú ý rằng cái logo kia chỉ là một Icon tôi vừa đặt nó ở đó, khi tôi Click chuột vào lẽ dĩ nhiên vẫn vắng bóng cái Menu thường thấy ở Windows. Nhưng tôi muốn hiển thị cái menu thường thấy ấy ngay dưới vị trí Icon khi tôi Click chuột; Đơn giản chúng ta chỉ cần bắc sự kiện Logo_OnMouseLeftButtonDown(sender, e).
Window.CS
private void Logo_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Sẽ xử lý việc hiện SysMenu ở đây
}
II> Cách lấy và Show SystemMenu Physical-Coordinates
Trước tiên chúng ta cần Import một số thư viện WinAPI cần thiết, tôi tạo Class sauUnsafeNativeMethods.CS
internal class UnsafeNativeMethods
{
///
[DllImport("user32", CharSet = CharSet.Auto, ExactSpelling = true)]
// Kiểm tra một obj có phải là Windows?
internal static extern bool IsWindow([In] [Optional] IntPtr hWnd);
///
[DllImport("user32")]
// Get SysMenu mặc định
internal static extern IntPtr GetSystemMenu([In] IntPtr hWnd, [In] bool bRevert);
///
[DllImport("user32")]
// Show SysMenu trên Window
internal static extern uint TrackPopupMenuEx([In] IntPtr hmenu, [In] uint fuFlags, [In] int x, [In] int y,
[In] IntPtr hwnd, [In] [Optional] IntPtr lptpm);
///
[DllImport("user32", EntryPoint = "PostMessage", SetLastError = true)]
// PostMessage cho hệ thống Windows về hành vi của chúng ta
private static extern bool _PostMessage([In] [Optional] IntPtr hWnd, [In] uint Msg, [In] IntPtr wParam,
[In] IntPtr lParam);
internal static void PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam)
{
if (!_PostMessage(hWnd, Msg, wParam, lParam))
{
throw new Win32Exception();
}
}
}
Xong phần NativeMethods chúng ta tạo static class sau
SystemMenuPhysicalCoordinates.CS
internal static class SystemMenuPhysicalCoordinates
{
internal const uint SYSCOMMAND = 0x0112;
internal const uint TPM_LEFTBUTTON = 0x0;
internal const uint TPM_RETURNCMD = 0x0100;
///
/// Show SysMenu on Cureent Window
///
/// Window bạn muốn hiển thị /// Vị trí muốn hiển thị menu internal static void Show(Window window, Point physicalScreenLocation) { if (window == null) return; IntPtr hwnd = new WindowInteropHelper(window).Handle; if (hwnd == IntPtr.Zero || !UnsafeNativeMethods.IsWindow(hwnd)) return; // Get Menu IntPtr hmenu = UnsafeNativeMethods.GetSystemMenu(hwnd, false); // Show menu uint cmd = UnsafeNativeMethods.TrackPopupMenuEx(hmenu, TPM_LEFTBUTTON | TPM_RETURNCMD, (int) physicalScreenLocation.X, (int) physicalScreenLocation.Y, hwnd, IntPtr.Zero); if (0 != cmd) UnsafeNativeMethods.PostMessage(hwnd, SYSCOMMAND, new IntPtr(cmd), IntPtr.Zero); } } Thế là xong phần cở bản, chúng ta quay lại Handle cho Logo_OnMouseLeftButtonDown
Các bạn có thể phát triển rộng hơn bằng cách đóng gói thành một Behavior độc lập để Attaching khi cần thiết. Tải source tại đây, chúc các bạn thành công! Phạm Tuân WPF.
Đăng ký:
Đăng Nhận xét (Atom)
Search
Popular Posts
-
Phong cách thiết kế Material Design nhắm đến những đường nét đơn giản, sử dụng nhiều mảng màu đậm nổi bật, các đối tượng đồ họa trong giao ...
-
Hôm nay chúng ta sẽ tìm hiểu cách tạo ra các menu chuột phải trên ứng dụng WPF của mình. Ở bài này chúng ta xoay quanh việc tìm hiểu cách tạ...
-
Hôm nay tôi sẽ giới thiệu với các bạn một Framework đến từ Microsoft - framework này không quá lớn nhưng là khá mạnh khi các bạn làm việc vớ...
-
WPF vượt trội hơn Winform về khoản Drawing , trong đó đặc biệt WPF hỗ trợ đồ họa rất tốt vì nó tương tác trực tiếp đến GPU. Hôm nay chúng t...
-
Để dễ hiểu, các bạn hãy hình dung rằng: cùng một tập tin thực thi *.EXE nhưng bạn DoubleClick 10 lần cách quãng vào nó thì chuyện gì sẽ sảy ...
-
ReSharper là một công cụ Add-on cho Visual Studio, nó giúp lập trình viên tốn ít thời gian cho việc xem xét định dạng code, phong cách code,...
-
Hôm nay chúng ta sẽ thử đo xem thời gian query Data của "Foreach vs LinQ vs LinQasParallel" như thế nào. Tôi tạo một tool nhỏ để l...
-
Data Binding là kĩ thuật dùng để tạo gắn kết giữa phần giao diện ( UI ) và dữ liệu thông qua phần business logic hoặc giữa các đối tượng UI...
-
Chào các bạn, hôm nay tôi sẽ giới thiệu đến mọi người về một thư viện khác giúp chúng ta xây dựng một ứng dụng WPF với giao diện mang đậm ph...
-
Đối với lập trình hiện đại hiện nay, việc hỗ trợ người dùng tối đa cũng như trừu tượng hóa các công việc đến mức gần gủi và dễ hiểu nhất cho...
Recent Posts
Blog Archive
-
▼
2015
(48)
-
▼
tháng 4
(9)
- WPF - Làm Sao Show Được Menu Mặc Định Của Hệ Thống...
- WPF - Tìm Hiểu Về Attached Behaviors Trong WPF
- WPF Library - Tạo Kính Lúp Cho Ứng Dụng WPF (Zoom ...
- WPF - Sự Khác Nhau Giữa StaticResource với Dynamic...
- C# - XML Serialization and Deserialization(Lưu Trữ...
- C# - Tùy Chọn Khởi Động Cùng Windows Cho Ứng Dụng
- WPF – Cơ Bản Về Data Binding Trong WPF
- WPF - Tổng quan về Windows Presentation Foundation
- WPF Training – Drag and Drop Trong WPF Part II
-
▼
tháng 4
(9)

0 nhận xét:
Đăng nhận xét