精华内容
参与话题
问答
  • c#windows窗体程序设计

    千次阅读 多人点赞 2013-04-12 12:08:47
    一:windows窗体程序设计 (1)窗体创建的几种方式 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static ...

    一:windows窗体程序设计

    (1)窗体创建的几种方式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                //  Application.Run(new Form1());
                Form1 f1 = new Form1();
             
                Form2 f2 = new Form2();
                f2.Show();
                Form3 f3 = new Form3();
                f3.Show();
    
                Application.Run(f1);
            }
        }
    }
    

    (2)编写事件处理程序

    1、选中控件
    2、在“属性”窗口中单击“闪电”图标
    3、找到要处理的事件
    4、生成事件处理方法
    5、编写处理代码
    例:随鼠标移动,显示鼠标当前坐标
    点击选中窗体
    属性窗体中找到MouseMove事件
    双击事件生成事件处理程序框架
    编写代码
    private voidForm1_MouseMove(object sender, MouseEventArgs e ){
           this.Text = String.Format(“鼠标位置({0},{1})", e.X,e.Y ); }


    常用窗体事件

    Load  :窗体加载事件(即将显示尚未显示),常用作初始化功能
    Click事件:鼠标单击事件
    DoubleClick事件:鼠标双击事件
    MouseMove:鼠标移动事件
    KeyDown:键盘按下事件
    KeyUp:键盘释放事件
    小例子:单击窗体计1分,双击窗体计10分,编写程序,随时显示得分总数。
    定义变量n存储分数,初值为0
    单击事件clickn+1,并刷新
    双击事件DoubleClickn+10,并刷新
    private void Form1_Click(object sender, EventArgs e)
            {
                n += 1;
                string s = string.Format("得分{0}", n);
                this.Text = s;
    
            }
    
            private void Form1_DoubleClick(object sender, EventArgs e)
            {
                n += 10;
                string s = string.Format("得分{0}", n);
                this.Text = s;
    
            }




    (3)菜单控件
    设计学生管理菜单,注意菜单分隔条的设计
    实现“退出”功能
    关闭窗体,调用窗体类的Close方法 
    关闭当前窗体  this.Close( );

     private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                this.Close();
            }



    (4)消息框

    // 最简单的消息框
    MessageBox.Show( “消息内容" );
    // 带标题的消息框
    MessageBox.Show(“消息内容”, “标题");
    // 带标题、指定按钮的消息框
    MessageBox.Show消息内容”,  标题",   MessageBoxButtons.OKCancel );
    例:窗体上放一个按钮“发射核弹”,点此按钮后,访问用户,你确实要发射核弹吗?显示两个选项按钮:是、否。
    如果用户选择是,则提示:核弹已经发射,你将为你所作所为付出代价。
    如果用户选择否,则提示:你在最后关键时刻做出正确的抉择,避免了巨大损失。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                DialogResult r= MessageBox.Show("你确实要发射核弹吗?","请确认",MessageBoxButtons.YesNo);
                if (r == DialogResult.Yes)
                {
                    MessageBox.Show("核弹已经发射,你将为你所作所为付出代价","请确认");
    
                }
                else
                MessageBox.Show("你在最后关键时刻做出正确的抉择,避免了巨大损失。","请确认");
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                pictureBox1.Top -= 5;
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
    
            }
    
            private void pictureBox1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                pictureBox1.Left -= 5;
            }
    
            private void button5_Click_1(object sender, EventArgs e)
            {
                pictureBox1.Left += 5;
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                pictureBox1.Top += 5;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void 加数_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                double a, b, c;
                a = double.Parse(加数.Text);
                b = double.Parse(被加数.Text);
                c = a + b;
                和.Text = c.ToString();
            }
        }
    }
    

    运行图如下:这是多个实验的代码




    (5)使用窗体控件
    目录
    文本框TextBox
    单选框RadioButton和复选框CheckBox
    分组框GroupBox
    工具栏ToolStript和状态栏StatusStrip
    图片框PictureBox
    定时器Timer
    多文档用户界面MDI
    控件公用属性
    Visible:是否可见
    Enabled:是否可用
    Left:横坐标
    Top: 纵坐标
    Width:宽度
    Height:高度
    ---------------------------------------------------------------------
    文本框TextBox
    属性窗口中为控件命名(变量名)
    读取文本
    String s =textBox1.Text;
    显示文本
    textBox1.Text=“要显示的文字”;
    单选框RadioButton
    多选一,互斥
    是否选中:Checked属性
    如果选中则做某项工作
    if(radioButton1.Checked) …
    设置选中RadioButton
    radioButton1.Checked= true;

     private void button1_Click(object sender, EventArgs e)
            {
                if (radioButton1.Checked)
                    MessageBox.Show("恭喜你答对了", "请确定");
                else
                    MessageBox.Show("很遗憾你答错啦", "正确答案是鲸鱼");



    复选框CheckBox
    多个选项多选多
    是否选中:Checked属性
    如果选中则做某项工作
    if(checkBox1.Checked) …
    设置选中CheckBox
    checkBox1.Checked =true;
    例:调查业余爱好,并提示“你的业余爱好有……

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace cho5
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                /*string hobby = "";
                if (checkBox1.Checked)
                    hobby += checkBox1.Text + ",";
                if (checkBox2.Checked)
                    hobby += checkBox2.Text + ",";
                if (checkBox3.Checked)
                    hobby += checkBox3.Text + ",";
                if (checkBox4.Checked)
                    hobby += checkBox4.Text + ",";
                if (checkBox5.Checked)
                    hobby += checkBox5.Text + ",";
    
                MessageBox.Show("你的业余爱好有:" + hobby);
                 * 
                 */
                string hobby = "";
                CheckBox[] array = { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
                    for (int i = 0; i < array.Length; i++)
    			{
    			  if(array[i].Checked)
                     hobby+=array[i].Text+",";
    			}
    
                 MessageBox.Show("你的业余爱好有:" + hobby);
            }
        }
    }
    

    分组框GroupBox
    一个容器,用于组织分散的控件,使界面整齐美观。
    填写用户注册信息,分为2部分,基本信息和教育信息。
    问题:如果一个窗体上既有选择性别的RadioButton,又有选择学历的RadioButton,则它们之间如何实现正确的互斥?
    可用容器将不同RadioButton分组,例如GroupBox
    图片框PictureBox
    用于显示图片。
    常用属性:
    SizeMode:图片尺寸模式(缩放、拉伸等)
    常用方法:
    Load(“位置”)。 可从磁盘或网络上加载并显示一幅图片。
    定时器Timer
    用于周期性的执行任务。
    重要属性:
    Interval : 定时间隔,以毫秒为单位
    Enabled: 是否启动计时
    重要事件:
    Tick : 定时间隔到达
    int n = 10;
            private void timer1_Tick(object sender, EventArgs e)
            {
                n--;
                label1.Text = n.ToString();
               
            }


    定时器Timer
    例:导弹发射
    窗体底部,有个“发射”按钮,旁边一个PictureBox放一个导弹图片。
    点击“开始”,从10开始倒计时。
    倒计时到0时,导弹开始向上移动,直到移出窗体。
    用到的知识:
    控件的Left属性表示横坐标,Top属性表示纵坐标
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace cho5
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            int n = 10;
            private void timer1_Tick(object sender, EventArgs e)
            { 
                n--;
             
                label1.Text = n.ToString();
                if (n == 0)
                {
                    timer1.Enabled = false;
                    timer2.Enabled = true;
                }
    
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
    
            }
    
            private void pictureBox1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                timer1.Enabled = true;
            }
    
            private void timer2_Tick(object sender, EventArgs e)
            {
                pictureBox1.Top -= 10;
                if (pictureBox1.Top <= 0)
                    timer2.Enabled = false;
            }
        }
    }
    





    工具条ToolStrip

    用于在窗体(通常是顶部)显示工具栏。
    是一个容器,其中可包含多个工具栏按钮等控件。
    常用属性:
    ImageScalingSize 工具条上按钮图片缩放尺寸

    工具条

    例:设计一个服务器工具条,上有4个按钮:启动/继续、暂停、停止、退出
    按钮同时显示文字和图片
    图片缩放成32个像素大小
    各个按钮之间要实现互斥逻辑关系:即服务启动以后,启动按钮不可用,暂停、停止可用。停止后,停止、暂停不可用,启动可用。退出按钮永远可用。
    状态条StatusStrip
    状态条StatusStrip与工具条ToolStrip类似,但通常里面包含Label而非Button
    例:在状态条上显示当前时间,并实时刷新
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace cho6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
            {
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                toolStripButton1.Enabled = true;
                toolStripButton2.Enabled = false;
                toolStripButton3.Enabled = false;
    
            }
    
            private void toolStripButton4_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                toolStripButton1.Enabled = false; 
                toolStripButton2.Enabled = true;
                toolStripButton3.Enabled = true;
            }
    
            private void toolStripButton2_Click(object sender, EventArgs e)
            {
                toolStripButton1.Enabled = true;
                toolStripButton2.Enabled = false;
                toolStripButton3.Enabled = false;
            }
    
            private void toolStripButton3_Click(object sender, EventArgs e)
            {
                toolStripButton1.Enabled = true;
                toolStripButton2.Enabled = false;
                toolStripButton3.Enabled = false;
            }
    
            private void firstToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.MdiParent = this;
                f.Show();
            }
    
            private void secondToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Form3 f = new Form3();
                f.MdiParent = this;
                f.Show();
            }
        }
    }
    


    创建子窗体

    private void button1_Click_1(object sender, EventArgs e)
            {
                string s = "server=.;database=SampleDb;User Id=sa;Password=123;";
                SqlConnection c = new SqlConnection(s);
                c.Open();
                MessageBox.Show("数据库连接成功,接下来可以写数据啦");
                c.Close();
                     
            }





    展开全文
  • Windows窗体技术

    2017-10-31 03:52:47
    如果想其它窗体设置为主窗体,在主程序入口点Main()方法中修改窗体名即可 删除窗体 窗体的常用属性BackColor设置窗体背景颜色 BackgroundImage设置窗体的背景图片 Curcor 鼠标光标形状 鼠标放置窗体时光标会

    创建WinForm程序

    RAD
    这里写图片描述


    这里写图片描述


    这里写图片描述


    这里写图片描述


    窗体的添加与删除

    这里写图片描述


    这里写图片描述


    可以添加多个窗体

    这里写图片描述


    运行时只显示程序只显示一个主窗体

    这里写图片描述

    在项目中其它窗体都属于子窗体

    这里写图片描述


    如果想其它窗体设置为主窗体,在主程序入口点Main()方法中修改窗体名即可
    这里写图片描述


    删除窗体

    这里写图片描述


    窗体的常用属性

    这里写图片描述

    这里写图片描述


    BackColor设置窗体背景颜色
    这里写图片描述


    BackgroundImage设置窗体的背景图片

    这里写图片描述


    Curcor 鼠标光标形状
    鼠标放置窗体时光标会变化你设置的形状

    这里写图片描述


    MaximizwBox最大化按钮 MinimizeBox最小化按钮

    这里写图片描述

    HelpButton是否显示帮助按钮不能带最大化最小化同时显示

    这里写图片描述


    Icon窗体图标

    这里写图片描述


    MaximumSize可以调整到最大,大小的窗体、MinnimumSize可以调整到最小,大小的窗体

    这里写图片描述


    Name窗体的唯一标识名

    这里写图片描述

    这里写图片描述


    Text窗体标题

    这里写图片描述


    ShowIcon确定是否显示图标

    这里写图片描述


    ShowInTaskbar是否显示任务栏

    这里写图片描述


    Size窗体大小设定

    这里写图片描述


    StartPosition窗体启动是在电脑桌面的位置

    这里写图片描述


    TopMost是否居顶显示

    这里写图片描述


    窗体的常用事件

    这里写图片描述


    事件的查看方法

    这里写图片描述

    这里写图片描述


    添加事件方法

    这里写图片描述


    Load加载事件
    窗体运行完成即为加载,加载完成会触发事件

    这里写图片描述

    这里写图片描述


    Click点击事件

    这里写图片描述


    DoubleClick双击事件

    这里写图片描述


    FormClosed窗体关闭(窗体已经被关闭)

    这里写图片描述


    KeyDown键被按下的时候(某个按键)

    KeyUp释放按键

    KeyPress用户按下并释放某个按键会发生

    MouseClick鼠标点击

    MouseDoubleClick鼠标双击

    MouseDown鼠标键按下


    MouseHover鼠标光标悬停
    这里写图片描述


    MouseMove鼠标在窗体移动

    这里写图片描述


    窗体中添加控件与窗体显示和隐藏

    这里写图片描述


    添加控件的方法
    拖拉拽:

    这里写图片描述


    这里写图片描述


    添加控件的另一方法

    这里写图片描述


    代码输入减少垃圾代码提高大型项目的效率:

    这里写图片描述


    窗体的显示与隐藏

    这里写图片描述


    这里写图片描述


    MDI窗体

    这里写图片描述


    这里写图片描述


    再新建窗体
    这里写图片描述


    这里写图片描述


    这里写图片描述


    层叠
    这里写图片描述


    水平
    这里写图片描述


    垂直
    这里写图片描述


    关闭
    这里写图片描述


    窗体中控件的基本操作

    这里写图片描述


    通过属性调整大小:

    这里写图片描述


    通过代码调整大小
    这里写图片描述


    使其高宽与某个按钮相等

    这里写图片描述


    这里写图片描述


    也可以通过格式调整
    这里写图片描述


    顺序调整

    这里写图片描述


    这里写图片描述


    通过代码实现顺序调整
    这里写图片描述


    这里写图片描述


    这里写图片描述


    控件左中右对齐
    这里写图片描述


    控件顶中底对齐

    这里写图片描述


    垂直间距水平间距相等

    垂直间距相等

    这里写图片描述


    水平间距相等

    这里写图片描述


    项目下载

    展开全文
  • 创建Windows窗体

    2018-06-10 19:07:23
    需要探讨的是,在窗体背后,Windows 系统的工作。 Windows 窗体的构成部分     常规意义上的 Windows 窗体,由下列几个部分组成。     标题栏:窗口上方的鼠标拖动条区域。标题栏的左边有控制菜单的...

        开发 游戏的第一步,需要建立窗体。

        做出的空白窗体,并没有游戏的绘图系统,只是“建立了一个标准窗体”而已。需要探讨的是,在窗体背后,Windows 系统的工作。

    Windows 窗体的构成部分

        常规意义上的 Windows 窗体,由下列几个部分组成。

        标题栏:窗口上方的鼠标拖动条区域。标题栏的左边有控制菜单的图标,中间显示的是程序的标题。

        菜单栏:位于标题栏的下面,包含很多菜单,涉及的程序所负责的功能不一样,菜单的内容也不一样。比如有些有文件菜单,有些就没有,有一些窗体甚至根本就没有菜单栏。

        工具栏:位于菜单栏的下方,工具栏会以图形按钮的形式给出用户最常使用的一些命令。比如,新建、复制、粘贴、另存为等。

        工作区域:窗体的中间区域。一般窗体的输入输出都在这里面进行,比如子窗体显示、层叠,在工作区域的子窗体内进行文字编辑等等。游戏的图形图像就在此处显示。

        状态栏:位于窗体的底部,显示运行程序的当前状态。通过它,用户可以了解到程序运行的情况。

        滚动条:如果窗体中显示的内容过多,不管横向还是纵向,当前可见的部分不够显示时,窗体就会出现滚动条,分为水平滚动条与垂直滚动条两种。

        窗体缩放按钮:窗体的缩放按钮在右上角,在窗体编程中属于 System 类目。这些缩放按钮依次为最小化、最大化和关闭按钮。

        下面试一张标准的 Windows 窗体截图。
    这里写图片描述
        窗体结构的说明:

    typedef struct tagWNDCLASSEX {
      UINT      cbSize; // 结构体大小,等于 sizeof(WNDCLASSEX)
      UINT      style;  // 窗体的风格
      WNDPROC   lpfnWndProc; // 窗体函数指针
      int       cbClsExtra;  // 附加在窗体类后的字节数,初始化是零
      int       cbWndExtra;  // 附加在窗体实例化的附加字节数。系统初始化是零,如果一个应用程序使用 WNDCLASSEX 注册一个通过在资源中使用 CLASS 指令建立的对话框时,必须把这个成员设成 DLGWINDOWEXTRA。
      HINSTANCE hInstance; // 该对象的实例句柄
      HICON     hIcon;     // 该对象的图标句柄
      HCURSOR   hCursor;   // 该对象的光标句柄
      HBRUSH    hbrBackground; // 该对象的背景刷子
      LPCTSTR   lpszMenuName;  // 菜单指针
      LPCTSTR   lpszClassName;  // 类名指针
      HICON     hIconSm;       // 与窗体关联的小图标,如果这个值为 NULL,那么就把 hIcon 转换为大小比较合适的小图标
    } WNDCLASSEX, *PWNDCLASSEX;

    使用 C/C++ 编写 Windows 窗体

    #include <windows.h>
    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
    char szClassName[ ] = "WindowsApp";
    int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
    
     {
        HWND hwnd;               /* 指向我们窗体的句柄 */
        MSG messages;            /* 保存发往应用的消息 */
        WNDCLASSEX wincl;        /* 前面详细介绍过的 WNDCLASSEX 结构的对象 */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      
        wincl.style = CS_DBLCLKS;                
        wincl.cbSize = sizeof(WNDCLASSEX);

        给 WNDCLASSEX 结构对象赋值。

    /* 使用默认图标以及鼠标指针 */
        wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL; /* 没有菜单栏 */
        wincl.cbClsExtra = 0;                      /* 没有多余的字节跟在窗体类的后面 */
        wincl.cbWndExtra = 0;                      
        wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
        if(!RegisterClassEx(&wincl)) return 0;

        代码在窗口过程调用函数的时候,将地址赋值给 lpfnWndProc,然后呼叫 RegisterClassEx(&wincl) 注册窗口类,系统就拥有了窗口过程函数的地址。如果注册失败,则返回 0。

    hwnd = CreateWindowEx( 0,            /* 扩展风格为 0*/                               
               szClassName,         /* 类名 */
               "Windows App",         /* 窗体抬头标题 */
               WS_OVERLAPPEDWINDOW, /* 默认窗体 */
               CW_USEDEFAULT,       /* 让操作系统决定窗体对应 Windows 的 X 位置在哪里 */
               CW_USEDEFAULT,       /* 让操作系统决定窗体对应 Windows 的 Y 位置在哪里 */
               544,                 /* 程序宽度 */
               375,                 /* 程序高度 */
               HWND_DESKTOP,        /* 父窗体的句柄,父窗体定义为 Windows 桌面,HWND_DESKTOP 是系统定义的最顶层的托管的窗体 */
               NULL,                /* 没有菜单 */
               hThisInstance,       /* 程序实例化句柄 */
               NULL                 /* 指向窗体的创建数据为空 */
               );
        ShowWindow(hwnd, nFunsterStil);
        /* 要显示窗体,使用的是 ShowWindow 函数 */
        while(GetMessage(&messages, NULL, 0, 0))
        {      
               TranslateMessage(&messages);
               DispatchMessage(&messages);    
        }
        return messages.wParam;
    }

        建立并显示窗体,在循环内将虚拟键消息转换为字符串消息,随后调度一个消息给窗体程序。

    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* 指向消息的句柄 */
        {
               case WM_DESTROY:
               PostQuitMessage(0);        
               break;
               default:                   
               return DefWindowProc(hwnd, message, wParam, lParam);
    
        }
        return 0;
    }

        最后是消息处理。当窗体程序接收到某些操作的时候,比如键盘、鼠标等等,就会呼叫 DispatchMessage(&messages);函数将消息回调给系统,系统通过注册的窗口类得到函数指针并且通过函数指针调用函数对消息进行处理。

         MoveWindow,就是移动已经建立的窗体。MoveWindow 函数用来改变窗口的位置和尺寸,如果窗体本身就按照计算机的屏幕对齐左上角,对于窗体内的子窗体,就对齐父窗体的左上角。

    BOOL MoveWindow( HWND hWnd,/* 窗体句柄 */
             int x,  /* 窗体左上角起点 x 轴 */
             int y,  /* 窗体左上角起点 y 轴 */
             int nWidth, /* 窗体宽度 */
             int nHeight, /* 窗体高度 */
             BOOL bRepaint = TRUE /* 是否重新绘制,如果是 true 系统会发送 WM_PAINT 到窗体,然后呼叫 UpdateWindow 函数进行重新绘制,如果是 false 则不重新绘制 */

        MoveWindow 会给窗体发送 WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE 和 WM_NCCALCSIZE 消息。

        类似的功能还有 SetWindowPos,SetWindowPos 功能更强大,可以设置更多的参数。

        目前只是建立了一个 Windows 的窗体,并不能直接编写游戏。

        OpenGL 并不附带任何关联窗体的编程,所以如果你使用的是 OpenGL 的接口来编写代码,稍微修改一下,这些窗体就能成为游戏屏幕窗体。

        游戏所有的内容都是在一个循环内完成的,即所有的绘图、线程、操作、刷新,都在一个大循环内完成。

    while(GetMessage(&messages, NULL, 0, 0))
      {
          TranslateMessage(&messages);
          DispatchMessage(&messages);
      }

        在这个 while 循环中,消息的派发都在此完成。游戏也一样,所有游戏内的代码几乎都在循环内完成。可以想象一个循环完成一个大的绘制过程,第二个循环刷新前一次绘制过程,最终类似电影一样,完成整个动画的绘制以及不间断的操作。

        在建立 Windows 窗体的时候,程序会从入口函数 WinMain 开始运行,定义和初始化窗体类,然后将窗体类实例化,随后进行消息循环获取消息,然后将消息发送给消息处理函数,最后做出相应的操作。

        使用脚本语言的方式编写窗体,只需要定义坐标、位置和窗体名称即可。

    展开全文
  • Windows窗体

    2016-01-21 14:40:05
    一些函数 HPEN CreatePen(int fnPenStyle,int nWidth, COLORREF crColor); 创建画笔 HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); 选择对象 HBRUSH CreateSolidBrush(COLORREF crColor);...

    匈牙利表示法

    • 在变量前添加表示变量类型的字母前缀,并继以一个大写字母开头的对变量的简短描述

      Item Value
      sz 指向一个以零字符结尾的字符串中的第一个字符
      str 字符串
      i int
      d double
      by byte
      l long
      p pointer
      lp long pointer
      n 数或int
      ui unsigned int
      c char
      w WORD(unsigned short)
      dw DWORD(unsigned long)
      fn 函数指针
      lpstr 指向字符串的long pointer
      h 句柄
      m_ 类成员
      g_ 全局类型
      hwnd 窗口句柄

      | hdc | Windows设备上下文(device context)的句柄 |

    第一个窗口

    • 需要填充一个WNDCLASSEX 结构
    WNDCLASSEX  winclass;
    winclass.cbSize     = sizeof(WNDCLASSEX);
    //这个赋值很重要,在下面create的时候,用
    winclass.lpszClassName = g_szWindowClassName;
    //...填充过程不写了
    
    //注册window类
    if(!RegisterClassEx(&winclass)){
        MessageBox(NULL, "Class Registation Failed!", "Error", 0);
        return 0;
    }
    
    hWnd = CreateWindowEx(NULL,
                          g_szWindowClassName,//这里和注册联系起来
                          g_szApplicationName,
                          WS_OVERLAPPENDWINDOW,
                          0,0,
                          WINDOW_WIDTH,
                          WINDOW_HEIGHT,
                          NULL,
                          NULL,
                          hInstance,//程序的实例句柄,从主函数传来
                          NULL);
    //使窗口可见
    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);
    
    //在退出程序的时候,撤销注册的类
    UnregisterClass(g_szWindowClassName, hInstance);
    
    //---------------------------------------------------------
    //-------------消息循环--------------------------------------
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    bool bDone = false;
    MSG msg;
    while(!bDone){
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
            if(msg.message == WM_QUIT){
                bDone = true;
            }else{
                TranslateMessate(&msg);
                DispatchMessage(&msg);
            }
        }
        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
    }
    //---------------------------------------------------------
    //---------------------------------------------------------
    
    //------------绘图-------------------------
    case WM_PAINT:{
        PAINTSTRUCT ps;
        HDC hdc;         //设备描述表
    
        //填充ps,返回hdc(= ps.hdc)
        hdc = BeginPaint(hwnd, &ps);
        //...
        EndPaint(hwnd, &ps);//这里自动释放了hdc
        return 0;
    }
    
    //======================================================
    //函数原型
    BOOL UnregisterClass(
        LPSTSTR    lpClassName,//注册时指定的名字
        HINSTANCE  hInstance
    );
    //创建窗口,函数原型
    HWND CreateWindowEx(DWORD   dwExStyle,
                        LPCTSTR lpClassName,
                        LPCTSTR lpWindowName,
                        DWORD   dwStyle
                        int     x,
                        int     y,
                        int     nWidth,
                        int     nHeight,
                        HWND    hWndParent,
                        HMENU   hMenu,
                        HINSTANCE hInstance,
                        LPVOID  lpParam
                        );
    
    • 创建双缓冲
    /* 创建一个与显示DC兼容的内存设备描述表,使用NULL作为参数的时候
     * 默认创建一个与当前屏幕兼容的DC。但当内存设备描述表被创建出来时
     * 它是单色的,并且宽度和高度各为一个像素,因此在开始使用时,要创建
     * 一张大小和格式与前置缓冲完全一致的位图,并利用selectObject函数
     * 将其选入内存DC
     */
    HDC hdcBackBuffer = CreateCompatibleDC(NULL);
    
    //创建位图
    HDC hdc = GetDC(hwnd);
    HBITMAP hBitmap = 
    CreateCompatibleBitmap(hdc, cxClient, cyClient);
    
    HBITMAP hOldBitmap = 
    (HBITMAP)SelectObject(hdcBackBuffer, hBitmap);
    
    //释放DC
    ReleaseDC(hwnd, hdc);
    
    /* -------使用后备缓冲--------------
     * 1.清除后备缓冲--通常采用背景色填充
     * 2.在后备缓冲的hdc绘图、写字
     * 3.将后备缓冲中的内容复制到前台缓冲
     */
    //后备缓冲填充白色
    BitBlt(hdcBackBuffer, 0, 0, cxClient, cyClient, NULL, NULL, NULL, WHITENESS);
    //绘图...
    
    //将后备缓冲区的内容传送到显示缓冲区
    BitBlt(ps.hdc, 0, 0, cxClient, cyClient, hdcBackBuffer, 0, 0, SRCCOPY);
    
    
    
    HBITMAP CreateCompatibleBitmap(
        HDC    hdc,       //DC句柄
        int    nWidth,    //
        int    nHeight
    );
    
    //BitBlt函数原型,通常用来将后备缓冲中的所有bit复制到显示内存区
    BOOL BitBlt(
        HDC hdcDest,
        int nXDest,
        int nYDest,
        int nWidth,
        int nHeight,
        HDC hdcSrc,
        int nXSrc,
        int nYSrc,
        DWORD dwRop
    );  
    
    展开全文
  • Windows窗体应用程序设计小一

    千次阅读 2019-01-07 23:50:06
    一,windows 窗体应用程序是由控件组成的,控件是可以重复使用的类或组件 MessageBoxButtons枚举值及其说明 成员名称 说明 MessageBoxButtons.AbortRetryIgore 消息框包含“终止”,“重试”,...
  • 深入Windows窗体原理及控件重绘技巧

    万次阅读 多人点赞 2013-12-29 13:46:35
    之前有学MFC的同学告诉我觉得Windows的控件重绘难以理解,就算重绘成功了还是有些地方不明白,我觉得可能很多人都有这样的问题,在这里我从Windows窗体的最基本原理来讲解控件的WM_DRAWITEM重绘和子类化重绘,如果你...
  • Winform之认识Windows窗体

    千次阅读 2015-04-19 19:12:54
     Windows窗体(简称Winform)是一个可以用来提供信息以及接受其输入的窗口。通常情况下,通过向窗体上添加控件并开发对用户操作的响应,生成Windows窗体应用程序。“控件”是显示数据或接受数据输入的相对独立的用户...
  • Windows窗体应用程序 WinForm 是 Windows Form 的简称,是基于 .NETFramework 平台的客户端(PC软件)开发技术,一般使用C#编程。 C# WinForm 编程需要创建「Windows窗体应用程序」项目。 .NET 提供了大量 ...
  • C# windows窗体抽奖系统

    2014-09-09 21:23:48
    C#开发的windows窗体应用程序,随机抽奖系统,并列出获奖名单
  • C#Windows窗体界面设计_07_多窗体设计

    千次阅读 2013-10-20 19:05:16
    2013-10-20 需要在前面的项目上进行较大的修改。 前面的项目: ... 本节的内容是:添加一个子窗口,用于设置绘图点数POINTCNT和放大倍数。同时,在状态栏添加两个显示...1. 为项目添加子窗体 打开项目TriPaint_20131013
  • C#windows窗体猜数字小游戏

    热门讨论 2011-07-05 11:52:29
    windows窗体开发的猜数字小游戏,休闲,益智。
  • C#windows窗体,,计算器

    千次阅读 2018-12-13 15:29:59
    C#windows窗体,,计算器 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的...
  • C#Windows程序有一个主程序,此主程序会加载创建的窗体Form1,而Form1窗体 的控件设计例如样式、位置和本身的创建都会在Form1.design.cs文件中,而Form1的 显示效果会在Form1[设计窗体]文件中,而Form1的所有控件所...
  • c# Windows窗体应用程序设计(三) 今天继续来更新基础的应用,综合设计小游戏正在整理中。通过这样的方式一来是反复巩固自己所学的东西,二是为了让想学习编程的小白或者编程爱好者能简单的上手应用制作一些窗体。 ...
  • c# Windows窗体应用程序设计(四)

    千次阅读 2020-04-21 10:52:17
    c# Windows窗体应用程序设计(四) 上次介绍的简单应用其中第二个窗体运行结果如下: 我相信肯定有比我做得更好的小伙伴,关于上次第二个窗体设计有疑问的可以在下方留言,欢迎讨论。 今天来介绍两个简单应用,树...
  • C# Windows窗体学习 一: Windows窗体的建立 C# Windows窗体学习 二:Windows窗体常用属性 C# Windows窗体学习 三:工具的添加① C# Windows窗体学习 四:工具的添加② C# Windows窗体学习 五:工具的添加③ 前面...
  • c# Windows窗体应用程序设计综合实例(一)匹配游戏设计 上次的计时器运行效果图如下: = ------------------------------------------------------------------------------ 今天来分享一个综合实例,设计一个匹配...
  • c# Windows窗体与事件驱动

    千次阅读 2017-05-23 04:16:22
    项目类型:Visual C#项目 模板:Windows 应用程序 熟悉开发环境窗体的常用属性窗体的属性非常多, 以下是常用的几个。 Name: 窗体对象的名字,类似于变量名字。 Text:窗体标题栏显示的文字 MaximizeBox:是否最大化 ...
  • Author: binzhouweichao@163.com Copyright (c) 2013, Liu Xiaojian@BIT, All Rights ... 建立Windows窗体项目,命名为AttackDecision。 1.主窗体 Form1更名为MainForm。 修改的属性如下: (Name) MainForm Size
  • c# Windows窗体应用程序设计(五) 本次来介绍时钟控件、日历控件和MDI窗口。 1.时钟控件和日历控件 1.新建项目 1.新建一个名为时钟和日历控件的项目,再将Name属性改为FormCalendar。 2.添加控件 所要添加的控件及...
  • c#windows窗体程序打包

    2020-03-14 12:47:15
    为了将所编写的程序打包,让用户方便操作,无需编译环境,就像我们平时使用的app 1。首先,打开你编写好的程序 2。文件----新建----新建项目--其他项目类型--Visual Studio Installer-安装项目---命名 ...
  • C# Windows窗体应用程序设计 简易实例操作(一) 大家好,这是我第一次写博客。写这个的目的一来是为了巩固自己所学的东西,二是希望通过简单的例子来激发对编程学习的热情,互相促进学习。在后面我也会更新其他的...
  • C#windows窗体应用程序

    2016-06-16 05:21:31
    新手做课程设计,求哪位大神帮忙看一下 private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == "") MessageBox.Show("帐号不能为空"); else { conn = new SqlConnection(connString...
  • 当编写一个典型的Windows 窗体程序时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关联的代码...
  • File类支持对文件的基本操作,包括对文件创建、复制、删除、移动和打开灯静态方法,并协助创建FileStream对象。其为静态类,它对应的这个文件系统进行操作,方法均为静态方法。属性:DerictoryName绝对路径名、...
  • C#windows窗体应用程序做界面十分轻松,但是系统默认是没有让控件跟随窗体的大小改变而已改变的。所以需要我们手动去设置让窗体控件随着窗体的大小改变而改变。所以我们只需要将控件选择 然后把Anchor属性给...
  • Visual Stutio 2010 C#开发环境 五点作图绘制三角函数,以正弦函数为例,选取一个周期[0, 2π]上的五个特殊的点,也就是横坐标0, π/2, π, 3π/2, 2π这五个点...文件-->新建-->项目,选择Windows窗体应用程序,项
  • 比如我们想隐藏一段文字然后,触发谋事件后显现 我们可以选择label组件,然后在其text栏打入“文字” 隐藏的方法是,将属性栏visible属性从True改为false, 那么显示时就会隐藏了 ...如果我们需要指定事件让其...
  • 1.创建一个windows窗体 2.点击按钮,创建点击事件,后台连接数据库查询 详细代码: 需要导入引用文件:MySql.Data.dll 在头部using一下引用文件:using MySql.Data.MySqlClient; private void button2_Click...

空空如也

1 2 3 4 5 ... 20
收藏数 128,831
精华内容 51,532
关键字:

windows窗体