- 注册时间
- 2010-8-9
- 最后登录
- 2024-2-7
- 在线时间
- 316 小时
终身VIP会员
- 魔鬼币
- 78151
|
楼主 |
发表于 2010-10-8 11:57:23
|
显示全部楼层
本帖最后由 onlycast 于 2010-10-8 12:07 编辑
知道这两个函数后我们还需要知道一个类那就是WNDCLASS 其参数如下:
typedef struct _WNDCLASS {
UINT style; 类的样式!可以参考MSDN
WNDPROC lpfnWndProc; 窗口过程函数
int cbClsExtra; 类的额外空间
int cbWndExtra; 窗口的额外空间
HINSTANCE hInstance; 应用程序实例号
HICON hIcon; 图标样式
HCURSOR hCursor; 光标样式
HBRUSH hbrBackground; 用户区的背景颜色
LPCTSTR lpszMenuName; 菜单名
LPCTSTR lpszClassName; 类名
知道这三个以后我们就可以来创建一个窗口了
第一步我们打开VC++6 file菜单下的new选择win32 application 起个名 建一个空的工程 然后再从file 菜单下选择C++ sourec file
要先写winmain函数在里面来完成相应的功能 我们要用到windows的函数和C的函数所以先在开头引用两个头文件
#include <windows.h>
#include <stdio.h>
//定义一个全局的窗口句柄
HWND hwnd;
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
//开始写主函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
//定义一个类的名字的静态变量
static TCHAR szAppName[]=TEXT("HelloWin");
//定义一个消息标识ID变量
MSG msg;
//定义一个WNDCLASS的类
WNDCLASS wndclass;
//指定类的类型,这里是当窗口发生改变时重画
wndclass.style=CS_HREDRAW | CS_VREDRAW;
//窗口过程函数
wndclass.lpfnWndProc=WindowProc;
//类的额外空间
wndclass.cbClsExtra=0;
//窗口的额外空间
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance; //应用程序实例号
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_APPSTARTING);
//获取一个图像对像来设定背景色
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
//菜单名
wndclass.lpszMenuName=NULL;
//类名 在上面我们定义的szAppName
wndclass.lpszClassName=szAppName;
//接着我们要注册这个类
//为了程序的稳定加入一个判断
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This Program requires windows NT!"),szAppName,MB_ICONERROR);
return 0;
}
//接着开始创建窗口 CreateWindow会返回一个应用程序的实例句柄
hwnd=CreateWindow(szAppName,TEXT("The Hello program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
//创建完成后我们要把窗口显示出来
ShowWindow(hwnd,SW_SHOWNORMAL);
//接着更新窗口
UpdateWindow(hwnd);
//建立消息循环
while (GetMessage(&msg,NULL,0,0))
{
//转换键盘消息;
TranslateMessage(&msg);
//将消息发送给窗口过程
DispatchMessage(&msg);
}
return msg.wParam;
}
//对我们的窗口做一些处理这时就要用到窗口过程函数WindowProc 因为winmian函数要调用它,所以我们要在程序的最上面来声明它
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hdc; //设备描述表句柄
PAINTSTRUCT ps; //一个绘图结构
RECT rect; //矩形
//建一个分支结构来处理一些消息
switch(uMsg)
{
//窗口过程函数接到第一个消息就是创建消息我们让它在创建的时候播放一点音乐格式为wav的
//PlaySound第一个参数为音乐文件名或一个资源,第二个参数指定只有当第一个参数为资源时才能使用所以设为NULL
//第三个参数指定一些选项这里指定为异步方式。好处在这不用等待它完成就返回!
case WM_CREATE:
PlaySound(TEXT("stage_clear.wav"),NULL,SND_FILENAME |SND_ASYNC);
return 0;
//当窗口的客户区的一部分或者全部变为无效,但又必须刷新,那么将由这个消息通知程序
//比如窗口创建之初
case WM_PAINT:
//开始窗口绘制
hdc=BeginPaint(hwnd,&ps);
//获取窗口客户区尺寸
GetClientRect(hwnd,&rect);
//显示文本串
//第一个参数是BeginPaint返回的设备描述表句柄,第二个参数是要输出的文本,第三个参数为-1,指示文本串是以字节0结尾
//第四个参数指定了一个矩形,最后一个参数指示了文本必须显示在一行上,而水平和垂直方向都位于第4个参数的中央
DrawText(hdc,TEXT("Hello windows xp!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//结束窗口绘制
EndPaint(hwnd,&ps);
return 0;
//当窗口被关闭之前会收到一个销毁窗口的消息此时会收到一条WM_QUIT的消息而WM_QUIT会返回一个0,这样就会导致winmian退出消息循环并终止程序
case WM_DESTROY:
//在消息队列中插入一条退出消息
PostQuitMessage(0);
return 0;
}
//执行默认的消息处理
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
这个程序至少调用了18个windows的函数:
LoadIcon 加载图标样式供程序使用
LoadCursor 加载鼠标指针样式供程序使用
GetStockObject 获取一个图形对象
RegisterClass 注册一个窗口类
MessageBox 显示一个消息框
CreateWindow 根据我们定义的窗口类来创建一个窗口
ShowWindow 在屏幕上显示窗口
UpdateWindow 指示窗口刷新自己本身
GetMessage 从消息队列中获取消息
TranslateMessage 转换某些键盘消息
DispatchMessage 将消息发送给窗口过程
PlaySound 播放一个声音文件
BeginPaint 开始窗口绘制
GetClientRect 获取窗口客户区的大小
DrawText 显示文本串
EndPaint 结束窗口绘制
PostQuitMessage 在消息队列中插入一条“退出”消息
DefWindowProc 执行默认的消息处理
在这里因为PlaySound函数在C++的默认库中没有所以我们要导入一个这个库
选中project 选中set 然后选中link
在object/library里加入一条 winmm.lib 然后确定 |
|