windows游戏编程大师技巧读书笔记(一)

本文详细介绍了Windows编程的基础知识,包括创建Windows窗体的过程:从创建窗口类到注册窗口类,再到创建窗口并处理消息循环。此外,还介绍了如何使用资源、处理事件及绘图等关键概念。

第一部分、windows编程基础

      1、一个windows窗体

     

#include<windows.h>

LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);//声明一个回调函数

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevintace ,LPSTR lpCmdLine ,int iCmdShow)  //WINmain 函数入口
{
    HWND hwnd;//窗口句柄
    MSG msg;//消息

    WNDCLASSEX wndclass;//窗口类

    //窗口类的初始化
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    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 = "Hellow word";

    if(!RegisterClassEx (&wndclass))//注册窗口
    {
        MessageBox(NULL,TEXT("启动失败"),TEXT("提示"),MB_ICONERROR);
        return 0;
    }
    //创建窗口
    hwnd = CreateWindowEx(NULL,
                            "Hellow word",
                            TEXT("HI"),
                            WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            NULL,
                            NULL,
                            hInstance,
                            NULL);

    ShowWindow (hwnd,iCmdShow);//显示
    UpdateWindow(hwnd);//刷新

    //消息循环
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);//翻译
        DispatchMessage(&msg);//发送给窗口过程
    }
    return msg.wParam;
}

//回调函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message ,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;//设备描述句柄
    PAINTSTRUCT ps;//窗口绘制客户区
    RECT rect;//矩形结构

    switch(message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hwnd,&ps);
        GetClientRect(hwnd,&rect);
        DrawText(hdc,TEXT("Hello,Windows 7!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hwnd,&ps);
    return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

现在给出了一个从书上学到的windows窗体的建立。

首先讲讲,windows的窗体建立的一个过程把.

1、创建一个windows类。

2、创建一个事件过程程序或WinProc

3、用Windows注册windows类

4、用前面创建的windows类创建一个窗口

5、创建一个能够从事处理程序获得向事件处理程序传递windows信息的主事件循环


首先是windows类:

typedef struct WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

cbSize:

WNDCLASSEX 的大小。我们可以用sizeof(WNDCLASSEX)来获得准确的值。

style:

从这个 窗口类派生的窗口具有的风格。您可以用“or”操作符来把几个风格或到一起。

lpfnWndProc:

窗口处理函数的指针。

cbClsExtra:

指定紧跟在 窗口类结构后的附加字节数。

cbWndExtra:

指定紧跟在窗口事例后的附加字节数。如果一个应用程序在资源中用CLASS 伪指令注册一个对话框类时,则必须把这个成员设成DLGWINDOWEXTRA。

hInstance:

本模块的事例句柄。

hIcon:

图标的句柄。

hCursor:

光标的句柄。

hbrBackground:

背景画刷的句柄。

lpszMenuName:

指向菜单的指针。

lpszClassName:

指向类名称的指针。

hIconSm:

窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。


2、创建一个事件过程程序或WinProc

声明一个回调函数

LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);
每个窗口会有一个称为窗口过程的 回调函数( WndProc),它带有四个参数。

hwnd 是一个窗口句柄

msg  这是一个实际的WinProc处理消息的标识符

wparam  lparam 是进一步分配或分类发送到msg参数的信息

LRESULT   CALLBACK 这些关键字是必须的。别忘记了


3、注册windows类

     RegisterClassEx()函数进行注册


4、创建窗口

用CreateWindowEx()函数去创建

函数原型:

HWND WINAPI CreateWindowEx(DWORD dwExStyle,

LPCTSTR IpClassName,

LPCTSTR lpWindowName,

DWORD dwStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HANDLE hInstance,

LPVOID lpParam);


dwExStyle:指定窗口的扩展风格。该参数可以是下列值:

WS_EX_ACCEPTFILES:指定以该风格创建的窗口接受一个拖拽文件。

WS_EX_APPWINDOW:当窗口可见时,将一个顶层窗口放置到任务条上。

WS_EX_CLIENTEDGE:指定窗口有一个带阴影的边界。

WS_EX_CONTEXTHELP:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到WM_HELP消息。子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。这个Help 应用程序显示一个包含子窗口帮助信息的弹出式窗口。

WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。

WS_EX_CONTROLPARENT:允许用户使用Tab键在窗口的子窗口间搜索。

WS_EX_DLGMODALFRAME:创建一个带双边的窗口;该窗口可以在dwStyle中指定WS_CAPTION风格来创建一个 标题栏

WS_EX_LEFT:窗口具有 左对齐属性,这是缺省设置的。

WS_EX_LEFTSCROLLBAR:如果外壳语言是如Hebrew,Arabic,或其他支持reading order alignment的语言,则标题条(如果存在)则在客户区的左部分。若是其他语言,在该风格被忽略并且不作为错误处理。

WS_EX_LTRREADING:窗口文本以LEFT到RIGHT(自左向右)属性的顺序显示。这是缺省设置的。

WS_EX_MDICHILD:创建一个MDI子窗口。

WS_EX_NOPATARENTNOTIFY:指明以这个风格创建的窗口在被创建和销毁时不向父窗口发送WM_PARENTNOTFY消息。

WS_EX_OVERLAPPEDWINDOW:WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的组合。

WS_EX_PALETTEWINDOW:WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST风格的组合WS_EX_RIGHT:窗口具有普通的 右对齐属性,这依赖于 窗口类。只有在外壳语言是如Hebrew,Arabic或其他支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志并且不作为错误处理。

WS_EX_RIGHTSCROLLBAR:垂直滚动条在窗口的右边界。这是缺省设置的。

WS_EX_RTLREADING:如果外壳语言是如Hebrew,Arabic,或其他支持读顺序对齐(reading order alignment)的语言,则窗口文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其他语言,在该风格被忽略并且不作为错误处理。

WS_EX_STATICEDGE:为不接受用户输入的项创建一个3一维边界风格

WS_EX_TOOLWINDOW:创建工具窗口,即窗口是一个游动的工具条。工具窗口的标题条比一般窗口的标题条短,并且窗口标题以小字体显示。工具窗口不在 任务栏里显示,
当用户按下alt+Tab键时工具窗口不在对话框里显示。如果工具窗口有一个 系统菜单,它的图标也不会显示在 标题栏里,但是,可以通过点击鼠标右键或Alt+Space来显示菜单。

WS_EX_TOPMOST:指明以该风格创建的窗口应放置在所有非最高层窗口的上面并且停留在其L,即使窗口未被激活。使用函数SetWindowPos来设置和移去这个风格。

WS_EX_TRANSPARENT:指定以这个风格创建的窗口在窗口下的同属窗口已重画时,该窗口才可以重画。
由于其下的同属富日已被重画,该窗口是透明的。

IpClassName:指向一个空结束的字符串或整型数atom。如果该参数是一个 整型量,它是由此前调用RegisterClass或RegisterClassEx函数返回的值。这个小于OxCOOO的16位数必须是IpClassName参数字的低16位,该参数的高位必须是O。

如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClassEx注册的类名,或是任何预定义的控制类名。请看说明部分的列表。

lpWindowName:指向一个指定窗口名的空结束的字符串 指针


5、事件处理过程:

这个没什么好讲的。



二、使用资源

1、使用编译器创建.RC文件

2、菜单

事件是:WM_COMMAND

              它的lparam 是发出消息的窗口句柄

              wparam 是选中菜单的ID

3、GDI

HDC  图形设备描述表

关于这个

BeginPaint()  与EndPaint() 是一对 的,已经将刷新信息包含在里面了

GetHdc() 与ReleaseDC() 一起

ValidateRect() 函数


4、键盘事件

通过,WM_CHAR 或 WM_KEYDOWN  WM_KEYUP  或者调用GetAsyncKeyState() 函数进行

WM_CHAR:

wparam 包含所按下键的ASCII

lparam 包含按下键的状态


WM_KEYDOWN  WM_KEYUP(松开始才发出):

wparam  虚拟键码

lparam  键状态矢量


5、鼠标 事件

WM_MOUSEMOVE


6、自行发送消息

SandMessage()  向窗口传递一个要求立即处理的消息,该函数紧接着WinProc()返回

PostMessage() 将消息传递到消息队列,而后直接返回。成功返回非0值

WN_USER  


三、控件、GDI

1、画笔、画刷

HPEN       画笔类型

创建画笔   CreatePen()函数

HBRUSH  画刷类型

创建画刷  CreateSolidBrush()函数


使用画笔或画刷的时候

调用  SelectObject()函数,必须有一个 图形设备描述表HDC

删除的时候用 DeleteObject()函数,讲某画笔填进去就好了



2、点

SetPixel()函数


3、线段

初始光标位置:

MoveToex()函数

画线段:

LineTo()函数


4、绘制矩形:

Rectangle()函数

FillRect()函数,绘制一个填充的矩形,包含左上角点,不包含右下角

FrameRect()函数,只是用画刷

Rectangle()函数,绘制一个实心填充的矩形


5、绘制圆

Ellipse()函数


6、多边形

Polygon()函数


2、定时器,计时器

首先创建一个计时器:

SetTimer()函数,窗口句柄,ID,毫秒

WM_TIMER 事件

其wparam 是某ID

当,定时器不用的时候,KillTimer()杀了他。放在关闭窗口哪里好了

GetTickCount()函数是获取开机到现在的时间


3、控件


4、获取信息

GetSystemInfo()功能特别强大


游戏过程:

#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#include <windows.h>   // include important windows stuff
#include <windowsx.h> 
#include <mmsystem.h>
#include <iostream> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h> 
#include <math.h>
#include <io.h>
#include <fcntl.h>

#define WINDOW_CLASS_NAME "WINCLASS1"
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

HWND      main_window_handle = NULL;
HINSTANCE hinstance_app      = NULL;
char buffer[80];

LRESULT CALLBACK WindowProc(HWND hwnd, 
						    UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
PAINTSTRUCT		ps;
HDC				hdc;
char buffer[80];

switch(msg)
	{	
	case WM_CREATE: 
        {
		return(0);
		} break;
   
	case WM_PAINT: 
		{
   	    hdc = BeginPaint(hwnd,&ps);	 

        EndPaint(hwnd,&ps);

		return(0);
   		} break;

	case WM_DESTROY: 
		{

		PostQuitMessage(0);

		return(0);
		} break;

	default:break;

    }

return (DefWindowProc(hwnd, msg, wparam, lparam));

}


int Game_Main(void *parms = NULL, int num_parms = 0)
{

if (KEYDOWN(VK_ESCAPE))
   SendMessage(main_window_handle,WM_CLOSE,0,0);
return(1);

} 

int Game_Init(void *parms = NULL, int num_parms = 0)
{

return(1);

}
int Game_Shutdown(void *parms = NULL, int num_parms = 0)
{

return(1);

}

int WINAPI WinMain(	HINSTANCE hinstance,
					HINSTANCE hprevinstance,
					LPSTR lpcmdline,
					int ncmdshow)
{

WNDCLASSEX winclass;
HWND	   hwnd;	
MSG		   msg;		
HDC        hdc;    


winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style			= CS_DBLCLKS | CS_OWNDC | 
                          CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc	= WindowProc;
winclass.cbClsExtra		= 0;
winclass.cbWndExtra		= 0;
winclass.hInstance		= hinstance;
winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor		= LoadCursor(NULL, IDC_ARROW); 
winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName	= NULL;
winclass.lpszClassName	= WINDOW_CLASS_NAME;
winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

hinstance_app = hinstance;

if (!RegisterClassEx(&winclass))
	return(0);

if (!(hwnd = CreateWindowEx(NULL,
                            WINDOW_CLASS_NAME,
						    "T3D Game Console Version 1.0", 
						    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
					 	    0,0,	
						    400,300, 
						    NULL,	 
						    NULL,	
						    hinstance,
						    NULL)))
return(0);

main_window_handle = hwnd;

Game_Init();

while(TRUE)
	{
	if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
	   {
       if (msg.message == WM_QUIT)
           break;
	   TranslateMessage(&msg);
	   DispatchMessage(&msg);
	   } 
       Game_Main();
	}
Game_Shutdown();
return(msg.wParam);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值