一个简单的 C# 语言编写的 WIN32 程序

刚k始学习 C / C++ / windows 编程时接触的经典 demo 程序, 今日拿来用 C# 玩耍了一下.

其实用 C# 编写 win32 窗口和控件的小型 wrapper 类库也无不可.

Delphi 的 VCL 可以拿来做参照.

代码备忘:


using System;
using System.Runtime.InteropServices;
/**
 * zYg - Dobzhansky 2009-8-19 20:58
 */
namespace demo
{
  class program
  {
    static void Main()
    {
    	// 初始化窗口类结构
      WNDCLASS wc = new WNDCLASS();
      wc.style = 0;
      wc.lpfnWndProc = SplashWindowProcedure;
      wc.hInstance = GetModuleHandle(null);
      wc.hbrBackground = (IntPtr)6;
      wc.lpszClassName = "CSharpWindow";
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hIcon = IntPtr.Zero;
      wc.hCursor = IntPtr.Zero;
      wc.lpszMenuName = null;
      // 注册窗口类
      RegisterClass(wc);
      // 创建并显示窗口
      IntPtr hwnd;
      hwnd = CreateWindowEx(0,
        "CSharpWindow",
        "欢迎你来搞",
        (int)WS_STYLE.WS_OVERLAPPEDWINDOW,
        -1, -1, 400, 300,
        IntPtr.Zero, IntPtr.Zero, GetModuleHandle(null), null);
      ShowWindow(hwnd, 1);
      UpdateWindow(hwnd);
      // 进入消息循环
      MSG msg = new MSG();
      while (GetMessage(ref msg, IntPtr.Zero, 0, 0))
      {
        TranslateMessage(ref msg);
        DispatchMessage(ref msg);
      }
    }
    // 窗口过程
    static int SplashWindowProcedure(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam)
    {
      switch (msg)
      {
        case WM_DESTROY:
          PostQuitMessage(0);
          break;
      }
      return DefWindowProc(hwnd, msg, wParam, lParam);
    }
  	[Flags]
  	public enum WS_STYLE:long
  	{
			WS_OVERLAPPED   =    0x00000000L,
			WS_CAPTION      =    0x00C00000L ,    /* WS_BORDER | WS_DLGFRAME  */
			WS_SYSMENU      =    0x00080000L,
			WS_THICKFRAME   =    0x00040000L,
			
			WS_MINIMIZEBOX  =    0x00020000L,
			WS_MAXIMIZEBOX  =    0x00010000L,
			
			WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED     | 
                             WS_CAPTION        | 
                             WS_SYSMENU        | 
                             WS_THICKFRAME     | 
                             WS_MINIMIZEBOX    | 
                             WS_MAXIMIZEBOX),
    }
    public const int WM_DESTROY = 2;
    public const int WM_CLOSE = 0x10;
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetModuleHandle(string moduleName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr RegisterClass(WNDCLASS wc);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr CreateWindowEx(int dwExStyle, string lpszClassName, string lpszWindowName, int style, int x, int y, int width, int height, IntPtr hWndParent, IntPtr hMenu, IntPtr hInst, [MarshalAs(UnmanagedType.AsAny)] object pvParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool UpdateWindow(IntPtr hWnd);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool GetMessage(ref MSG msg, IntPtr hwnd, int minFilter, int maxFilter);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool TranslateMessage(ref MSG msg);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int DispatchMessage(ref MSG msg);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern void PostQuitMessage(int nExitCode);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class WNDCLASS
    {
      public int style = 0;
      public WNDPROC lpfnWndProc = null;
      public int cbClsExtra = 0;
      public int cbWndExtra = 0;
      public IntPtr hInstance = IntPtr.Zero;
      public IntPtr hIcon = IntPtr.Zero;
      public IntPtr hCursor = IntPtr.Zero;
      public IntPtr hbrBackground = IntPtr.Zero;
      public string lpszMenuName = null;
      public string lpszClassName = null;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct MSG
    {
      public IntPtr hwnd;
      public int message;
      public IntPtr wParam;
      public IntPtr lParam;
      public int time;
      public int pt_x;
      public int pt_y;
    }
    public delegate int WNDPROC(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值