私はWindowsMobile6.5(c#、. net、コンパクトフレームワーク)のアプリケーションを開発していますが、デフォルトのスクロールバーを使用せずにフォームを上下にドラッグする方法を見つけるのに苦労しています。私のフォームはデバイスの画面よりも大きく、ユーザーにデフォルトのスクロールバーを使用させたくありませんが、代わりにフォームをドラッグします。
これを行う方法について何かアイデアはありますか?
ありがとう
私はWindowsMobile6.5(c#、. net、コンパクトフレームワーク)のアプリケーションを開発していますが、デフォルトのスクロールバーを使用せずにフォームを上下にドラッグする方法を見つけるのに苦労しています。私のフォームはデバイスの画面よりも大きく、ユーザーにデフォルトのスクロールバーを使用させたくありませんが、代わりにフォームをドラッグします。
これを行う方法について何かアイデアはありますか?
ありがとう
Thorstenは正しいです。フォームの作成は、Compact Frameworkランタイムのいずれかにハードコードされており、フルスクリーン以外のフォーム(ウィンドウを表示するダイアログ)を作成することはできません。
VS(2003/2005/2008)でネイティブC / C ++ Windows CEプロジェクトの開発を開始した場合、ウィンドウサイズは自由に定義できます。
ただし、pinvokeを使用して、作成後にフォームのウィンドウスタイルを変更すると、移動可能なウィンドウフォームを作成できます。
そして、(同じ)ウィンドウスタイルと少しサイズ変更を適用した後:
C#CompactFrameworkのコードスニペットは次のとおりです。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
namespace MovableForm
{
class winapi
{
public static void moveWindow(System.Windows.Forms.Form form){
SetWindowPos(form.Handle, (IntPtr) HWNDPOS.HWND_TOPMOST, form.Left + 10, form.Top + 10, form.Width - 20, form.Height - 20, (uint)SWP.SWP_SHOWWINDOW);
}
public static void setStyle(System.Windows.Forms.Form frm)
{
uint oldStyle = getStyle(frm);
uint newStyle = (uint)(
WINSTYLES.WS_OVERLAPPED | WINSTYLES.WS_POPUP | WINSTYLES.WS_VISIBLE |
//WINSTYLES.WS_SYSMENU | // add if you need a X to close
WINSTYLES.WS_CAPTION | WINSTYLES.WS_BORDER | //WINSTYLES.WS_DLGFRAME | WINSTYLES.WS_MAXIMIZEBOX |
WINSTYLES.WS_POPUPWINDOW);
int iRet = SetWindowLong(frm.Handle, (int)GWL.GWL_STYLE, (int)newStyle);
//if returned iRet is zero we got an error
int newExStyle = GetWindowLong(frm.Handle, (int)GWL.GWL_EXSTYLE);
newExStyle = (int)((uint)newExStyle - (uint) WINEXSTYLES.WS_EX_CAPTIONOKBTN); //remove OK button
iRet = SetWindowLong(frm.Handle, (int)GWL.GWL_EXSTYLE, (int)newExStyle);
moveWindow(frm);
frm.Refresh();
}
//great stuff by http://ideas.dalezak.ca/2008/11/enumgetvalues-in-compact-framework.html
public static IEnumerable<Enum> GetValues(Enum enumeration)
{
List<Enum> enumerations = new List<Enum>();
foreach (FieldInfo fieldInfo in enumeration.GetType().GetFields(
BindingFlags.Static | BindingFlags.Public))
{
enumerations.Add((Enum)fieldInfo.GetValue(enumeration));
}
return enumerations;
}
...
次に、使用した列挙型があります(すべてのキャストについて申し訳ありませんが、API呼び出しでフラグがintとして定義されている理由はわかりません)。
[DllImport("coredll.dll", SetLastError = true)]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("coredll.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
//non-fullscreen window (ex zDump) = WS_STYLE=0x90c9004, WS_EX_STYLE=0x00000008
//WS_POPUP | WS_VISIBLE
enum GWL:int{
GWL_STYLE = -16,
GWL_EXSTYLE = -20,
}
[Flags]
enum WINSTYLES:uint{
WS_OVERLAPPED = 0x00000000, //#define WS_OVERLAPPED WS_BORDER | WS_CAPTION
WS_POPUP= 0x80000000,
WS_VISIBLE= 0x10000000,
WS_MINIMIZE= 0x20000000,
WS_CLIPSIBLINGS= 0x04000000,
WS_CLIPCHILDREN= 0x02000000,
WS_DISABLED= 0x08000000,
WS_MAXIMIZE= 0x01000000,
WS_CAPTION = 0x00C00000, //#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
WS_BORDER= 0x00800000,
WS_DLGFRAME= 0x00400000,
WS_VSCROLL= 0x00200000,
WS_HSCROLL= 0x00100000,
WS_SYSMENU= 0x00080000,
WS_THICKFRAME= 0x00040000,
WS_MINIMIZEBOX= 0x00020000,
WS_MAXIMIZEBOX= 0x00010000,
WS_POPUPWINDOW= 0x80880000, // Creates a pop-up window with WS_BORDER, WS_POPUP, and WS_SYSMENU styles. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
}
enum WINEXSTYLES:uint{
WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_TOPMOST = 0x00000008,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_CONTEXTHELP = 0x00000400,
WS_EX_RIGHT = 0x00001000,
WS_EX_RTLREADING = 0x00002000,
WS_EX_LEFTSCROLLBAR = 0x00004000,
WS_EX_STATICEDGE = 0x00020000,
WS_EX_NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring
WS_EX_OVERLAPPEDWINDOW = 0x00000300, // (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
WS_EX_CAPTIONOKBTN = 0x80000000,
WS_EX_NODRAG = 0x40000000,
WS_EX_ABOVESTARTUP = 0x20000000,
WS_EX_INK = 0x10000000,
WS_EX_NOANIMATION = 0x04000000,
}
..。
[DllImport("coredll.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
enum SWP{
SWP_ASYNCWINDOWPOS = 0x4000,
SWP_DEFERERASE = 0x2000,
SWP_DRAWFRAME = 0x0020,
SWP_FRAMECHANGED = 0x0020,
SWP_HIDEWINDOW = 0x0080,
SWP_NOACTIVATE = 0x0010,
SWP_NOCOPYBITS = 0x0100,
SWP_NOMOVE = 0x0002,
SWP_NOOWNERZORDER = 0x0200,
SWP_NOREDRAW = 0x0008,
SWP_NOREPOSITION = 0x0200,
SWP_NOSENDCHANGING = 0x0400,
SWP_NOSIZE = 0x0001,
SWP_NOZORDER = 0x0004,
SWP_SHOWWINDOW = 0x0040,
}
enum HWNDPOS{
HWND_TOP = 0,
HWND_BOTTOM = 1,
HWND_TOPMOST = -1,
HWND_NOTOPMOST = -2,
}
}
}
うまくいけば、stackoverflowは近い将来いつかコードのアップロードを可能にします。
よろしく
ジョセフ
Windows Mobile の画面上でフォームを移動することはできません。また、画面の一部だけを使用することもできません。これは、Windows CE でのみ可能です。