一、1.控制台程序 //不需要完善的windows窗口,使用dos窗口方式显示
2.win32窗口程序 //通过窗口与程序之间进行交互
3.win32库程序(动态库DLL、静态库LIB) //提供已有的代码供其他程序使用
动态库:在执行的时候可以加载的程序
静态库:在编译连接时使用的程序
对比:(1)程序入口函数不同
控制台: main
win32窗口程序:WinMain
win32动态库DLL:DllMain
win32静态库Lib:无入口函数
(2)编译连接后存在形式不同
控制台和win32窗口程序:exe文件
动态库DLL:DLL文件,无法执行
静态库LIB:LIB文件,无法执行
(3)执行结果不同
控制台:使用DOS窗口显示结果,自己无窗口
Win32窗口程序:产生自己的窗口将结果输出或结束输入
动态库DLL:提供可执行的代码但自己无法执行,当exe文件执行时,可以使用此代码
静态库LIB:提供给程序在编译连接时使用,将库中代码嵌入到程序中。执行时不需要该库存在
二、Win32 程序和编译环境
1.编译器:CL.EXE //将源代码编译成目标代码.obj文件
2.连接器:Link.EXE //在VC98/bin下 //连接.obj和库函数,生成exe
3.资源编译器:rc.exe //在Common/MSDev98/bin目录下 //将资源脚本编译成可以连接的.res文件
4.库和头文件
头文件windows.h中包含了windows程勇的定义及其他一些头文件
windef.h 定义了各种数据类型
winbase.h 定义了kernel的相关函数
wingdi.h 定义了绘图和文字
winuser.h 窗口控件等函数
winnt.h 提供Unicode支持
库
kernel.lib 提供进程/线程/内存等API函数支持
user32.lib 包括窗口/界面等
gdi32.lib 提供绘图/文字等
5. Win32 窗口程序
L--long
P--pointer
C--const
STR--字符串
T-TCHAR - char
LPCTSTR ==>const char*
#include<windows.h>
int WINAPI WinMain( HINSTANCE hInstance, //应用程序的句柄,每个应用程序有一个句柄
HINSTANCE hPrevInstance, //该应用程序前一个实例句柄
LPSTR pszCmdLine, //命令行参数
int nShowCmd) //窗口显示方式
{
return 0;
}
//WINAPI 为函数调用方式 _stdcall
int MessageBox(
HWND hwnd, //窗口句柄
LPCTSTR lpText, //文本内容
LPCTSTR lpCaption, //消息框标题
UINT uType); //对话框按钮 //MB_OK..
6.利用cmd编译连接
用记事本编写.c函数
VC98\Bin下VCVARS32.BAT在cmd窗口中运行
切换到.c目录 lc xxx.c /c
link xxx.obj user32.lib
7.查看帮助CL -? LINK -?
CL常用选项
/c 只编译不连接
/TC 编译c文件
/TP 编译c++文件 //如果不指定,CL根据文件类型自动区分
/I 头文件所在路径(include)
CL编译器字符大小写敏感
LINK常用选项
/out:文件名 连接成制定文件名的程序
/LIBPATH:LIB 文件存放的路径
/SUBSYSTEM:CONDOLE/WINDOW 以何种方式编译
LINK连接器中字符大小写不敏感
三、真正的窗口程序//
1.入口函数WinMain
2.窗口处理函数
3.注册窗口类型
4.创建窗口
5.显示窗口
6.消息处理
///
2.窗口处理函数
static LRESULT CALLBACK WindowProc(
HWND hWnd, //窗口的句柄
UINT uMsg, //消息的ID号
WPARAM wParam, //消息对应的参数
LPARAM lParam ); //消息对应的参数
3.注册窗口WNDCLASS
typedef struct _WNDCLASS {
UINT style; //窗口类风格
WNDPROC lpfnWndProc; //窗口处理函数
int cbClsExtra; //窗口类附加数据大小
int cbWndExtra; //窗口附加数据大小
HANDLE hInstance; //当前应用程序的实例句柄
HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口光标
HBRUSH hbrBackground; //窗口背景画刷
LPCTSTR lpszMenuName; //菜单
LPCTSTR lpszClassName; //类型名称
} WNDCLASS ;
4.创建窗口 //返回值为一个窗口的句柄
HWND CreateWindow(
LPCTSTR lpClassName, // 注册的窗口类型名
LPCTSTR lpWindowName, // 窗口名称
DWORD dwStyle, // 窗口类型
int x, // 窗口左上角x坐标
int y, // 窗口左上角y坐标
int nWidth, // 窗口宽度
int nHeight, // 窗口高度
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 窗口菜单句柄
HINSTANCE hInstance, // 应用程序实例句柄
LPVOID lpParam // 创建的参数,一般为空
);
5.显示和更新窗口
BOOL ShowWindow(
HWND hWnd, //窗口句柄
int nCmdShow //显示的方式
);
BOOL UpdateWindow(
HWND hWnd //要刷新的窗口句柄
);
//防止被其他窗口覆盖
6.消息处理
GetMessage() //获取消息
DispatchMessage() //派发消息
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
LONG DispatchMessage(
const MSG *lpmsg
);
7.程序退出
窗口销毁时,退出程序,在WndProc中实现
WM_DESTROY //窗口销毁时调用WndProc传递给使用者
PostQuitMessage //发送一个退出消息
void PostQuitMessage(
int nExitCode );
详细实现:
#include<windows.h>
HINSTANCE g_hInst=NULL; //定义一个全局变量,存放程序句柄,初始化为空
//2 窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd, //窗口句柄
UINT nMsg, //消息ID
WPARAM wParam, //消息对应的参数
LPARAM lParam) //消息对应的参数
{
//程序退出
switch(nMsg) //判断消息ID
{
case WM_DESTROY: //窗口销毁信息
PostQuitMessage(0); //发送退出消息
break;
return 0;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
//3 注册窗口类型
BOOL MyRegister(LPSTR pszClassName)
{
//构造注册窗口的参数
WNDCLASS wc={0};
ATOM nAtom =0;
wc.style =CS_VREDRAW;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =g_hInst;
wc.hIcon =LoadIcon(g_hInst,MAKEINTRESOURCE(100));
wc.hCursor =NULL;
wc.hbrBackground =(HBRUSH)(COLOR_BTNFACE);
wc.lpszMenuName =NULL;
wc.lpszClassName =pszClassName;
//注册窗口
nAtom = RegisterClass( &wc );
/* if(0==nAtom)
{
MessageBox(NULL,"窗口注册失败","error",MB_OK|MB_ICONWARNING);
return FALSE;
}
else
{
MessageBox(NULL,"窗口注册成功","sucessed",MB_OK);
}
*/
return TRUE;
}
//4 窗口创建
HWND MyCreate(LPSTR pszClassName)
{
HWND hWnd=CreateWindow(
pszClassName,
"HelloWnd",
WS_OVERLAPPEDWINDOW,
400,
250,
500,
300,
NULL,
NULL,
g_hInst,
NULL);
/* if(hWnd==NULL)
{
MessageBox(NULL,"窗口创建失败","error",MB_OK);
return NULL;
}
else
{
MessageBox(NULL,"窗口成功创建","succeed",MB_OK);
return NULL;
}
*/
return hWnd;
}
//5 显示窗口
void DisplayWnd(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
//6 消息处理
void Message()
{
MSG msg={0};
//消息循环处理,获取消息
while ( GetMessage(&msg,NULL,0,0) )
{
//派发消息
DispatchMessage(&msg);
}
}
//1 入口函数
int WINAPI WinMain( HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR pszCmdLine,
int nShowCmd)
{
g_hInst=hInst; //全局变量g_hInst存放程序句柄
MyRegister("MyWnd"); //注册窗口类型
HWND hWnd=MyCreate("MyWnd"); //创建注册类型的窗口
DisplayWnd(hWnd); //显示窗口
Message(); //消息处理
return 0;
}
四 资源的处理
1.资源和资源脚本
资源:ICON/CUSRUR/BITMAP/MENU
资源脚本:扩展名为.rc的文件
2.编译资源
rc.exe编译资源,生成RES文件
3.链接资源
使用link.exe将RES文件链接到程序中
资源脚本编写
新疆.rc文件,打开文件,写入
资源编号 ICON "window.ico" //资源编号 资源类型 资源名
编译生成.res
连接程序与资源脚本 link xx.obj xx.res user32.lib
将obj与res文件放在同一路径下
ICON的使用--加载程序图标函数:LoadIcon(g_hInst,MAKEINTRESOURCE(ICON的ID号));