由于要开发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运行一下出来的结果:
就算是完成了。
本文是菜鸟写的,如有错误请不吝指正!