/***************
关于windows的窗口与消息
窗口与消息.cpp : 定义应用程序的入口点。
理解---窗口
窗口依据窗口类来创建,窗口类表示用来处理传递给窗口的消息的窗口过程
windows程序步骤固定:定义窗口--->注册窗口--->创造窗口---->显示更新窗口--->消息循环
关于定义窗口:
window封装好了一种数据结构来定义窗口,这就是WNDCLASS,在MSDN里面可以看到这种数据结构
typedef struct _WNDCLASS {
UINT style; 窗口风格
WNDPROC lpfnWndProc; 窗口过程函数
int cbClsExtra; 额外class
int cbWndExtra; 额外窗口
HINSTANCE hInstance; 实例句柄
HICON hIcon; 图标
HCURSOR hCursor; 光标
HBRUSH hbrBackground; 背景
LPCTSTR lpszMenuName; 菜单名
LPCTSTR lpszClassName; 窗口类名
} WNDCLASS, *PWNDCLASS;
在定义窗口时,可以根据自己的喜好或者默认值进行设定
注册窗口:
调用Window的API函数RegisterClass,在这儿,如果注册不成功就弹出一个消息
关于MessageBox---弹出消息
int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
创建窗口:
调用window的API CreateWindow()
显示和更新窗口:
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
消息循环:
while (GetMessage(&msg, NULL, 0, 0))//获取消息
{
TranslateMessage(&msg);//翻译键盘消息
DispatchMessage(&msg);//将消息发送给窗口过程
}
关于几个句柄
hinstance 实例句柄
hdc 设备环境句柄
hwnd 窗口句柄
关于头文件的说明
PlaySound(),需要头文件和动态链接库
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
****************/
#include "stdafx.h"
#include "窗口与消息.h"
#include<windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
static TCHAR szAppName[]=TEXT("HelloWindows");
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("注册失败"),szAppName,MB_OKCANCEL);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("Hello Window"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
// 执行应用程序初始化:
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))//在这儿有一个消息队列
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_CREATE:
PlaySound(TEXT("tianzhang.wav"),NULL,SND_FILENAME|SND_ASYNC);//播放声音文件
MessageBox(NULL,TEXT("创建了一个窗口"),szAppName,MB_OK);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);//窗口绘制的开始
// TODO: 在此添加任意绘图代码...
GetClientRect(hwnd,&rect);//获取窗口客户区的尺寸
DrawText(hdc,TEXT("hello windows"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);//显示一个文本字符串
EndPaint(hwnd, &ps);//窗口绘制的结束
break;
case WM_DESTROY:
PostQuitMessage(0);//将退出消息加入消息队列
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);//默认消息处理
}
return 0;
}