精华内容
下载资源
问答
  • 摘要:VC/C++源码,系统相关,前台 本VC++.NET实例演示如何在程序中将其他窗口程序调至前台,示例截图如上所示。
  • 电子墙纸允许您在Windows中的墙纸和桌面图标之间插入窗口。 用户输入与窗口的交互是不可能的,因此,如果您希望构建桌面仪表盘应用程序(例如但使用Electron和NodeJS,则此模块非常适合。 应用范例 一个示例应用...
  • Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
  • Windows窗口程序设计入门(C#版)

    千次阅读 多人点赞 2018-05-05 13:13:04
    我简单说明一下我们要实现的功能:有两个窗体Form1和Form2,这两个窗体里面都有一个TextBox和一个Button。①当单击Form1里面的Button时,加载出Form2,同时Form2里的TextBox内容和Form1里的TextBox的内容一致;②当...

    这次用C#写个简单的窗口程序,这篇文章完全是面向新手的。

    我简单说明一下我们要实现的功能:

    有两个窗体Form1和Form2,这两个窗体里面都有一个TextBox和一个Button。

    ①当单击Form1里面的Button时,加载出Form2,同时Form2里的TextBox内容和Form1里的TextBox的内容一致;

    ②当单击Form2里面的Button时,销毁Form2,同时Form1里的TextBox内容变成Form2里TextBox的内容。

    我们启动VS,并绘制两个如下图所示的窗体


    绘制完成后,我们来到Form1.cs中,右击TextBox选择属性


    在弹出的窗口中将其Modifiers属性设置为public


    完成后也要将Form2的TextBox也进行同样的设置。只有这样两个窗体中的TextBox才可以相互“看得见”。

    设置完成后,我们便可以进行我们的代码设计了!

    首先我们来到Form1.cs中,双击Button1,进入代码设计窗口,我们可以看到VS已经帮我们把框架搭好了,直接上手就好喽!


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplicationTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 form_two = new Form2();
                //实例化Form2
                form_two.Show();
                //将实例化的对象显示出来
                form_two.textBox1.Text = this.textBox1.Text;
                //将Form1里TextBox的内容赋值给Form2里TextBox
            }
        }
    }

    这样我们运行一下,发现功能①已经可以实现了!


    下面继续实现②中的功能吧,我们选中Form2.cs,双击Button1,进入代码设计页面

    首次我们要先声明一个Form1的对象


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplicationTest
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            public Form1 form_one;
            //声明Form类变量
            private void button1_Click(object sender, EventArgs e)
            {
            }
        }
    }
    

    然后我们要回到Form1的代码设计窗口,为form_one赋值。


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplicationTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 form_two = new Form2();
                //实例化Form2
                form_two.Show();
                //将实例化的对象显示出来
                form_two.textBox1.Text = this.textBox1.Text;
                //将Form1里TextBox的内容赋值给Form2里TextBox
                form_two.form_one = this;
                //将form_one指向Form1窗口
            }
        }
    }

    然后我们再次回到Form2的代码设计界面,实现赋值和销毁功能


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplicationTest
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            public Form1 form_one;
            //声明Form类变量
            private void button1_Click(object sender, EventArgs e)
            {
                form_one.textBox1.Text = this.textBox1.Text;
                //将Form2里TextBox的内容赋值给Form1里TextBox
                this.Close();
                //将Form2销毁
            }
        }
    }
    运行一下,会发现我们的功能已经全部实现了!









    展开全文
  •     C语言Windows编程的主要工作:进行窗体设计、消息循环控制和窗口过程的处理。 图解:Windows编程模型... 最简单的windows程序也需要两函数 1|主函数int WINAPI WinMain(HINSTANCE hista...

        C语言Windows编程的主要工作:进行窗体设计、消息循环控制和窗口过程的处理。
    Windows编程模型图解

    图解:Windows编程模型图解
    #include	<windows.h>
    #include <tchar.h>
    /*
    	最简单的windows程序也需要两个函数
    	1|主函数int WINAPI WinMain(HINSTANCE histance,	HINSTANCE prevIstance,	LPSTR iCmdLine,	int iCmdShow);
    	2|窗口过程函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    */
    
    //2、回调函数,表示:窗口过程	
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//也可以写为:LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    
    //1、WinMain主函数
    int WINAPI WinMain(HINSTANCE histance, 
    					HINSTANCE prevIstance, 
    					LPSTR iCmdLine, 
    					int iCmdShow)
    {
    	HWND hwnd;//定义一个窗口句柄,用于保存所创建的窗口的句柄
    	MSG msg;//定义一个消息【本质上是一个结构体】
    	//【1】设计一个窗口的过程,5个步骤
    	/*窗体类(结构体)
    		typedef struct tagWNDCLASSW {
    		UINT        style;	  //窗口样式
    		WNDPROC     lpfnWndProc;//窗口过程
    		int         cbClsExtra;
    		int         cbWndExtra;
    		HINSTANCE   hInstance;
    		HICON       hIcon;
    		HCURSOR     hCursor;
    		HBRUSH      hbrBackground;
    		LPCWSTR     lpszMenuName;
    		LPCWSTR     lpszClassName;
    		}
    	*/
    		//1、设计一个窗口类[本质上是一个结构体],即:对窗口结构体中的各个成员变量的值进行设置
    	WNDCLASS wc;//创建一个窗口
    	wc.style = 0;//表示是用默认样式
    	wc.lpfnWndProc = (WNDPROC)WndProc;//设置窗口过程
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = histance;//实例句柄:设置为主函数参数
    	wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);//设置窗口图标
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);//设置鼠标指针
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//用画刷HBRUSH设置窗口颜色
    	wc.lpszMenuName = NULL;//设置菜单为空
    	wc.lpszClassName = "MyWndClass";//设置窗口名称
    		//2、注册窗口类
    	RegisterClass(&wc);//注册窗口类函数
    		//3、创建窗口:函数
    	hwnd = CreateWindow( TEXT("MyWndClass"), 
    						TEXT("Hello SDK Application"), 
    						WS_OVERLAPPEDWINDOW, 
    						CW_USEDEFAULT, 
    						CW_USEDEFAULT, 
    						CW_USEDEFAULT, 
    						CW_USEDEFAULT, 
    						NULL,//父窗口句柄
    						NULL,//窗口菜单句柄
    						histance, 
    						NULL);
    		//4、显示和更新窗口
    	ShowWindow(hwnd, iCmdShow);//显示窗口
    	UpdateWindow(hwnd);//更新窗口之后,则窗口可见
    		//5、消息循环【该过程中将消息传递给窗口过程,并由窗口过程进行此消息处理】
    	while (GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);//翻译一些特殊的消息
    		DispatchMessage(&msg);//转发消息给窗口过程,进行消息处理
    	}
    	return msg.wParam;//返回值为消息的成员
    }
    
    //回调函数:窗口过程的实现
    LRESULT CALLBACK WndProc(HWND hwnd,
    					UINT message, 
    					WPARAM wParam, 
    					LPARAM lparam)
    {
    	//【1】对各种消息进行处理:用选择结构对要处理的进行消息判断,并进行处理;未进去的消息可以不写,由Windows系统自动处理
    	switch (message)
    	{
    		case WM_PAINT:
    			return 0;
    		case WM_DESTROY://销毁/关闭窗口的消息
    			PostQuitMessage(0);//窗口关闭消息传递函数
    			return 0;
    		default:
    			break;
    	}
    	return DefWindowProc(hwnd, message, wParam, lparam);
    
    }
    

    结果:
    第一个Windows程序

    展开全文
  •  SendMessage 两个程序,一个Send,一个Receive,利用SendMessage函数实现两个程序窗口间的消息互发  代码中用到了StrUtils_Change1.bas模块,来自PSC,自已做了些许修改。主要是用到了wsprintf函数,对应于Win32...
  • 最近学习windows程序设计的创建窗口这方面的知识,有一些收获,现在将我所学到的内容记录下来,供大家参考。 本例将做一个类似txt文档窗口,可以对用户的键盘输入打印到该窗口上,并且有菜单栏可以单击菜单栏中的...

    0x00前言

    文章中的文字可能存在语法错误以及标点错误,请谅解;

    如果在文章中发现代码错误或其它问题请告知,感谢!

    0x01 概述

    最近在学习windows程序设计的创建窗口这方面的知识,有一些收获,现在将我所学到的内容记录下来,供大家参考。

    本例将做一个类似txt文档窗口,可以对用户的键盘输入打印到该窗口上,并且有菜单栏可以单击菜单栏中的退出来退出窗口。

    0x02 创建一个完整的窗口程序的步骤

    要想创建一个窗口程序,需要以下5个步骤:
    (1)注册窗口类(RegisterClassEX);
    (2)创建窗口(CreateWindowsEX);
    (3)在桌面上显示窗口(ShowWindow);
    (4)更新窗口客户区(UpdateWindow);
    (5)进入消息获取以及处理循环,直到获取的消息为WM_QUIT时,结束消息循环。

    下面分节介绍各步骤的代码实现。

    0x03 创建Win32工程

    我们一般练习时运行的程序都是使用控制台界面来接收和显示我们的运行结果,但是我们要想使用窗口界面与用户交互的话就应该创建Win32工程。

    选择“新建项目”,然后选择“已安装模板”和“Visual C++”,最后选择“Win32项目”。在“名称”框中,键入项目名称,例如“窗口程序”,然后单击“确定”:
    在这里插入图片描述
    在接下来的对话框中选择默认选项即可。

    进入到工程之后,发现.cpp文件里有写好的demo程序,我们为了练习,将这个demo程序代码全部注释掉或删掉,然后再继续进行。

    0x04 注册窗口类

    窗口类是系统在创建窗口时作为模板使用的属性集合。注册窗口类的API函数是ATOM RegisterClassEX(CONST WNDCLASSEXA *Ipwcx),其参数是WNDCLASSEXA结构体指针,该结构体定义了窗口的一些主要的属性,比如光标、图标、背景色和要处理的消息窗口函数等。
    WNDCLASSEXA结构体定义如下:

    typedef struct tagWNDCLASSEXA {
        UINT        cbSize;			//WNDCLASSEXA结构的大小
        UINT        style;				//从这个窗口类派生的窗口具有的风格
        WNDPROC     lpfnWndProc;		//即window procedure, 窗口消息处理函数指针
        int         cbClsExtra;		//指定紧跟在窗口类结构后的附加字节数
        int         cbWndExtra;		//指定紧跟在窗口事例后的附加字节数
        HINSTANCE   hInstance;			//本模块的实例句柄
        HICON       hIcon;				//窗口左上角图标的句柄
        HCURSOR     hCursor;			//光标的句柄
        HBRUSH      hbrBackground;	//背景画刷的句柄
        LPCSTR      lpszMenuName;		//菜单名
        LPCSTR      lpszClassName;	//该窗口类的名称
        HICON       hIconSm;			//小图标句柄
    } WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
    

    各字段含义在注释中已经说明,其中需要注意的是lpfnWndProc字段(即window procedure窗口程序,重要),该字段存放消息处理函数的指针,当窗口收到消息时windows会自动调用这个函数进行处理,处理内容由程序设计者自定,比如本例中当接收到键盘输入字符后就让它即时显示在窗口上。

    本例所填充的WNDCLASSEXA结构体如下:

    char szClassName[] = "MainWClass";
    WNDCLASSEX wndclass;							//定义的结构体名
    
    wndclass.cbSize = sizeof(wndclass);			//结构的大小
    wndclass.style = CS_HREDRAW | CS_VREDRAW;		//指定如果大小改变就重画
    wndclass.lpfnWndProc = MainWndProc;			//窗口的函数指针
    wndclass.cbClsExtra = 0;						//没有额外的类内存
    wndclass.cbWndExtra = 0;						//没有额外的窗口内存
    wndclass.hInstance = hInstance;				//句柄实例
    wndclass.hIcon = ::LoadIcon(hInstance, (LPSTR)IDM_EXIT);	//使用指定的图标
    wndclass.hCursor = ::LoadCursorA(NULL, IDC_ARROW);	//使用预定义光标
    wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//使用白色背景刷
    wndclass.lpszMenuName = (LPSTR)IDC_MY;			//使用指定的菜单
    wndclass.lpszClassName = szClassName;				//窗口类的名称
    wndclass.hIconSm = NULL;							//没有类的小图标
    

    其中wndclass.lpfnWndProc、wndclass.hIcon和wndclass.lpszMenuName,这三个字段我们不使用默认字段而是自己定义。三个字段含义分别是:窗口消息处理、指定窗口图标、指定窗口菜单。

    填充完该结构体之后,就可以使用RegisterClassEX函数进行注册:

    ::RegisterClassEX(&wndclass);
    

    0x05创建窗口

    创建窗口,调用CreateWindowEx()函数:

    	HWND hwnd = ::CreateWindowExA(
    		0,					//dwExStyle,扩展样式
    		szClassName,		//lpClassName,类名
    		NULL,				//lpWindowName,标题 
    		WS_OVERLAPPEDWINDOW,//dwstyle,窗口风格
    		CW_USEDEFAULT,		//X,初始x坐标
    		CW_USEDEFAULT,		//Y,初始y坐标
    		CW_USEDEFAULT,		//nWidth,宽度
    		CW_USEDEFAULT,		//nHeight,高度
    		NULL,				//hWndParent,父窗口句柄
    		NULL,				//hMenu,菜单句柄
    		hInstance,			//hInstance,程序实例句柄
    		NULL);				//lpParam,用户数据
    // lpParam,用户数据			
    
    

    该函数成功调用返回窗口句柄,若失败返回NULL。第4个参数指定了窗口标题栏、系统菜单、可以改变边框大小等。该参数也可以使用“|”来构建窗口的风格 ,例如将使用“WS_OVERLAPPEDWINDOW | WS_VSCROLL”该窗口将带有最大最小化以及垂直滚动条等风格。

    0x06 在桌面上显示

    在桌面上显示,则使用BOOL ShowWindow(HWND hWnd, int nCmdShow)函数。该函数用于指定窗口的显示状态,参数nCmdShow是系统传给WinMain函数的参数。如果窗口之前可见,则返回值为非零。如果窗口之前被隐藏,则返回值为零。
    本例中调用的ShowWindow():
    ShowWindow(hwnd, nCmdShow);

    0x07更新窗口客户区

    更新窗口客户区使用BOOL UpdateWindow(HWND hWnd );如果函数调用成功,返回值为非零值。如果函数调用不成功,返回值为零。如果指定的窗口更新区域不为空的话,则该函数会发送一个VM_PAINT消息(刷新窗口客户区)到窗口函数(Window Procedure)处理 。注意,所有消息都在WINUSER.H中被标识为数字:
    在这里插入图片描述

    0x08 进入无限消息循环

    经过前几个步骤之后,下面就应该进入无限循环等待用户的键盘鼠标输入。Windows中,每个线程都会被分配一个消息队列,当有一个输入发生后,Windows就会把用户的输入翻译成消息存放在消息队列中。使用GetMessage()函数可以从线程的消息队列中取出一个消息来填充MSG结构,例如:

    ::GetMessage(&msg, NULL, 0,0);
    

    MSG结构体定义:

    typedef struct tagMSG {
        HWND        hwnd;		//消息要发送的窗口句柄
        UINT        message;	//消息标识符,以WM_靠头的预定义值
        WPARAM      wParam;	//消息参数一
        LPARAM      lParam;	//消息参数二
        DWORD       time;		//消息放入消息队列的时间
        POINT       pt;		//这是一个POINT数据结构,标识消息放入消息队列时鼠标位置
    #ifdef _MAC
        DWORD       lPrivate;
    #endif
    } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
    

    GetMessage()函数从消息队列中取得的消息,如果不是WM_QUIT,则返回非0值,否则返回0。一般将GetMessage()函数加入while()中判断是否为FALSE,以确定是否结束消息循环:

    while(::GetMessage(&msg, NULL, 0, 0))
    {
    //处理逻辑
    }
    

    本例中需要把键盘输入的虚拟键消息转换为字符消息(WM_CHAR消息),所以还要使用::TranlateMessage()函数把上面填充后的MSG结构体“翻译”一下:

    ::TranslateMessage(&msg);
    

    然后使用DispatchMessage()函数将翻译后的消息分发到对应的窗口函数中(0x04小节中WNDCLASSEXA结构体实例中的MainWndProc):

    ::DispatchMessage(&msg);
    

    0x09 使用窗口函数进行消息处理

    前面的小节完成了窗口类注册、创建窗口、显示在屏幕上,整个程序已经进入消息循环,开始从消息队列中取消息,但是真正的工作是在窗口函数(本例的MainWndProc)中完成,该函数的作用就是对传进来的消息按照设计者的意愿进行处理,例如本例中将接收到键盘输入字符后让它即时显示在窗口上。
    通常在窗口函数中使用switch和case结构决定怎么处理消息。另外,窗口函数接收到的消息有很多,对于不关心的消息将它们传送至窗口函数中的DefWindowProc()函数处理。一般情况下,窗口函数中消息处理的结构如下:

    switch(uMsg)
    {
    	case WM_PAINT:
    		//处理WM_PAINT消息逻辑
    		return 0;
    	case WM_DESTROY;
    		//处理WM_DESTROY消息逻辑
    		return 0;
    	......
    }
    return ::DefWindowProc(hwnd, message, wParam, lParam);//交由windows默认处理
    		
    

    注意,必须要把不处理的消息交给DefWindowProc()处理,也要把该函数的返回值交给windows,否则windows失去了和应用程序通信的途径,系统不能再控制窗口行为。

    0x07小节中说明了VM_PAINT消息作用是刷新客户区,除了使用UpdateWindow()发送该消息之外,当出现窗口第一次创建、窗口大小改变、最小化窗口时,窗口函数等也会收到VM_PAINT消息。处理VM_PAINT消息时总以调用BeginPaint()函数开始,以ENDPaint()函数结束:

    hdc = ::BeginPaint(hwnd, &ps);
    //处理逻辑
    ::EndPaint(hwnd, &ps);
    

    当用户关闭窗口,窗口函数会受到一个VM_DESTROY消息,一般收到这个消息之后,设计者都会调用PostQuitMessage()函数响应此消息,该函数会向消息队列发送VM_QUIT消息。在0x08小节提过,当主函数中的GetMessage()函数如果从消息队列中收到VM_QUIT,则返回0值,从跳出while循环,执行接下的代码。

    同样在0x08小节中,键盘输入键码后会被TranslateMessage()函数转化为WM_CHAR消息,然后发送到窗口函数,当窗口函数收到WM_CHAR消息后,会把对应的字符添加到字符串变量中,然后使用InvalidateRect()函数使客户区无效,迫使windows再次发送WM_PAINT消息,这样字符就能显示在客户区中了。

    0x10 创建窗口的完整代码

    创建窗口的完整代码如下:

    #include "stdafx.h"
    #include<string.h>
    #include "第一个窗口程序.h"
    #include<string>
    
    //窗口函数的函数原型
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	char szClassName[] = "MianWClass";
    	WNDCLASSEX wndclass;
    
    	//用描述主窗口的参数填充WNDCLASSEX结构
    	wndclass.cbSize = sizeof(wndclass);			//结构的大小
    	wndclass.style = CS_HREDRAW | CS_VREDRAW;		//指定如果大小改变就重画
    	wndclass.lpfnWndProc = MainWndProc;			//窗口的函数指针
    	wndclass.cbClsExtra = 0;						//没有额外的类内存
    	wndclass.cbWndExtra = 0;						//没有额外的窗口内存
    	wndclass.hInstance = hInstance;				//句柄实例
    	//wndclass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);//使用预定义图标
    	wndclass.hIcon = ::LoadIcon(hInstance, (LPSTR)IDI_ICON2);
    	wndclass.hCursor = ::LoadCursorA(NULL, IDC_ARROW);//使用预定义光标
    	wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//使用白色背景刷
    	wndclass.lpszMenuName = (LPSTR)IDC_MY;			
    	wndclass.lpszClassName = szClassName;				//窗口类的名称
    	wndclass.hIconSm = NULL;							//没有类的小图标
    
    	//注册这个窗口类
    	::RegisterClassEx(&wndclass);
    
    	//创建主窗口
    	HWND hwnd = ::CreateWindowExA(
    		0,				//dwExStyle,扩展样式
    		szClassName,	//lpClassName,类名
    		NULL,//lpWindowName,标题 
    		WS_OVERLAPPEDWINDOW | WS_VSCROLL,//dwstyle,窗口风格
    		CW_USEDEFAULT,		//X,初始x坐标
    		CW_USEDEFAULT,		//Y,初始y坐标
    		CW_USEDEFAULT,		//nWidth,宽度
    		CW_USEDEFAULT,		//nHeight,高度
    		NULL,				//hWndParent,父窗口句柄
    		NULL,				//hMenu,菜单句柄
    		hInstance,			//hInstance,程序实例句柄
    		NULL);				//lpParam,用户数据
    
    	if(NULL == hwnd)
    	{
    		::MessageBoxA(NULL, "创建窗口出错", "error", MB_OK);
    		return -1;
    	}
    
    	//显示窗口,刷新窗口客户区
    	::ShowWindow(hwnd,nCmdShow);
    	::UpdateWindow(hwnd);
    
    	//从消息对列中取出消息,交给窗口函数处理,直到getmessage返回FALSE,结束消息循环
    	MSG msg;
    	while(::GetMessage(&msg, NULL, 0, 0))
    	{
    		//转化键盘消息
    		::TranslateMessage(&msg);
    		//将消息发送到相应的窗口函数
    		::DispatchMessageA(&msg);
    	}
    
    	//当GetMessage返回FALSE时结束
    	return msg.wParam;
    }
    
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	//str对象用于保存窗口客户区显示的字符串
    	static std::string str;
    	switch(message)
    	{ 
    		case WM_CREATE:
    			{
    				//设置窗口标题
    				::SetWindowTextA(hwnd, "最简陋的打字程序");
    				return 0;
    			}
    
    		case WM_COMMAND:
    			{
    				switch(LOWORD(wParam))
    				{
    					case IDM_EXIT:
    						{	
    							//向hwnd指定的窗口发送一个WM_CLOSE消息
    							::SendMessage(hwnd, WM_CLOSE, 0, 0);
    							break;
    						}
    				}
    
    		case WM_PAINT://窗口客户区需要重画
    			{
    				PAINTSTRUCT ps;
    
    				//使无效的客户区变的有效,并取得设备环境句柄
    				HDC hdc = ::BeginPaint(hwnd, &ps);
    
    				// 设置输出文本的背景颜色和文字颜色
    				::SetTextColor(hdc, RGB(255, 0, 0));  
    				::SetBkColor(hdc, ::GetSysColor(COLOR_3DFACE));
    				//显示文字
    				::TextOutA(hdc, 0, 0, str.c_str(), str.length());
    				::EndPaint(hwnd, &ps);
    
    				return 0;
    			}
    
    		case WM_CHAR:
    		{
    			// 保存ansi码
    			str = str + char(wParam);
    			
    			// 使整个客户区无效
    			::InvalidateRect(hwnd,NULL,0);
    			return 0;
    		}
    
    
    		case WM_DESTROY://正在销毁窗口
    			{	
    				//向消息队列投递一个WM_QUIT消息,初始GetMessage函数返回0,结束消息循环
    				::PostQuitMessage(0);
    				return 0;
    			}
    
    
    			}
    	}
    
    	//将我们不处理的消息交给系统做默认处理
    	return ::DefWindowProcA(hwnd, message, wParam, lParam);
    }
    
    

    需要注意的是本例中我们在程序里自定义了窗口的左上角图标,添加方法为
    右键“资源管理器栏”的“源文件”,选择“添加”和“资源”,选择“icon”后按“导入”把本地的.icon文件(可自行从网上下载.icon文件)导入到工程中:
    在这里插入图片描述在这里插入图片描述

    选择“资源管理器栏”的“第一个窗口程序.rc”文件,然后选择“Icon”文件夹,删掉以前的icon(因为我们是在demo程序下修改,该icon为demo程序的),将刚导入的icon通过右侧改ID号为“IDI_ICON2”:
    在这里插入图片描述
    最后进入到“第一个窗口文件.cpp”文件中将wndclass.hIcon = ::LoadIcon()第二个参数为IDI_ICON2:

    wndclass.hIcon = ::LoadIcon(hInstance, (LPSTR)IDI_ICON2);
    

    这样就将本地图标添加到程序中了。

    另外,本例中自定义了菜单,右键“资源管理器栏”的“源文件”,选择“添加”和“资源”,选择“Menu”后新建菜单:
    在这里插入图片描述

    接着,同样选择“资源管理器栏”的“第一个窗口程序.rc”文件,选择“Menu”文件夹,删掉以前的demo留下来的文件,将刚新建的menu通过右侧改ID号为“IDR_MENU1”:
    在这里插入图片描述

    双击“IDR_MENU1”,进入菜单制作场景,然后添加主菜单“文件”和子菜单“退出”,把退出的ID改为“IDM_EXIT”:
    在这里插入图片描述
    回到“第一个窗口文件.cpp”文件在case WM_COMMAND添加退出逻辑,这样在窗口运行的时候单击文件中的退出按钮窗口就会退出:

    case IDM_EXIT:
    {	
    	//向hwnd指定的窗口发送一个WM_CLOSE消息
    	::SendMessage(hwnd, WM_CLOSE, 0, 0);
    	break;
    }
    

    0x11运行结果

    在运行之前,需要修改项目属性的字符集为多字节,这样程序运行时不会出现"LPWSTR" 类型的实参与 “LPCSTR” 类型的形参不兼容问题:
    在这里插入图片描述运行结果:
    在这里插入图片描述

    在这里插入图片描述

    以上。
    参考文档:
    1.https://blog.csdn.net/u011583927/article/details/54896961
    2.https://blog.csdn.net/qq_32823595/article/details/79450832
    3.https://blog.csdn.net/NNNNNNNNNNNNY/article/details/46394207
    4.张铮,孙宝山,周立天.Windows程序设计(第3版)[M].北京;人民邮电出版社,2018.7.

    展开全文
  • 在窗口程序中打开控制台

    千次阅读 2018-04-06 21:14:03
    using System; using System.Runtime.InteropServices;...using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // 启动控制台 [DllImport("kernel32...
    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
    
        public partial class Form1 : Form
        {
            // 启动控制台
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public static extern bool AllocConsole();
    
            // 释放控制台
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public static extern bool FreeConsole();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                AllocConsole();
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                FreeConsole();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //输出时间和不同颜色
                Console.ForegroundColor =  ConsoleColor.Red;
                Console.WriteLine(@"[{0}]  {1}", DateTimeOffset.Now, "红色文本");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(@"[{0}]  {1}", DateTimeOffset.Now, "Hello! world.");
            }
        }
    }
    

    展开全文
  • 在一个窗口中将多个打开的应用程序或文档分组一起,将它们显示单独的选项卡中,以便更轻松,更快速地访问。本站发布的也有类似的工具,例如,WindowTabs 2018 中文版、Clover 中文版等等,它们都是 Windows 选项...
  • 在一个窗口中将多个打开的应用程序或文档分组一起,将它们显示单独的选项卡中,以便更轻松,更快速地访问。本站发布的也有类似的工具,例如,WindowTabs 2018 中文版、Clover 中文版等等,它们都是 Windows 选项...
  • 前提:必须知道另外一个进程的窗口句柄 示例(这里用QWidget举例,QWindow也一样的): 1、首先创建一个进程,创建一个顶级窗口“Proc 1 Window”并运行 #include "mainwindow.h" #include <QApplication...
  • vue中将按钮放在右边Recently Ubuntu joined Mac by moving the Minimize, Maximize, and Close Buttons to the left side of app windows. If this is a feature that you would also like to have in Windows, ...
  • Windows程序设计--文本输出()

    万次阅读 2015-10-21 23:10:45
    之前就写过,windows一个消息驱动的系统,有两种方式把各种事件通知给应用程序:1是把消息放在应用程序的消息队列中;2是向适当的窗口过程直接发送消息。 这里主要讨论的是WM_PAINT消息 ,以下任何一个事件发送,...
  • Saving the output of a Windows Command Promptcommand is a great way to get a nice neat copy to share with support staff, analyze longer outputs using your favorite text editor, or otherwise interact ....
  • 使用多个窗体搭建的程序,需要用到...2.窗口程序Form1.cs中将窗口实例化 3.直接引用子船体中的控件 方法二: Program里 建一个结构体;里面定义一个静态变量,这个变量FORM1 和FORM2 中可以...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    通过从 DispatcherObject 派生,您可以创建一个具有 STA 行为的 CLR 对象,并创建时获得一个指向调度程序的指针。 System.Windows.DependencyObject 生成 WPF 时使用的主要体系结构原理之一是首选属性而不是...
  • 它是一个开源操作系统,可以不同的硬件平台上运行。它为用户提供了免费的低成本操作系统。这是一个用户友好的环境,他们可以其中轻松修改和创建源代码的变体。 2.谁发明了Linux?解释Linux的历史? 回答:...
  • Linux:如何Linux中运行Windows程序

    万次阅读 2016-09-08 18:10:19
    本文以实例说明如何Linux中运行Windows程序
  • C# 创建Windows窗体应用程序(WinForm程序

    万次阅读 多人点赞 2019-06-10 09:57:09
    Windows窗体应用程序 WinForm 是 Windows Form 的简称,是基于 .NETFramework 平台的客户端(PC软件)开发技术,一般使用C#编程。 C# WinForm 编程需要创建「Windows窗体应用程序」项目。 .NET 提供了大量 ...
  • Windows程序设计-文本输出

    千次阅读 2016-07-30 22:21:35
    Windows利用这一机会给窗口过程发送第一个WM_PAINT消息。  1.窗口过程会接收到一个WM_PAINT消息的事件: 用户移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见;用户改变窗口的大小(如果窗口类风格...
  • 也可以已有连线上增加一个节点(Junction),从该节点引出新的连线,添加节点可以使用菜单Place/Junction,或者使用快捷键Ctrl+J。 进一步调整: (1)调整位置:单击选定元件,移动至合适位置; (2)改变标号...
  • 原来编译器是把这些东西编译成二进制和代码等生成了一个exe,也就是一个进程(一个exe程序其实就是个大的进程,你可以在windows的任务管理器里进行查看)。而之前需要代码中写明路径等等仅仅是为了编译器编译...
  • [VC++]控制台程序窗口隐藏

    千次阅读 2015-07-24 18:23:04
    HWND hWnd;   SetConsoleTITle("HEHE");   hWnd=::FindWindow(NULL,"HEHE");...当创建一个控制台程序时,又不想看到其窗口可用如下代码解决: #ifdef NDEBUG #pragma comment( linker, "/su
  • 对于 Windows 服务创建安装项目 本节描述如何创建 Windows 服务项目,以及如何使用已编译的安装项目来安装 Windows 服务。创建 Windows 服务项目启动 Microsoft Visual Studio。 文件 菜单上指向 ...
  • 点任务栏不切换窗口Since Windows 7, apps with multiple open windows are combined into a single taskbar button. Hovering over the button gives you a live thumbnail of every window and you can then click...
  • 也许你会说,很简单啊。用“::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW...前几天做了一个项目,我们的软件是对接体重秤的,有的时候需要刷卡(刷卡器扫描二维码),刷卡的实质其实接收的是键...
  • 一、简述Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,支持Linux、mac、solaris、windows。通俗一点来讲,我们可以借助Google breakpad来捕捉程序程序崩溃的错误报告。即在程序崩溃时会生成dump文件...
  • 在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。这种情况下,该句柄唯一地标识该程序,还需要它其它Windows函数呼叫中作为参数。 2.传给WinMain的第二个参数总是NULL。 3....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,500
精华内容 15,400
关键字:

在windows中将一个程序窗口