Vlastní reakce na podrženi stylu uživatelem (zobrazení kontextového menu)
Další z triků pro Compact .Net Framework, na který se lidé často ptají. Chcete sami zareagovat na podržení stylu místo výchozího zobrazení kontextového menu, což zajišťuje výchozí obsluha události přímo v CNF? Přes P/Invoke je to možné.
private const uint GN_CONTEXTMENU = 1000;
private const uint SHRG_RETURNCMD = 0x00000001;
[StructLayout(LayoutKind.Sequential)]
public class SHINFO
{
public uint cbSize = 0;
public IntPtr hwndClient = IntPtr.Zero;
public int x = 0;
public int y = 0;
public uint dwFlags = 0;
}
[DllImport("aygshell", SetLastError = true)]
private static extern uint SHRecognizeGesture(SHINFO shrg);
//Obsluha udalosti MouseDown formulare/ovladaciho prvku
private void mouseDown(object sender, MouseEventArgs e)
{
SHINFO shinfo = new SHINFO();
shinfo.cbSize = (uint)(Marshal.SizeOf(shinfo));
shinfo.hwndClient = this.Handle; //handle formulare/ovladaciho prvku
shinfo.x = e.X;
shinfo.y = e.Y;
shinfo.dwFlags = SHRG_RETURNCMD;
if (SHRecognizeGesture(shinfo) == GN_CONTEXTMENU)
{
//nase reakce
}
}
V nativním kódu můžeme vlastním zpracováním gesta GN_CONTEXTMENU odstranit nepříjemnou a snad od počátku přítomnou chybu v MFC, která způsobí, že se animace ("tečky opisující kruh") zobrazí 2x. Ukázka z Today pluginu (čisté API, ne MFC).
SHRGINFO shrg;
HMENU hMenu;
shrg.cbSize = sizeof(shrg);
shrg.hwndClient = m_hWnd;
shrg.ptDown.x = point.x;
shrg.ptDown.y = point.y;
shrg.dwFlags = SHRG_RETURNCMD ;
POINT screenPoint = point;
ClientToScreen(m_hWnd, &screenPoint);
if (!tabControl.HasFocus())
{
:PostMessage(GetParent(), TODAYM_TOOKSELECTION, (WPARAM)m_hWnd, 0);
}
if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU)
{
//Nas kod
}
Thursday, 24 April 2008 12:11:30 (Central Europe Standard Time, UTC+01:00)
Compact .Net Framework | Mobilitky