您的位置:首页 > 其它

window console窗口创建绘图程序(小游戏)的一般过程

2013-05-03 17:59 405 查看
console也是窗体,自然也可以在其中画图,但是console窗体与windows窗体又有不同,主要如下:

1 console窗体是由window内部产生的,很多细节并没有暴露给用户,所以有很多事用户干不了,比如自己没办法指定回调函数,这就意味着无法改变默认的消息处理方式。

2 console窗体中有个富文本编辑框(?)

3 windows窗体中画图主要是通过WM_PAINT消息实现的,但是console中由于没法修改回调函数,因此无法操作WM_PAINT消息,绘图只能手工绘制,同时刷新时也需要自己写刷新语句。在console中要实现定时刷新可以通过SetTimer()+InvalidateRect() 来实现。通过观察发现,使用此方法会出现,显示的内容一闪而过,并不能停留。(解决方法从下面程序中说明)

动态绘制图像(游戏)的一般步骤:(利用定时器)

1,设置console样式

2,创建定时器,并分发定时器产生的消息

3,实现定时器指定的回调函数,实现不断绘制

tip:在实现重绘时,由于不能通过WM_PAINT实现,可通过invalidaterect函数擦除console窗体上的图像,然后重新绘制

#include <conio.h>
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include <winuser.h>
#include <time.h>
using namespace std;

#define IDT_1 1
WINBASEAPI HWND WINAPI GetConsoleWindow ();

HWND hWnd=GetConsoleWindow();

//3处理定时器指定的回调函数
void  CALLBACK myTimerProc(HWND hwnd,UINT msg,UINT_PTR idEvent,DWORD dwTime)
{
//此函数的主要作用是清屏同时重绘,用到sleep(30)的原因是,当使用invalidaterect时,屏幕被清除了,同时给console窗口传递了一个wm_paint消息,此消息执行默认操作
//即什么也不画,如果此时直接运行下面的绘图语句绘图,由于console窗体是由一个ui线程控制的(不同于此main线程),其可能会延迟一段时间执行,而如果不采用sleep方
//法,下面的绘图操作可能早于wm_paint的响应,导致先画完了然后wm_paint响应了(画空,相当于把窗口又清除了),会出现闪烁的现象。

RECT r={0,0,79,24};
InvalidateRect(hwnd,&r,TRUE);//清除屏幕,同时发送wm_paint消息(什么也不画)
Sleep(30);//等待30ms让ui线程先完成wm_paint的响应

//绘图语句
srand((unsigned) time(NULL));
int j=rand()%30;
HDC hDc=GetDC(hWnd);
for(int i=j;i<1000;i+=20)
{
Rectangle(hDc,i,i,i+10,i+10);
}
ReleaseDC(hWnd,hDc);
}

void main(int argc,char *argv[])
{

//1  修改console的样式

//删除右侧的滚动条
HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwSize = {80, 26};
::SetConsoleScreenBufferSize(hConsole, dwSize);
SMALL_RECT rc = {0, 0, 79, 25};
::SetConsoleWindowInfo(hConsole, TRUE, &rc);
SetConsoleTitle("run the snake");
//设置背景色和前景色
system("color 3d");

//2  设置定时器,并分发定时器产生的WM_TIMER消息。
int ii=SetTimer(0,IDT_1,800,(TIMERPROC)myTimerProc);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_TIMER)
DispatchMessage(&msg);
}

KillTimer(hWnd,ii);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: