VC中控制台程序创建窗口的实例方法

在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像

#include "windows.h"
#include "TCHAR.h"

//声明自定义消息处理函数
LRESULT CALLBACK WindowProc(
	HWND hwnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
	);

int _tmain(int argc, _TCHAR* argv[])
{
	HINSTANCE hInstance;
	hInstance = GetModuleHandle(NULL);	//获取一个应用程序或动态链接库的模块句柄
	WNDCLASS Render_WND;
	Render_WND.cbClsExtra = 0;
	Render_WND.cbWndExtra = 0;
	Render_WND.hCursor = LoadCursor(hInstance, IDC_ARROW);	//鼠标风格
	Render_WND.hIcon = LoadIcon(hInstance, IDI_APPLICATION);	//图标风格
	Render_WND.lpszMenuName = NULL;	//菜单名
	Render_WND.style = CS_HREDRAW | CS_VREDRAW;	//窗口的风格
	Render_WND.hbrBackground = (HBRUSH)COLOR_WINDOW;	//背景色
	Render_WND.lpfnWndProc = WindowProc;	//【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc
	Render_WND.lpszClassName = _T("RenderWindow");	//【关键】该窗口类的名称
	Render_WND.hInstance = hInstance;	//【关键】表示创建该窗口的程序的运行实体代号

	RegisterClass(&Render_WND);

	HWND hwnd = CreateWindow(
		_T("RenderWindow"),           //【关键】上面注册的类名lpszClassName,要完全一致
		L"Zombie",  //窗口标题文字
		WS_OVERLAPPEDWINDOW, //窗口外观样式
		0,             //窗口相对于父级的X坐标
		0,             //窗口相对于父级的Y坐标
		320,                //窗口的宽度
		240,                //窗口的高度
		NULL,               //没有父窗口,为NULL
		NULL,               //没有菜单,为NULL
		hInstance,          //当前应用程序的实例句柄
		NULL);              //没有附加数据,为NULL  

	//去标题栏
	SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION);

	//去边框
	SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) & ~(WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME));

	// 显示窗口
	ShowWindow(hwnd, SW_SHOW);

	// 更新窗口
	UpdateWindow(hwnd);

	// 消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

// 自定义消息处理函数的实现
LRESULT CALLBACK WindowProc(
	_In_  HWND hwnd,
	_In_  UINT uMsg,
	_In_  WPARAM wParam,
	_In_  LPARAM lParam
	)
{
	switch (uMsg)
	{
	    case WM_DESTROY:
	    {
			PostQuitMessage(0);
			return 0;
	    }

		case WM_KEYDOWN:
		{
			if (wParam == VK_ESCAPE)//按Esc键退出
			{
				PostQuitMessage(0);
				return 0;
			}
		}
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

实例扩展:

#include <iostream>
#include <Windows.h>
using namespace std;

LRESULT CALLBACK __WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

	PAINTSTRUCT ps;
	HDC hdc;
	switch (msg) {
	case WM_CLOSE:
		MessageBox(NULL,"WM_CLOSE", "", NULL);
		break;
	default:
		break;
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);
}

int main()
{
	// 窗口属性初始化
	HINSTANCE hIns = GetModuleHandle(0);
	WNDCLASSEX wc;
	wc.cbSize = sizeof(wc);								// 定义结构大小
	wc.style = CS_HREDRAW | CS_VREDRAW;					// 如果改变了客户区域的宽度或高度,则重新绘制整个窗口
	wc.cbClsExtra = 0;									// 窗口结构的附加字节数
	wc.cbWndExtra = 0;									// 窗口实例的附加字节数
	wc.hInstance = hIns;								// 本模块的实例句柄
	wc.hIcon = NULL;									// 图标的句柄
	wc.hIconSm = NULL;									// 和窗口类关联的小图标的句柄
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;			// 背景画刷的句柄
	wc.hCursor = NULL;									// 光标的句柄
	wc.lpfnWndProc = __WndProc;							// 窗口处理函数的指针
	wc.lpszMenuName = NULL;								// 指向菜单的指针
	wc.lpszClassName = "LYSM_class";					// 指向类名称的指针

	// 为窗口注册一个窗口类
	if (!RegisterClassEx(&wc)) {
		cout << "RegisterClassEx error : " << GetLastError() << endl;
	}

	// 创建窗口
	HWND hWnd = CreateWindowEx(
		WS_EX_TOPMOST,				// 窗口扩展样式:顶级窗口
		"LYSM_class",				// 窗口类名
		"LYSM_title",				// 窗口标题
		WS_OVERLAPPEDWINDOW,		// 窗口样式:重叠窗口
		0,							// 窗口初始x坐标
		0,							// 窗口初始y坐标
		800,						// 窗口宽度
		600,						// 窗口高度
		0,							// 父窗口句柄
		0,							// 菜单句柄
		hIns,						// 与窗口关联的模块实例的句柄
		0							// 用来传递给窗口WM_CREATE消息
	);
	if (hWnd == 0) {
		cout << "CreateWindowEx error : " << GetLastError() << endl;
	}
	UpdateWindow(hWnd);
	ShowWindow(hWnd, SW_SHOW);

	// 消息循环(没有会导致窗口卡死)
	MSG msg = { 0 };
	while (msg.message != WM_QUIT) {
		// 从消息队列中删除一条消息
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
			DispatchMessage(&msg);
		}
	}

	cout << "finished." << endl;
	getchar();
end:

	getchar();
	return 0;
}

到此这篇关于VC中控制台程序创建窗口的实例方法的文章就介绍到这了,更多相关VC中控制台程序如何创建窗口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • VC中控制台程序创建窗口的实例方法

    在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像 #include "windows.h" #include "TCHAR.h" //声明自定义消息处理函数 LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hInstan

  • 易语言控制台程序调用窗口的组件详解

    最近有小伙伴问我,易语言的模块或者控制台程序怎么调用窗口的组件,现在我发经验,喜欢的关注哦,给大家解决了,大神不要喷 其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦.其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦. 而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型 向文本型啊,整数型啊都是一个类型,不过是原生的支持库的,科普完成向文本型啊,整数型啊都是一个类型,不过是原

  • 在VC中隐藏控制台程序窗口的实现代码

    下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的 /subsystem 选项该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver|efi_rom|efi_runtime_driver|native|posix|window

  • VC中使用ADO开发数据库应用程序简明教程

    本文实例讲述了VC中使用ADO开发数据库应用程序的方法.分享给大家供大家参考,具体如下: 一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据.ADO 最主要的优点是易于使用.速度快.内存支出少和磁盘遗迹小.ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量.高性能的接口.之所以

  • tc编译的dos程序和vc编译的win32控制台程序的异同

    它们有着本质的区别:1:一个是16的DOS程序,一个是标准的32的Windows应用程序.前者依然受着64KB内存分段约束,后者无忧无虑地使用着4GB内存地址空间.它们本来就是运行在不同的操作系统上的.别把他们混淆.DOS程序可以运行在windows上是因为有NTVDM.而你把VC生成的控制台程序放到DOS下只会得到!?This program cannot be run in DOS mode.2:如果你是用标准库编写的话,代码应该没多大差异的.但执行时调用库方式却差天共地.前者通过API模拟

  • 终于明白了tc编译的dos程序和vc编译的win32控制台程序的区别

    它们有着本质的区别:1:一个是16的DOS程序,一个是标准的32的Windows应用程序.前者依然受着64KB内存分段约束,后者无忧无虑地使用着4GB内存地址空间.它们本来就是运行在不同的操作系统上的.别把他们混淆.DOS程序可以运行在windows上是因为有NTVDM.而你把VC生成的控制台程序放到DOS下只会得到!?This program cannot be run in DOS mode.2:如果你是用标准库编写的话,代码应该没多大差异的.但执行时调用库方式却差天共地.前者通过API模拟

  • 在.NET Core控制台程序中如何使用依赖注入详解

    背景介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之间.类与类之间都是通过new一个对方的实例进行相互调用,这样在开发过程中有一个好处,可以清晰的知道在使用哪个具体的实现.随着软件体积越来越庞大,逻辑越来越复杂,当需要更换实现方式,或者依赖第三方系统的某些接口时,这种相互之间持有具体实现的方式不再合适.为了应对这种情况,就要采用契约式编程:相互之间依赖于规定好的契约(接口),不依赖于具体的实现.这样带来的好处是相互之间的依赖变得非常简单,又称松

  • vc控制台程序关闭事件时的处理方式及注意点详解

    百度可以找到很多关于这个问题解决的方法 关键控制台API函数:SetConsoleCtrlHandler 在支持C++ 11以上的编译器中,你可以这么做. SetConsoleCtrlHandler([](DWORD fdwctrltype)->BOOL { if (fdwctrltype == CTRL_CLOSE_EVENT) { // 你的善后代码... return TRUE; } return FALSE; }, TRUE); 最初这么做是很舒服的,但之后发现了问题: Windows控

  • Python中.py程序在CMD控制台以指定虚拟环境运行

    目录 1.问题背景 2.解决方法 2.1. 强制CMD控制台以指定虚拟环境运行.py程序 2.2. 添加环境变量 1.问题背景 Python之所以强大,不仅是因为该语言本身的特点,也是因为它拥有众多无所不能的第三方库.强大的软件库允许开发者专注于业务,避免重复构建轮子.然而,大量的软件库已经形成了复杂的依赖关系,Python 2和Python 3之间旷日持久的争端给使用Python开发的项目带来了很多麻烦.因此,Python建议通过虚拟环境工具为项目创建一个纯粹的依赖环境.相信大家电脑上都会有很

  • 解析VC中创建DLL,导出全局变量,函数和类的深入分析

    一.创建DLL1.在VC中新建一个Win32空项目MathLib:2.添加预编译头文件stdafx.h,定义导入导出控制符号: 复制代码 代码如下: //stdafx.h#pragma once#define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 复制代码 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexpor

随机推荐