欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-01 13:30:56
在vc控制台程序中调用d3dvideorender时,需要创建新的窗口控件显示图像#include "windows.h"#include "tchar.h" //声明自定义消息处理函数lresult...

在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中控制台程序如何创建窗口内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!