VisualC++6.0使⽤教程
Visual C++它⼤概可以分成三个主要的部分:
3. Platform SDK。这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。⼤致说来,Platform SDK是以Microsoft C/C++编译器为核⼼(不是Visual C++,看清楚了),配合MASM,辅以其他⼀些⼯具和⽂档资料。上⾯说到Developer Studio没有编译程序的功能,那么这项⼯作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令⾏程序,这些我们看不到的程序才是构成Visual Studio的基⽯。
2. MFC。从理论上来讲,MFC也不是专⽤于Visual C++,Borland C++,C++Builder和Symantec C++同样可以处理MFC。同时,⽤Visual C++编写代码也并不意味着⼀定要⽤MFC,只要愿意,⽤Visual C++来编写SDK程序,或者使⽤STL,ATL,⼀样没有限制。不
过,Visual C++本来就是为MFC打造的,Visual C++中的许多特征和语⾔扩展也是为MFC⽽设计的,所以⽤Visual C++⽽不⽤MFC就等于抛弃了Visual C++中很⼤的⼀部分功能。但是,Visual C++也不等于MFC。
1. Developer Studio,这是⼀个集成开发环境,我们⽇常⼯作的99%都是在它上⾯完成的,再加上它的标题赫然写着“Microsoft Visual
C++”,所以很多⼈理所当然的认为,那就是Visual C++了。其实不然,虽然Developer Studio提供了⼀个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些⼯作的幕后英雄后⾯会介绍。我们也知道,Developer Studio并不是专门⽤于VC的,它也同样⽤于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C++,它充其量只是Visual
C++的⼀个壳⼦⽽已。这⼀点请切记!
Visual C++6.0不仅是⼀个C++ 编译器,⽽且是⼀个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发⼯具。这些组件通过⼀个名为Developer Studio的组件集成为和谐的开发环境。
Visual C++ 6.0,简称VC或者VC6.0,是微软推出的⼀款C++编译器,将“⾼级语⾔”翻译为“机器语⾔(低级语⾔)”的程序。Visual C++是⼀个功能强⼤的可视化软件开发⼯具。⾃1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进⾏软件开发的⾸选⼯具。虽然微软公司推出了 Visual C++.NET(Visual C++7.0),但它的应⽤的很⼤的局限性,只适⽤于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
1.使⽤VC++6.0编译C语⾔⽂件(.c)
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello World!");
getch();
return0;
}
2.使⽤VC++6.0创建MFC对话框程序
3.使⽤API创建Win32窗⼝简单讲解
int APIENTRY WinMain(HINSTANCE hInstance, // 本模块的实例句柄
HINSTANCE hPrevInstance, // Win16 留下的废物,现在已经不⽤了
LPSTR lpCmdLine, // 命令⾏参数
int nCmdShow) // 主窗⼝初始化时的显⽰⽅式
{ // 下⾯这⾏代码是我添加的,⽤于弹出⼀个⼩对话框
::MessageBox(NULL, "Hello, Win32 Application", "04Win32AppDemo", MB_OK);
return 0;
}
APIENTRY是__stdcall的宏定义,说明 WinMain 函数采⽤的是 Windows 标准调⽤⽅式。
hInstance 指定了当前模块的实例句柄。其实在 Win32 下,模块的实例句柄和模块句
柄是⼀样的,只是说法不同,所以可以通过以下语句获得当前可执⾏模块的实例句柄。
hInstance = ( HINSTANCE )GetModuleHandle(NULL); // 取得应⽤程序的实例句柄(即模块句柄)GetModuleHandle 函数的惟⼀参数是模块的名称,函数会返回这个模块的句柄。模块句柄
的值就是该模块在内存中的⾸地址。如果为 GetModuleHandle 传递 NULL 的话,函数返回的
是可执⾏⽂件所在模块的模块句柄,⽽不管是在哪个模块中做这个调⽤的。
lpCmdLine 是命令⾏参数。其值由 CreateProcess 函数的第⼆个参数指定。通常应⽤程
序在初始化时检查这个参数,以决定是否打开特定⽂档。
nCmdShow 指定了窗⼝初始化时的显⽰⽅式。这个值也是由 CreateProcess 函数传递
的。⼀般以这个值为参数调⽤ ShowWindow 就可以了,此函数⽤于设置窗⼝的显⽰状态,LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); CALLBACK 宏是__stdcall 的意思,说明采⽤ Windows 标准⽅式传递参数。hWnd 参数标
识了消息到达的窗⼝;uMsg 参数是⼀个被命名的常量(消息 ID 号),它指定了所发的消息,
当窗⼝函数接受到消息时,它使⽤消息 ID 号来决定如何处理这个消息;wParam 和 lParam 是
消息的两个参数,其值取决于 uMsg。
// 窗⼝函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{ char szClassName[] = "MainWClass";
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.hCursor = ::LoadCursor(NULL, IDC_ARROW); // 使⽤预定义的光标
wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH); // 使⽤⽩⾊背景画刷
wndclass.lpszMenuName = NULL; // 不指定菜单
wndclass.lpszClassName = szClassName ; // 窗⼝类的名称
wndclass.hIconSm = NULL; // 没有类的⼩图标
// 注册这个窗⼝类
::RegisterClassEx(&wndclass);
/
/ 创建主窗⼝
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,扩展样式
szClassName, // lpClassName,类名
"My first Window!", // lpWindowName,标题
WS_OVERLAPPEDWINDOW, // dwStyle,窗⼝风格
CW_USEDEFAULT, // X,初始 X 坐标
CW_USEDEFAULT, // Y,初始 Y 坐标
CW_USEDEFAULT, // nWidth,宽度
CW_USEDEFAULT, // nHeight,⾼度
NULL, // hWndParent,⽗窗⼝句柄
NULL, // hMenu,菜单句柄
hInstance, // hlnstance,程序实例句柄
NULL) ; // lpParam,⽤户数据
if(hwnd == NULL)
{ ::MessageBox(NULL, "创建窗⼝出错!", "error", MB_OK);
return -1;
}
// 显⽰窗⼝,刷新窗⼝客户区
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
// 从消息队列中取出消息,交给窗⼝函数处理,直到 GetMessage 返回 FALSE,结束消息循环
MSG msg;
while(::GetMessage(&msg, NULL, 0, 0))
{ // 转化键盘消息
::TranslateMessage(&msg);
// 将消息发送到相应的窗⼝函数
::DispatchMessage(&msg);
}
// 当 GetMessage 返回 FALSE 时程序结束
return msg.wParam;
}
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char szText[] = "最简单的窗⼝程序!";
switch (message)
{
case WM_PAINT: // 窗⼝客户区需要重画
{ HDC hdc;
PAINTSTRUCT ps;
// 使⽆效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hwnd, &ps) ;
// 显⽰⽂字
::TextOut(hdc, 10, 10, szText, strlen(szText));
::EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY: // 正在销毁窗⼝
// 向消息队列投递⼀个 WM_QUIT 消息,促使 GetMessage 函数返回 0,结束消息循环
::PostQuitMessage(0) ;
return 0 ;
}
// 将我们不处理的消息交给系统做默认处理
return ::DefWindowProc(hwnd, message, wParam, lParam);
createprocessa}
分析以上程序,可以得出在桌⾯上显⽰⼀个窗⼝的具体步骤,这就是主程序的结构流程。
(1)注册窗⼝类(RegisterClassEx)
(2)创建窗⼝(CreateWindowEx)
(3)在桌⾯显⽰窗⼝(ShowWindow)
(4)更新窗⼝客户区(UpdateWindow)
(5)进⼊⽆限的消息获取和处理的循环。⾸先是获取消息(GetMessage),如果有消息到
达,则将消息分派到回调函数处理(DispatchMessage),如果消息是 WM_QUIT,则 GetMessage
函数返回 FALSE,整个消息循环结束。消息具体的处理过程是在 MainWndProc 函数中进⾏的。
1.注册窗⼝类
typedef struct _WNDCLASSEX {
UINT cbSize; // WNDCLASSEX 结构的⼤⼩
UINT style; // 从这个窗⼝类派⽣的窗⼝具有的风格
WNDPROC lpfnWndProc; // 即 window procedure, 窗⼝消息处理函数指针
int cbClsExtra; // 指定紧跟在窗⼝类结构后的附加字节数
int cbWndExtra; // 指定紧跟在窗⼝事例后的附加字节数
HANDLE hInstance; // 本模块的实例句柄
HICON hIcon; // 窗⼝左上⾓图标的句柄
HCURSOR hCursor; // 光标的句柄
HBRUSH hbrBackground; // 背景画刷的句柄
LPCTSTR lpszMenuName; // 菜单名
LPCTSTR lpszClassName; // 该窗⼝类的名称
HICON hIconSm; // ⼩图标句柄
} WNDCLASSEX;
2.创建窗⼝
HWND hwnd = ::CreateWindowEx(
0, // dwExStyle,扩展样式
szClassName, // lpClassName,类名
"My first Window!", // lpWindowName,标题
WS_OVERLAPPEDWINDOW, // dwStyle,窗⼝风格
CW_USEDEFAULT, // X,初始 X 坐标
CW_USEDEFAULT, // Y,初始 Y 坐标
CW_USEDEFAULT, // nWidth,宽度
CW_USEDEFAULT, // nHeight,⾼度
NULL, // hWndParent,⽗窗⼝句柄
NULL, // hMenu,菜单句柄
hInstance, // hlnstance,程序实例句柄
NULL) ; // lpParam,⽤户数据
下⾯列出了⼀些常见风格的定义,它们是以 WS(Windows Style 的缩写)为前缀的预定
义的值:
WS_BORDER 创建⼀个单边框的窗⼝
WS_CAPTION 创建⼀个有标题框的窗⼝(包括 WS_BODER 风格)
WS_CHIlD 创建⼀个⼦窗⼝。这个风格不能与 WS_POPVP 风格合⽤
WS_DISABLED 创建⼀个初始状态为禁⽌的⼦窗⼝。⼀个禁⽌状态的窗⽇不能接受来⾃⽤户的输⼈信息
WS_DLGFRAME 创建⼀个带对话框边框风格的窗⼝。这种风格的窗⼝不能带标题条
WS_HSCROLL 创建⼀个有⽔平滚动条的窗⼝
WS_VSCROLL 创建⼀个有垂直滚动条的窗⼝
WS_ICONIC 创建⼀个初始状态为最⼩化状态的窗⼝。与 WS_MINIMIZE 风格相同
WS_MAXIMIZE 创建⼀个具有最⼤化按钮的窗⼝。该风格不能和 WS_EX_CONTEXTHELP 风格同时出现,同时必须指定 WS_SYSMENU 风格
WS_OVERLAPPED 产⽣⼀个层叠的窗⼝。⼀个层叠的窗⼝有⼀个标题条和⼀个边框。与
WS_TILED 风格相同
WS_OVERLAPPEDWINDOW 创建⼀个具有 WS_OVERLAPPED,WS_CAPTION,
WS_SYSMENU ,WS_THICKFRAME,WS_MINIMIZEBOX,
WS_MAXMIZEBOX 风格的层叠窗⼝
WS_POPUP 创建⼀个弹出式窗⼝。该风格不能与 WS_CHLD 风格同时使⽤
WS_POPUPWINDOW 创建⼀个具有 WS_BORDER,WS_POPUP,WS_SYSMENU 风格的窗⼝,WS_CAPTION 和 WS_POPUPWINDOW 必须同时设定才能
使窗⼝某单可见
WS_SIZEBOX 创建⼀个可调边框的窗⼝,与 WS_THICKFRAME 风格相同
WS_SYSMENU 创建⼀个在标题条上带有窗⼝菜单的窗⼝,必须同时设定
WS_CAPTION 风格
WS_THICKFRAME 创建⼀个具有可调边框的窗⼝,与 WS_SIZEBOX 风格相同
WS_VISIBLE 创建⼀个初始状态为可见的窗⼝
typedef struct tagMSG {
HWND hwnd; // 消息要发向的窗⼝句柄
UINT message; // 消息标识符,以 WM_ 开头的预定义值(意为 Window Message) WPARAM wParam; // 消息的参数之⼀
LPARAM lParam; // 消息的参数之⼆
DWORD time; // 消息放⼊消息队列的时间
POINT pt; // 这是⼀个 POINT 数据结构,表⽰消息放⼊消息队列时的⿏标位置
} MSG, *PMSG ;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论