Visual C++ 6.0 开发win32 窗口程序 -- 学习(1)

由于要开发MapGIS程序,版本67对应的SDK通常用VC6.0来开发,因此索性重新学习一下VC6.0开发C++程序,MFC什么的都挺老的了,但还真没学过,也可以试一下。

首先就是先安装VC6.0 在WINDOWS 7下有一点兼容性问题,CSDN博客有很多解决方案,搜索一下即可解决。编译是没啥问题的。

其次就是学习windows api 的helloworld程序了!

找的教材是《VC++面向对象与可视化程序设计》第二版和第四版,黄维通编著。这是一本经典的老教材,估计很多院校学生都学过。

第三章:开始讲述windows应用程序的基本架构,这里还不涉及到MFC。

先在visual c++里新建一个win32的空工作空间,在里面在新建一个cpp文件。

因为是要形成窗口,里面很多函数都要调用到windows.h,因此首先就是:

#include <windows.h>

后续很多函数,比如RegisterClass,ShowWindow之类的估计都是从这里调用的,要是没有的话就会报错。

之后就是主函数:

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow
				   )

这个主函数和常见的main不同,是叫WinMain,前面还有WINAPI,估计都是在windows里定义好的。我目前的理解是:windows.c应该定义了main函数,然后又做了一个win main的接口,这样就把main封装起来。因此开发windows api就只要从winmain进入就可以了。猜的。

里面有四个参数,分别是当前实例,其他实例,命令行参数指针,执行标识。

比较有用的就是第一个,这个参数看起来不需要传入就能使用,我觉得实际上是main定义win main时候就已经定义好了,就是指当前实例。

那么,主函数里都有什么内容,完成什么功能呢?其实就是定义窗口并显示,同时完成消息循环,就完事了。

首先是定义窗口,通过定义窗口类来完成各个设定参数的引入:

	WNDCLASS wndclass;

	//窗口类定义
	wndclass.style = 0;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = "窗口哈哈";

这里面有一堆内容,其实就是给变量赋值。WNDCLASS是预定义好的一种类,这里先给定一个相应的对象叫wndclass,之后就对其属性进行赋值。

1)style:窗口类的样式,一般为0;

2)wndProc:指向窗口函数的指针;

3)cbclsextra:分配在窗口类结构后的字节数;

4)cbwndextra:分类的窗口实例后的字节数;

5)hinstance:实例句柄;

6)hicon:窗口类的图标;

7)hcursor:窗口类的光标;

8)hbrbackground:窗口类的背景刷;

9)lpszmenuname:窗口类的菜单资源名;

10)lpszclassname:窗口类名。

其实上面的代码,可知道窗口类名比较重要,需要自己给个定义。其他的利用windows函数就可以默认定义就行。

定义好窗口类后,就可以调用注册函数了:

RegisterClass(&wndclass);

之后就是创建窗口。该窗口还需要一个句柄,因此首先定义句柄,在调用创建函数:

HWND hwnd;	
hwnd = CreateWindow("窗口哈哈",
		"窗口实例标题",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);

这里要指定窗口类的名,估计用来对应窗口类,不然上面不是白定义了:实例句柄hinstance也得设置对应行)

之后就是显示窗口了:

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

这上面的参数都已经在前面提到过了。

主程序最后,就是消息循环,首先定义一个消息变量:

	MSG Message;

定义完后用whilw来实现循环:

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

循环内部的函数都没见过,估计是windows自定义的。

最后,就是返回值了:

	return Message.wParam;

主函数到此就结束了,但还有一个就是窗口类中的窗口函数还没定义,这个不是windows自带的,需要自己定义一下,和普通c语言一样,如果在win main函数里用到,那么在其前面就得定义。也可以直接把函数主体写在win main前面,就省去定义了。实际中,其实大部分都是写后面的,要不win main就挡的看不见了。

LRESULT CALLBACK WndProc(HWND hwnd,
						 UINT message,
						 WPARAM wParam,
						 LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}

这个函数也有四个参量,里面是一个选择语句switch,根据消息内容进行判断。

写完这些,helloworld程序也就差不多大功告成了,我们这里只用一个文件就实现全部代码内容,最后整合贴在这里:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd,
						 UINT message,
						 WPARAM wParam,
						 LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}


int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow
				   )
{
	HWND hwnd;
	MSG Message;
	WNDCLASS wndclass;

	//窗口类定义
	wndclass.style = 0;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = "窗口哈哈";

	RegisterClass(&wndclass);

	hwnd = CreateWindow("窗口哈哈",
		"窗口实例标题",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&Message,0,0,0))
	{
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

用vc6.0运行一下出来的结果:

就算是完成了。

本文是菜鸟写的,如有错误请不吝指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Intimes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值